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

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

274 голосов
/ 06 сентября 2011

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

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

Ответы [ 6 ]

389 голосов
/ 06 сентября 2011

Вы можете использовать селектор :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>
85 голосов
/ 01 апреля 2014

В документации 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;
}
20 голосов
/ 17 марта 2016

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

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

16 голосов
/ 17 мая 2015

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

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

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

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

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

13 голосов
/ 03 ноября 2015

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

$.fn.findByContentText = function (text) {
    return $(this).contents().filter(function () {
        return $(this).text().trim() == text.trim();
    });
};
10 голосов
/ 06 сентября 2011

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

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