2013-07-22 43 views
9

我正在寫一個UserScript,它將從包含特定字符串的頁面中移除元素。本機JavaScript的jQuery相當於:包含()選擇器

如果我正確理解jQuery的contains()函數,它看起來就像是正確的工具。

不幸的是,由於我將運行UserScript的頁面不使用jQuery,因此我無法使用:contains()。你們中的任何一個可愛的人都知道本地的做法是什麼?

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

+0

繼續並[用您的腳本添加jQuery](http://stackoverflow.com/a/12751531/331508)。不要浪費時間試圖重新創建它。 –

+0

如果您準備放棄對某些瀏覽器的支持(我認爲只是IE7 - 編輯:也可能是IE8),您可以以非常類似於JQuery選擇器的方式使用本機「document.querySelectorAll」。 http://caniuse.com/#feat=queryselector – Katana314

回答

0

好,jQuery的配備與操作比我都快要告訴你好多了一個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

如果你想實現contains方法exaclty如jQuery不會,這是你需要具備什麼

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; 
}; 

來源: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'而不是分配一個新的數組。 –