Исходный javascript-эквивалент jQuery: содержит() селектор
Я пишу UserScript, который удаляет элементы со страницы, содержащей определенную строку.
Если я правильно понимаю функцию jQuery contains(), она кажется правильным инструментом для задания.
К сожалению, поскольку страница, на которой я буду запускать UserScript on, не использует jQuery, я не могу использовать: contains(). Любой из вас, прекрасные люди, знает, что на самом деле это сделать?
http://codepen.io/coulbourne/pen/olerh
Ответы
Ответ 1
Это должно быть сделано в современных браузерах:
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
...
Ответ 2
Если вы хотите реализовать метод 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
Ответ 3
Ну, 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.
Ответ 4
Это современный подход
function get_nodes_containing_text(selector, text) {
const elements = [...document.querySelectorAll(selector)];
return elements.filter(
(element) =>
element.childNodes[0]
&& element.childNodes[0].nodeValue
&& RegExp(text, "u").test(element.childNodes[0].nodeValue.trim())
);
}