2017-08-28 84 views
0

所以我正在爲自己和一些朋友開發個人用戶稿。 userscript用於阻止頁面上的關鍵字。每秒掃描一次關鍵字的頁面是否有效?

要搜索的頁面我使用的關鍵字:

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毫秒左右),但我不知道這是否會非常資源友好。

謝謝你的幫助。

+1

而不是檢查時間間隔。嘗試檢查它什麼時候發生變化..這將會更有效率。 –

+0

準確地說@ mzeus.bolt的建議是正確的。 檢查一些合適的事件,如鍵控或模糊,以檢查輸入字段的值是否具有受限制的字詞。 –

+0

嘗試檢查它將要提交的時間(因爲你有'你確定你想繼續嗎?'在你的代碼中,所以我認爲它有東西要提交嗎?) –

回答

3

你是正確的,定期掃描頁面的內容是一個低效率的方法來解決這個問題。這就是說,如果它只是每秒運行一次,這可能不是一個大問題。

不過,還有更好的選擇。當文檔或文檔的一部分被修改時,MutationObserver接口可用於觸發事件。這是你想要做的事情的完美選擇:

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

嘿,不知道你是否熟悉這個,但我已經看過一個名爲livequery(https://github.com/brandonaaron/livequery)的jQuery插件,我相信它只是爲MutationObserver添加了一個很好的包裝器(所以我可以做一些諸如'$('body')。livequery(function(){...})')。我想我可能會走這條路,但想知道是否有任何理由使用普通的MutationObserver?謝謝。 –

+0

@PotatoGun我不確定插件是否會幫助你。從我所知道的情況來看,只有當元素添加到DOM中或從DOM中移除元素時纔會觸發 - 對其文本的更改不會觸發事件。 – duskwuff

+0

嗯,是的,我只是在考慮添加新元素,並沒有考慮元素文本正在發生變化。我猜'MutationObserver'是要走的路。最後一個問題:在回調函數中,我如何實際引用觸發事件的元素? @duskwuff –

相關問題