Greasemonkey弹出循环不等待加载事件监听器

时间:2013-07-19 19:49:42

标签: javascript loops javascript-events popup 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”为&lt;长度,这是不是意味着它不会通过整个列表?不应该是

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

谢谢!

2 个答案:

答案 0 :(得分:1)

当您使用window.open打开弹出窗口(或标签页)时,load事件只会触发一次 - 即使您“打开”具有相同窗口句柄的新网址。

要每次都启动load侦听器,您必须在每个URL之后关闭窗口,然后为下一个URL打开一个新窗口。

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

这是执行此操作的代码。它将链接推送到数组,然后使用load事件来抓取并打开下一个链接。 You can see the code in action at 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);

答案 1 :(得分:0)

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