Greasemonkey弹出循环未等待加载事件侦听器



我正在编写一个Greasemonkey脚本,根据我在搜索框中输入的单词自动从网站中删除我的通知。

删除";按钮";基本上是一个链接,所以我试图在一个新的选项卡中打开第一个链接。然后,在它加载足够多后,在同一个选项卡中逐个打开其余的链接。

我想好了如何获得我需要的链接,以及如何循环和操作它们。我能够获取第一个删除链接,并在一个新的选项卡中打开它。我添加了一个事件侦听器,以确保在转到下一个链接之前加载了页面
我终于做到了,所以添加了我的搜索框和按钮。然后,我不得不想办法再次将整个事件封装在事件监听器中。

所以,除了最后一个链接加载之外,我现在已经完成了整个工作
所有链接都指向我的waitFor函数,所以它们应该打开,所以事件侦听器似乎不工作,所以它通过循环的速度太快,只加载最后一个链接。

如何使此脚本在上一个加载的页面完全加载之前不继续循环

除了框和按钮创建之外的完整代码:

var mytable = document.getElementById ('content').getElementsByTagName ('table')[0]
var myrows = mytable.rows
//function openLinkInTab () {
//mywin2.close ();
//}
var mywin2;
mywin2 = window.open ("http://www.aywas.com/message/notices/test/", "my_win2");
var links;
var waitFor = function (i) {
    links = myrows[i].cells[1].getElementsByTagName ("a");
    mywin2 = window.open (links[0].href, "my_win2");
}
var delnotifs = function () {
    var matching;
    var toRemove;
    toRemove = document.getElementById ('find').value;
    alert (toRemove)
    for (i = 0; i < 10; i++) {
        matching = myrows[i].cells[0].innerHTML;
        if (matching.indexOf (toRemove) > 0) {
            mywin2.addEventListener ('load', waitFor (i), false);
        }
    }
}
searchButton.addEventListener ('click', delnotifs, true);

那么,它为什么不等待`mywin2.addEventListener('load',waitFor(i),false);`?我有一种感觉,我在这里错过了一些非常简单的东西,但我就是看不见。

我也尝试了mywin2.addEventListener('load', function(){waitFor(i)}, false);,它仍然做同样的事情,所以它不是一个调用而不是指针的问题。

mywin2.addEventListener('load', waitFor(i), false);替换为if (mywin2.document.readyState === "complete") { waitFor(i)}也不起作用。

当我在做的时候…每次我看到代码在这样的列表中循环时,它都会使用

for(i=1;i < myrows.length;i++)

它跳过了列表中的第一个链接,因为数组从零开始。所以我的问题是,如果我将'i'切换为零,并且循环只在'i'< length时进行,这不意味着它不会遍历整个列表吗?不应该是吗

for(i=0;i != myrows.length;i++)  

使用window.open打开弹出窗口(或选项卡)时,load事件只触发一次——即使您使用相同的窗口句柄"打开"了一个新的URL。

要使load侦听器每次都启动,必须关闭每个URL后的窗口,并为下一个URL打开一个新窗口。

因为弹出窗口是异步的,并且您希望按顺序加载这些链接,所以不要为此使用for()循环。使用弹出的load状态"链接"链接。

这是执行此操作的代码。它将链接推送到一个数组中,然后使用load事件获取并打开下一个链接您可以在jsFiddle上看到正在运行的代码

var searchButton    = document.getElementById ('gmPopUpBtn');
var mytable         = document.getElementById ('content').getElementsByTagName ('table')[0];
var myrows          = mytable.rows;
var linksToOpen     = [];
var mywin2          = null;
function delnotifs () {
    var toRemove    = document.getElementById ('find').value;
    for (var J = 0, L = myrows.length;  J < L;  J++) {
        var matching = myrows[J].cells[0].innerHTML;
        if (matching.indexOf (toRemove) > 0) {
            var links = myrows[J].cells[1].getElementsByTagName ("a");
            linksToOpen.push (links[0].href); //-- Add URL to list
        }
    }
    openLinksInSequence ();
};
function openLinksInSequence () {
    if (mywin2) {
        mywin2.close ();
        mywin2      = null;
    }
    if (linksToOpen.length) {
        var link    = linksToOpen.shift ();
        mywin2      = window.open (link, "my_win2");
        mywin2.addEventListener ('load', openLinksInSequence, false);
    }
}
searchButton.addEventListener ('click', delnotifs, true);

请参阅https://developer.mozilla.org/en-US/docs/Web/API/EventTarget.addEventListener.addEventLister函数的第二个参数必须是指向函数的指针,而不是调用。

最新更新