2016-05-11 4 views
1

DOMをトラバースし、指定された文字列が見つかった場合にtrueを返す単純なコンテンツスクリプトでクロム拡張の開発をテストしています。DOMをトラバースすると文字列が正しく返される

単純なWebページでは、スクリプトは正しく100%が返されますが、より複雑なページに表示されます。 Google検索結果の場合、指定された文字列を持つページで10回ごとにtrueを返します。

私はCrockfords DOM traversalアルゴリズムを使用していますが、別のアルゴリズムを試したこともありますが、同じ結果が得られます。私は拡張機能やJavascriptの新機能ですが、これが何らかの非同期の問題であるかどうかは不明です。

var exists = false; 

function walkTheDOM(node) { 
    // String search function 
    if (node.nodeType === 3) 
     if (node.nodeValue.indexOf("today") > -1) 
      exists = true; 

    // Continue recursive DOM traversal 
    node = node.firstChild; 
    while (node) { 
     walkTheDOM(node); 
     node = node.nextSibling; 
    } 
    return exists; 
} 

if (walkTheDOM(document.body)) 
    alert("String exists in page."); 
+1

なぜ* document.body.textContent *を使用しないのですか?また、たとえテキストが最初に見つかったとしても、これは "DOMを"歩いて行きます。 – RobG

+0

ありがとう、私はそれについて知らなかったし、 'document.body.textContent.indexOf(" string ")'はうまくいきます。私が使用しているDOMのトラバーサル手法がなぜそんなに信頼性のないところに戻ったのかを知ることはまだ興味深いでしょう。 – CBerry

+2

このチェックはいつ実行していますか?ページに動的コンテンツが挿入されていて、すぐに確認している可能性がありますか? –

答えて

0

ページのコンテンツは動的であること(あなたのコードの実行後に新しいコンテンツがロードされた)、あなたは2つの可能性がありますので:あなたは、確定時に意思決定をする必要がある場合

  1. を、待つだけビット。スクリプトが実行を開始してからチェックを開始するまでのタイムアウトを設定します。

  2. 単語が後で表示されるように変更しても問題がなければ、実行しているものを実行してset up a listener for DOM changesを加え、新しい/変更したノードを分析することをお勧めします。

ストラテジが「確定的な時間に諦めて、すぐに検出する」場合は、両方の方法を組み合わせることができます。

関連する問題