2013-07-22 13 views
9

特定の文字列を含むページから要素を削除するUserScriptを作成しています。jQuery:contains()セレクタのネイティブjavascript

jQueryのcontains()関数が正しく理解されていれば、ジョブの正しいツールのようです。

残念ながら、私が実行しているページはjQueryを使用していないため、使用できません:contains()。あなたの誰もが、これを行うネイティブな方法が何であるか知っていますか?

http://codepen.io/coulbourne/pen/olerh

+0

[あなたのuserscriptでjQueryを追加](http://stackoverflow.com/a/12751531/331508)。それを断片的に再現しようと時間を無駄にしないでください。 –

+0

いくつかのブラウザ(IE7 - EDIT:多分IE8)のサポートを中止する準備ができていれば、JQueryのセレクタと非常によく似た方法でネイティブの "document.querySelectorAll"を使うことができます。 http://caniuse.com/#feat=queryselector – Katana314

答えて

0

まあ、jQueryのは、私がお見せしようとしてんだけど、それはトリックを行います1より多くの方に動作DOMトラバースエンジンを搭載しています。

var items = document.getElementsByTagName("*"); 
for (var i = 0; i < items.length; i++) { 
    if (items[i].innerHTML.indexOf("word") != -1) { 
    // Do your magic 
    } 
} 

jQueryの実装を使用することを強くお勧めします。

3

あなたはjQueryの場合と同様にcontainsメソッドexacltyを実装する場合には、これはあなたが持っているために必要なものである

function contains(elem, text) { 
    return (elem.textContent || elem.innerText || getText(elem)).indexOf(text) > -1; 
} 

function getText(elem) { 
    var node, 
     ret = "", 
     i = 0, 
     nodeType = elem.nodeType; 

    if (!nodeType) { 
     // If no nodeType, this is expected to be an array 
     for (; (node = elem[i]); i++) { 
      // Do not traverse comment nodes 
      ret += getText(node); 
     } 
    } else if (nodeType === 1 || nodeType === 9 || nodeType === 11) { 
     // Use textContent for elements 
     // innerText usage removed for consistency of new lines (see #11153) 
     if (typeof elem.textContent === "string") { 
      return elem.textContent; 
     } else { 
      // Traverse its children 
      for (elem = elem.firstChild; elem; elem = elem.nextSibling) { 
       ret += getText(elem); 
      } 
     } 
    } else if (nodeType === 3 || nodeType === 4) { 
     return elem.nodeValue; 
    } 
    // Do not include comment or processing instruction nodes 

    return ret; 
}; 

SOURCE:Sizzle.js

16

これは、最近のブラウザで実行する必要があります。

function contains(selector, text) { 
    var elements = document.querySelectorAll(selector); 
    return [].filter.call(elements, function(element){ 
    return RegExp(text).test(element.textContent); 
    }); 
} 

このように使用してください:

contains('p', 'world'); // find "p" that contain "world" 
contains('p', /^world/); // find "p" that start with "world" 
contains('p', /world$/i); // find "p" that end with "world", case-insensitive 
... 
+3

新しい配列を割り当てる代わりに、おそらく 'Array.prototype.filter.call'を使用してください。 –

関連する問題