Обновление ::
Вот что я придумал: 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()
сверху и во втором фильтре, первый не нужен, скажем, но я думаю, что первоначальный тест должен уменьшить количество более глубоких тестов и немного ускорить его.