原生javascript相当于jQuery:contains()选择器

我正在编写一个UserScript,它将从包含特定字符串的页面中删除元素。

如果我正确理解jQuery的contains()函数,它似乎是工作的正确工具。

不幸的是,由于我将运行UserScript的页面不使用jQuery,我不能使用:contains()。 你们中的任何一个人都知道这样做的本土方式是什么?

这应该在现代浏览器中做到:

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 ... 

如果你想像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; }; 

消息来源: Sizzle.js

好吧,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的实现。