【问题标题】:Is it efficient to scan the page for a keyword every second?每秒扫描页面以查找关键字是否有效?
【发布时间】:2017-08-28 04:56:27
【问题描述】:

所以我正在为自己和几个朋友编写个人用户脚本。用户脚本用于阻止页面上的关键字。

在我使用的页面上搜索关键字:

var filter = ["worda", "wordb", "wordc"];
var found = false;

var check =
    function () {
        //Stores the content of the head and body in the document.
        var head = $("head").html();
        var body = $("body").html();


        $.each(filter, function(index, item) {
            if ((head + body).toString().toLowerCase().contains(item.toLowerCase()))  {
                window.clearInterval(interval);
                console.log("Found: " + item);
                found = true;
                return false;
            }
        });

        if (found) {
            $("body").hide();
            var originalTitle = $(document).prop("title");
            $(document).prop("title", "Blocked");

            window.setTimeout(function() {
                if (confirm("This page contains a blocked keyword, are you sure you'd like to continue?")) {
                    $(document).prop("title", originalTitle);
                    $("body").show();
                    return;
                }
            }, 1);
        }
    };

然后我将它设置为每秒重复一次:

var interval = window.setInterval(check, 1000);

我每秒重新检查页面的原因是因为新内容可能是通过 Javascript 动态创建的,我需要确保它也被过滤。

但是,我想知道这是否是扫描页面以查找关键字的最有效方法,或者是否有更有效的方法不需要我重新检查整个页面(可能只需要重新检查新元素)。

我还想尽可能地降低间隔(我想大约 100 毫秒),但是我不知道这是否会非常节省资源。

感谢您的帮助。

【问题讨论】:

  • 而不是检查间隔。当有任何变化时尝试检查它。这样会更有效率。
  • 正是@mzeus.bolt 的建议是正确的。检查一些合适的事件,如 keyup 或 blur 以检查输入字段的值是否包含受限制的单词。
  • 尝试检查它什么时候提交(因为你的代码中有are you sure you'd like to continue?,所以我认为它有东西要提交?)
  • 问题在于这是一个在所有页面上运行的扩展,并且需要扫描所有创建的新元素(不仅仅是输入,因此使用诸如 keyup 之类的事件将无法正常工作)。不知道如何在没有间隔的情况下实现这一目标。
  • @AlivetoDie 当检测到被阻止的关键字时会显示该对话框,并询问用户是否确定要继续访问该网站。与提交数据无关。

标签: javascript jquery html optimization memory-efficient


【解决方案1】:

您说得对,定期扫描页面内容是解决问题的低效方法。话虽如此,如果它每秒只运行一次,那可能不是什么大问题。

不过,还有更好的选择。 MutationObserver 接口可用于在修改文档或文档的一部分时触发事件。这非常适合您尝试做的事情:

var observer = new MutationObserver(function() {
    … scan the document for your keywords …
});
observer.observe(document, {
    childList: true,
    characterData: true,
    subtree: true
});

【讨论】:

  • 嘿,不确定你是否熟悉这个,但我研究了一个名为 livequery (github.com/brandonaaron/livequery) 的 jQuery 插件,我相信它只是为 MutationObserver 添加了一个很好的包装器(所以我可以做一些事情,比如$('body').livequery(function() { ... }))。我想我可能会走这条路,但想知道是否有任何理由只使用普通的 MutationObserver?谢谢。
  • @PotatoGun 我不确定该插件是否会帮助您。据我所知,它仅在元素被添加到 DOM 或从 DOM 中删除时触发——对其文本的更改不会触发事件。
  • 啊,是的,我只是在考虑添加新元素,而不是考虑更改元素文本。我想MutationObservers 是要走的路。最后一个问题:在回调函数中,我如何实际引用触发事件的元素? @duskwuff
  • 或者你是建议我使用主帖中的函数在触发突变时重新检查整个页面?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-08-16
  • 1970-01-01
  • 2014-11-21
  • 1970-01-01
  • 1970-01-01
  • 2022-09-23
  • 1970-01-01
相关资源
最近更新 更多