jQuery: найти элемент по тексту

Может ли кто-нибудь сказать мне, можно ли найти элемент на основе его содержимого, а не id или class?

Я пытаюсь найти элементы, которые не имеют отдельных классов или идентификаторов. (Тогда мне нужно найти этот родитель элемента.)

Ответ 1

Вы можете использовать селектор :contains, чтобы получать элементы на основе их содержимого.

Демо здесь

$('div:contains("test")').css('background-color', 'red');
<div>This is a test</div>
<div>Another Div</div>

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>

Ответ 2

В документации JQuery это говорит:

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

Поэтому вам недостаточно использовать селектор :contains(), вам также нужно проверить, является ли искомый текст прямым содержанием элемента, на который вы нацеливаетесь, что-то вроде этого:

function findElementByText(text) {
    var jSpot = $("b:contains(" + text + ")")
                .filter(function() { return $(this).children().length === 0;})
                .parent();  // because you asked the parent of that element

    return jSpot;
}

Ответ 3

Феллас, я знаю, что это старо, но эй, у меня есть это решение, которое, я думаю, работает лучше всех. Прежде всего, преодолевает чувствительность к регистру, которую jquery: contains() отправляется с помощью:

var text = "text";

var search = $( "ul li label" ).filter( function ()
{
    return $( this ).text().toLowerCase().indexOf( text.toLowerCase() ) >= 0;
}).first(); // Returns the first element that matches the text. You can return the last one with .last()

Надеюсь, что кто-то в ближайшем будущем сочтет это полезным.

Ответ 4

Ракетный ответ не работает.

<div>hhhhhh
<div>This is a test</div>
<div>Another Div</div>
</div>

Я просто изменил его ДЕМО здесь, и вы можете видеть, что выбран корневой DOM.

$('div:contains("test"):last').css('background-color', 'red');

добавьте в код селектор ": последний", чтобы исправить это.

Ответ 5

Лучший способ, на мой взгляд.

$.fn.findByContentText = function (text) {
    return $(this).contents().filter(function () {
        return $(this).text().trim() == text.trim();
    });
};

Ответ 6

Да, используйте селектор jQuery contains.

Ответ 7

Следующий jQuery выбирает узлы div, которые содержат текст, но не имеют дочерних элементов, которые являются конечными узлами дерева DOM.

$('div:contains("test"):not(:has(*))').css('background-color', 'red');
<div>div1
<div>This is a test, nested in div1</div>
<div>Nested in div1<div>
</div>
<div>div2
<div>This is another test, nested in div2</div>
<div>Nested in div2</div>
</div>
<div>
div3
</div>

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>