2012-02-07 9 views
13

私はブックマークレットを書いて、文書上の見えるテキストのすべてのインスタンスに関数doSomething(textNode)を呼び出そうとしています。すべてのテキストノードを見つける

は、単に楽しいため、渡されたtextNodeのtextContentを置き換えることによって、すべての単語を「derp」に置き換えます。しかし、これにより空のテキストノードには単語が含まれているため、Webページが壊れてしまいます。

doSomething()は、単語を含むすべてのtextNodeにのみ呼び出す方法はありますか?

function recurse(element) 
{ 
    if (element.childNodes.length > 0) 
     for (var i = 0; i < element.childNodes.length; i++) 
      recurse(element.childNodes[i]); 

    if (element.nodeType == Node.TEXT_NODE && element.nodeValue != '') 
     doSomething(element); 
} 
var html = document.getElementsByTagName('html')[0]; 
recurse(html); 

答えて

10

変更これ...これまで

element.nodeValue != '' 

...

/\S/.test(element.nodeValue) 

これは、少なくとも一つの非スペース文字を検索/\S/正規表現を使用しています。

「単語」の意味をさらに定義する必要があります。私はあなたが空白のみのノードを除外していることを意味するようにしました。 String.prototype.trimをサポートするブラウザで


、これは選択肢になります...

element.nodeValue.trim() != ''