为什么waitForKeyElements()只会在以后的更改中触发一次?

时间:2016-02-25 06:33:29

标签: javascript greasemonkey userscripts tampermonkey

多年来,我一直使用waitForKeyElements()函数来跟踪用户脚本中网页的变化。但是,有时我发现它没有像预期的那样触发并且已经解决了。我遇到了这个问题的另一个例子,现在我想弄清楚问题是什么。以下是我可以创建的最简单的例子。

给出一个简单的HTML页面,如下所示:

<span class="e1">blah</span>

还有一些Javascript:

// function defined here https://gist.github.com/BrockA/2625891
waitForKeyElements('.e1', handle_e1, false);

function handle_e1(node) {
    console.log(node.text());
    alert(node.text());
}

setInterval(function() {
    $('.e1').text("updated: "+Math.random());
}, 5000);

我希望此代码每5秒触发alert()console.log()。但是,它只触发一次。有什么想法吗?

这是a codepen that demonstrates this

1 个答案:

答案 0 :(得分:1)

根据设计和默认情况,waitForKeyElements只处理一个节点一次。要告诉它继续检查,从回调函数返回true
您还需要比较字符串(或其他)以查看它是否已更改。

因此,在这种情况下,handle_e1()将类似于:

function handle_e1 (jNode) {
    var newTxt  = jNode.text ();
    if (typeof this.lastTxt === "undefined"  ||  this.lastTxt !== newTxt) {
        console.log (newTxt);
        this.lastTxt = newTxt;
    }
    return true;    // Allow repeat firings for this node.
}

但是,通过常量字符串比较,如果在一个页面上有很多这样的情况,性能可能会成为问题。在这种情况下,切换到MutationObserver方法可能是最好的。