javascript - 为什么 waitForKeyElements() 尽管后来发生了变化,但只触发一次?

标签 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

最佳答案

根据设计和默认情况,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 方法可能是最好的选择。

关于javascript - 为什么 waitForKeyElements() 尽管后来发生了变化,但只触发一次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35620018/

相关文章:

javascript - TypeError : this. state.student.map 不是一个函数

javascript - 如何在不发送太多请求的情况下通过前端在每次鼠标单击时更新我的​​数据库?

javascript - 自动创建按钮并将它们制作成 Accordion

javascript - 如何根据链接标题属性的不同措辞更改链接的文本?

javascript - Userscript - 有没有办法将 jquery 代码注入(inject)到 angularjs dom 中?

javascript - 带有 Highcharts 的实时数据

javascript - 是否可以在不通过API进行身份验证的情况下检索YouTube视频的描述?

javascript - 编写跨浏览器 Greasemonkey 用户脚本的任何技巧?

javascript - Greasemonkey/Tampermonkey @match 带参数的页面

javascript - 使用按键触发警报