2017-08-28 5 views
0

私は自分自身といくつかの友人のために個人的なuserscriptに取り組んでいます。ユーザースクリプトは、ページ上のキーワードをブロックするために使用されます。1秒ごとにキーワードのページをスキャンするのが効率的ですか?

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を介して動的に作成されている可能性があります。また、フィルタされていることを確認する必要があります。

しかし、これがキーワードのページをスキャンする最も効率的な方法であるかどうか、またはページ全体を再確認する必要のないより効率的な方法があるかどうかを知りたいと思います新しい要素を再チェックする)。

また、私はできる限り低い間隔をプッシュしたいと思います(私は約100msと考えていますが)、これは非常にリソースにやさしいかどうか分かりません。

ありがとうございました。

+1

間隔を確認するのではなく、何かが変わったときにそれをチェックしてみてください。それははるかに効率的です。 –

+0

正確に@ mzeus.boltの提案は正しいです。 キーアップやぼかしなどの適切なイベントをチェックして、入力フィールドの値をチェックして制限された単語を持つようにします。 –

+0

提出するタイミングを確認してください(あなたのコードに「続行してもよろしいですか?」というように、提出するものがあると思います) –

答えて

3

ページの内容を定期的にスキャンすることは、問題に対する非効率的なアプローチです。それは言われている、もしそれが1秒に1回だけ走っているならば、それはおそらく大きな問題ではないでしょう。

まだ、より良い選択肢があります。 MutationObserverインターフェイスを使用すると、ドキュメントまたはドキュメントの一部が変更されたときにイベントを発生させることができます。これはあなたがやろうとしていることに最適です:

+0

あなたがこれに精通しているかどうかわかりませんが、私はlivequery(https://github.com/brandonaaron/livequery)というjQueryプラグインを調べました。これは単にMutationObserverの素敵なラッパーを追加すると思います'$( 'body')。livequery(function(){...})')のようなことができます。私はおそらくこのルートに行くと思いますが、プレーンなMutationObserverだけを使用する理由があるかどうかを知りたがっていますか?ありがとうございました。 –

+0

@PotatoGun私は、プラグインがあなたをここで助けてくれるとは確信していません。私が知ることから、要素がDOMに追加されたりDOMから削除された場合にのみトリガされます。テキストの変更はイベントを発生させません。 – duskwuff

+0

ああ、私は単に、新しい要素が追加されていることを考えていて、要素のテキストが変更されているとは考えていませんでした。私は '突然変異監視(Mutation Observer)'が行く方法だと思う。もう1つ質問:コールバック関数で、イベントをトリガした要素を実際にどのように参照するのですか? @duskwuff –