Как мне использовать jQuery, чтобы получить набор каждого элемента с определенным текстом, но НЕ с родителями? - PullRequest
1 голос
/ 17 июля 2011

Я хочу использовать jQuery для выбора каждого элемента, в котором есть определенная текстовая строка, но не родительские элементы этого элемента.Как мне это сделать?Я не имею никакого контроля над кодом HTML, но вот пример:

<body>
<div>
<p>This is a paragraph and <a>this is not</a>.</p>
Here we have a div.
</div>
</body>

Если я использую слово "this" в качестве слова соответствия, я хочу, чтобы jQuery предоставил мне набор, содержащий <a> и <p>, но не <div> или <body>.

Опять же, я не имею никакого контроля над HTML!

Спасибо!

** Разъяснение: я действительно хочу родителя элемента, если родитель также имеет «this» в его непосредственном тексте.Таким образом, я хочу <a> И <p>.

Ответы [ 2 ]

1 голос
/ 17 июля 2011

Обновление ::

Вот что я придумал: jsfiddle

var myArray = $('*:contains("this")','body').filter(function(){
    if($(this).contents().filter(function(){
        return(this.nodeType == 3);
    }).text().indexOf('this')===-1){
        return false;
    }
    return true;
});


$.each(myArray,function(){
   console.log(this.nodeName); 
});

Начинается аналогично ссылке, размещенной Робином, но заставляет искать только в контексте body элементов - это сохраняет ваши скрипты в безопасности, если они не встроены.

Следующая часть представляет собой фильтр, который проверяет, содержит ли текущий элемент прямые текстовые узлы текст.

Это немного запутанно, но пройти через это:

.contents() - документы - получает непосредственные узлы

.filter() - документы - мы хотим тестировать только на тестовых узлах, поэтому мы отфильтровываем их

this.nodeType - w3 spec - проверить, является ли это текстовым узлом

.test() - docs - получает строку текстовых узлов.

.indexOf() - проверьте эту строку для нашей строки

Обратите внимание, что я сделал :contains() сверху и во втором фильтре, первый не нужен, скажем, но я думаю, что первоначальный тест должен уменьшить количество более глубоких тестов и немного ускорить его.

0 голосов
/ 17 июля 2011

Вот мое решение с чистым JS .

Код: function findElmsWithWord(word, elm, found){ if (elm.nodeType === 3 && elm.data.indexOf(word) !== -1) found.push(elm.parentNode); else for (var i = 0; i < elm.childNodes.length; i++) findElmsWithWord(word, elm.childNodes[i], found); }</p> <p>var elms = []; findElmsWithWord('this', document.body, elms); console.log(elms);

Он рекурсивно обходит дом, пока не находит текстовые узлы, которые содержат рассматриваемое слово. А затем добавляет родительский узел текстового узла в результате.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...