Wybierz element po dokładnym dopasowaniu jego zawartości

W porządku, ciekawe czy jest jakiś sposób aby selektor :contains() jQuery wybierał elementy z tylko łańcuch który jest wpisany w

Na przykład-

<p>hello</p>
<p>hello world</p>

$('p:contains("hello")').css('font-weight', 'bold');

Selektor wybierze oba p elementy i sprawi, że będą pogrubione, ale chcę, aby wybrał tylko pierwszy.

Author: Israelg99, 2013-03-12

7 answers

Nie, Nie ma selektora jQuery (lub CSS), który tak robi.

Możesz łatwo użyć filter:

$("p").filter(function() {
    return $(this).text() === "hello";
}).css("font-weight", "bold");

To nie jest selektor , ale robi swoje. :-)

Jeśli chcesz obsłużyć białe znaki przed lub po "hello", możesz rzucić $.trim tam:

return $.trim($(this).text()) === "hello";

Dla przedwczesnych optymalizatorów, jeśli nie obchodzi cię, że nie pasuje <p><span>hello</span></p> i podobne, możesz uniknąć wywołań do $ i text za pomocą innerHTML bezpośrednio:

return this.innerHTML === "hello";

...ale musiałbyś mieć Nr serii akapitów, aby miało to znaczenie, tak wiele, że prawdopodobnie będziesz miał inne problemy najpierw. :-)

 168
Author: T.J. Crowder,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-12 14:48:50

Spróbuj dodać pseudo-funkcję extend:

$.expr[':'].textEquals = $.expr.createPseudo(function(arg) {
    return function( elem ) {
        return $(elem).text().match("^" + arg + "$");
    };
});

Wtedy możesz zrobić:

$('p:textEquals("Hello World")');
 46
Author: Amadu Bah,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-27 10:06:14

Możesz użyć funkcji jQuery filter () aby to osiągnąć.

$("p").filter(function() {
// Matches exact string   
return $(this).text() === "Hello World";
}).css("font-weight", "bold");
 8
Author: lifetimes,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-12 14:43:11

Więc odpowiedź Amandu głównie działa. Używając go na wolności, napotkałem jednak pewne problemy, w których rzeczy, których spodziewałbym się znaleźć, nie zostały znalezione. Dzieje się tak dlatego, że czasami jest przypadkowa Biała spacja otaczająca tekst elementu. Wierzę, że jeśli szukasz "Hello World", nadal chcesz, aby pasował do "Hello World", a nawet "Hello World \n". Dlatego właśnie dodałem metodę " trim()" do funkcji, która usuwa otaczające spacje i zaczęło działać lepiej.

Konkretnie...
$.expr[':'].textEquals = function(el, i, m) {
    var searchText = m[3];
    var match = $(el).text().trim().match("^" + searchText + "$")
    return match && match.length > 0;
}

Również, zauważ, że ta odpowiedź jest bardzo podobna do Select link by text (exact match)

I notatka Drugorzędna... trim usuwa tylko białe spacje przed i po wyszukiwany tekst. Nie usuwa białych spacji w środku słów. Uważam, że to pożądane zachowanie, ale możesz to zmienić, jeśli chcesz.

 8
Author: bwest87,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:10:31

Jak stwierdził T. J. Crowder, funkcja filtra czyni cuda. W moim konkretnym przypadku to nie działało. Musiałem przeszukiwać wiele tabel i ich odpowiednie znaczniki TD wewnątrz div (w tym przypadku okno dialogowe jQuery).

$("#MyJqueryDialog table tr td").filter(function () {
    // The following implies that there is some text inside the td tag.
    if ($.trim($(this).text()) == "Hello World!") {
       // Perform specific task.
    }
});

Mam nadzieję, że to komuś pomoże!

 3
Author: Greg A,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-03 17:00:46

Znalazłem sposób, który działa dla mnie. Nie jest to w 100% dokładne, ale eliminuje wszystkie ciągi, które zawierają więcej niż tylko słowo, którego szukam, ponieważ sprawdzam, czy ciąg nie zawiera pojedynczych spacji. Przy okazji, nie potrzebujesz ich "". jQuery wie, że szukasz ciągu. Upewnij się, że masz tylko jedną spację w części :contains (), w przeciwnym razie nie zadziała.

<p>hello</p>
<p>hello world</p>
$('p:contains(hello):not(:contains( ))').css('font-weight', 'bold');

I tak Wiem, że to nie zadziała, jeśli masz takie rzeczy jak <p>helloworld</p>

 2
Author: rf1234,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-20 19:55:41

The .first () pomoże tutaj

$('p:contains("hello")').first().css('font-weight', 'bold');
 -4
Author: tymeJV,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-12 14:43:37