Скажімо, на веб-сторінці є такий рядок, як "Я проста строка", який я хочу знайти. Як би я пішов про це за допомогою JQuery?
Скажімо, на веб-сторінці є такий рядок, як "Я проста строка", який я хочу знайти. Як би я пішов про це за допомогою JQuery?
Відповіді:
jQuery має метод містить. Ось фрагмент для вас:
<script type="text/javascript">
$(function() {
var foundin = $('*:contains("I am a simple string")');
});
</script>
Селектор вище вибирає будь-який елемент, який містить цільовий рядок. Foundin буде об’єктом jQuery, який містить будь-який збіглий елемент. Інформацію про API див. На веб-сторінці : https://api.jquery.com/contains-selector/
Одне, що слід зауважити під символом '*', - це те, що ви отримаєте всі елементи, включаючи ваш html елементи тіла, які, напевно, не хочете. Ось чому більшість прикладів у jQuery та інших місцях використовують $ ('div: містить ("Я проста строка")')
Зазвичай селектори jQuery не здійснюють пошук у "текстових вузлах" у DOM. Однак якщо ви використовуєте функцію .contents (), текстові вузли будуть включені, то ви можете використовувати властивість nodeType для фільтрації лише текстових вузлів, а властивість nodeValue для пошуку текстового рядка.
$ ('*', 'body') .andSelf () .contents () .filter (function () { повернути цей.nodeType === 3; }) .filter (function () { // Збігається лише тоді, коли в тексті міститься "проста рядок" повернути this.nodeValue.indexOf ('проста рядок')! = -1; }) .each (function () { // Зробіть щось із цим.nodeValue });
.andSelf()
. З api.jquery.com/andSelf : "Об'єкти jQuery підтримують внутрішній стек, який відстежує зміни в зібраному наборі елементів. Коли викликається один із методів обходу DOM, новий набір елементів висувається на стек. Якщо попередній набір елементів також бажаний .andSelf () може допомогти. " Я не бачу попереднього контексту, чого я пропускаю?
Тут виберуть лише елементи листя, які містять "Я проста строка".
$('*:contains("I am a simple string")').each(function(){
if($(this).children().length < 1)
$(this).css("border","solid 2px red") });
Вставте наступне в адресний рядок, щоб перевірити його.
javascript: $('*:contains("I am a simple string")').each(function(){ if($(this).children().length < 1) $(this).css("border","solid 2px red") }); return false;
Якщо ви хочете схопити просто "Я проста струна" . Спочатку загортайте текст у такий елемент.
$('*:contains("I am a simple string")').each(function(){
if($(this).children().length < 1)
$(this).html(
$(this).text().replace(
/"I am a simple string"/
,'<span containsStringImLookingFor="true">"I am a simple string"</span>'
)
)
});
а потім зробіть це.
$('*[containsStringImLookingFor]').css("border","solid 2px red");
Якщо ви просто хочете, щоб вузол був найближчим до тексту, який ви шукаєте, ви можете скористатися цим:
$('*:contains("my text"):last');
Це навіть спрацює, якщо ваш HTML виглядає так:
<p> blah blah <strong>my <em>text</em></strong></p>
Використовуючи вищевказаний селектор, ви знайдете <strong>
тег, оскільки це останній тег, який містить всю цю рядок.
<p>my text <b>my text</b></p>
- видалення предків <b>
тегу програють інший матч
Погляньте на виділення (плагін jQuery).
Просто додавши відповідь Тоні Міллера, оскільки це наділило мене на 90% до того, що я шукав, але все одно не працював. Додавши .length > 0;
до кінця свого коду, мій сценарій запрацював.
$(function() {
var foundin = $('*:contains("I am a simple string")').length > 0;
});
foundin += '*';
ця функція повинна працювати. в основному відбувається рекурсивний пошук, поки ми не отримаємо чіткого списку вузлів листя.
function distinctNodes(search, element) {
var d, e, ef;
e = [];
ef = [];
if (element) {
d = $(":contains(\""+ search + "\"):not(script)", element);
}
else {
d = $(":contains(\""+ search + "\"):not(script)");
}
if (d.length == 1) {
e.push(d[0]);
}
else {
d.each(function () {
var i, r = distinctNodes(search, this);
if (r.length === 0) {
e.push(this);
}
else {
for (i = 0; i < r.length; ++i) {
e.push(r[i]);
}
}
});
}
$.each(e, function () {
for (var i = 0; i < ef.length; ++i) {
if (this === ef[i]) return;
}
ef.push(this);
});
return ef;
}