내용과 정확히 일치하는 요소를 선택하십시오.


160

좋아, :contains()jQuery의 선택기 가 입력 된 문자열 있는 요소를 선택 하는 방법이 있는지 궁금합니다 .

예를 들어-

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

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

선택기는 두 p요소를 모두 선택 하고 굵게 표시하지만 첫 번째 요소 만 선택하고 싶습니다.


글쎄, 당신은 :contains자신의 코드로 선택기를 재정의 할 수는 있지만 그게 당신의 의도라고 생각하지 않습니까?
Blazemonger


사용자 정의 선택기를 정의 할 수 있습니다. stackoverflow.com/questions/12244929/…
BLSully


답변:


214

아니요, 그렇게하는 jQuery (또는 CSS) 선택기가 없습니다.

당신은 쉽게 사용할 수 있습니다 filter:

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

그것은 아니다 선택 ,하지만 일을한다. :-)

"hello"전후에 공백을 처리하려면 여기에 공백을 넣을 수 있습니다 $.trim.

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

거기 조기 최적화를 위해, 당신은 일치하지 않음을 걱정하지 않는 경우 <p><span>hello</span></p>와 유사한, 당신에 대한 호출 피할 수 $text사용하여 innerHTML직접 :

return this.innerHTML === "hello";

...하지만 당신은해야 할 것 많은 이 문제에 대한 당신은 아마 첫번째 다른 문제가있을 거라고 많은, 단락을. :-)


7
또한 $.trim비교하기 전에 흩어진 공백을 원할 수도 있습니다 .
Blazemonger

어떤 이유로 나는 이것이 "==="대신에 "=="를 사용해야했습니다.
Stephan

3
@Stephan : 숫자와 비교하는 경우 값을 가져 오거나 항상 문자열 이므로 숫자 ==( == 2) 를 사용 하거나 숫자를 문자열 ( === "2")에 입력해야 합니다. 문자열과 비교하는 경우 또는 사용 여부는 중요하지 않습니다 . text()innerHTML=====
TJ Crowder

jQuery가 구현 한 것이 부끄러운 :contains일이지만 좀 더 복잡하지만 정확한 텍스트 일치를 위해 선택기를 구현하지 않았습니다. = {
Paulo Bueno

54

의사 확장 기능을 추가하십시오.

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

그럼 당신은 할 수 있습니다 :

$('p:textEquals("Hello World")');

2
훌륭한 솔루션 : 적은 추가 : 기존 expr을 덮어 쓰지 않도록하기 위해 다음과 같이합니다.$.expr[':'].textEquals = $.expr[':'].textEquals || $.expr.createPseudo(function(arg) {
Mischa Molhoek

9

jQuery의 filter () 함수를 사용하여이를 달성 할 수 있습니다 .

$("p").filter(function() {
// Matches exact string   
return $(this).text() === "Hello World";
}).css("font-weight", "bold");

9

따라서 Amandu의 대답은 대부분 작동합니다. 그러나 야생에서 그것을 사용하면서, 나는 발견 될 것으로 예상되는 것들이 발견되지 않는 몇 가지 문제에 부딪쳤다. 때로는 요소의 텍스트 주위에 임의의 공백이 있기 때문입니다. "Hello World"를 검색하는 경우 여전히 "Hello World"또는 "Hello World \ n"과 일치 시키려고한다고 생각합니다. 따라서 방금 공백을 제거하는 "trim ()"메서드를 함수에 추가하고 더 잘 작동하기 시작했습니다.

구체적으로 특별히...

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

또한이 답변은 텍스트로 링크 선택 (정확히 일치) 과 매우 유사합니다.

그리고 보조 메모 ... 는 검색된 텍스트 전후trim공백 만 제거 합니다. 단어 중간에 공백이 제거되지 않습니다. 나는 이것이 바람직한 행동이라고 생각하지만 원하는 경우 변경할 수 있습니다.


5

나는 나에게 맞는 방법을 찾았다. 100 % 정확하지는 않지만 개별 공백을 포함하지 않는 문자열을 확인하기 때문에 찾고있는 단어 이상을 포함하는 모든 문자열을 제거합니다. 그건 그렇고 당신은 ""이 필요하지 않습니다. jQuery는 문자열을 찾고 있다는 것을 알고 있습니다. : contains () 부분에 공백이 하나만 있는지 확인하십시오. 그렇지 않으면 작동하지 않습니다.

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

그리고 네, 같은 물건이 있으면 작동하지 않는다는 것을 알고 있습니다 <p>helloworld</p>


1
필터 또는 확장명을 사용하지 않고 contains (..)와 간단한 일치를 영리하게 사용합니다! 첫 번째 contains (..)에서 공백이 필요한 작업은 수행하지 않지만 그에 대한 해결책을 찾으려고 노력합니다. 감사!
JoePC

3

위에서 언급 한 TJ Crowder와 마찬가지로 필터 기능은 놀라운 기능입니다. 내 경우에는 저에게 효과가 없었습니다. div 내에서 여러 테이블과 해당 td 태그를 검색해야했습니다 (이 경우 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.
    }
});

나는 이것이 누군가에게 도움이되기를 바랍니다!


jquery를 처음 접했지만 filter의 목표는 subarray를 반환하는 것이므로 filter () 대신 each ()를 사용하는 것이 약간 더 낫다고 생각합니다. 하지만이 같은 문제 : 한대로, 확실히 솔루션을 영감
JeopardyTempest을

0

jQuery에 대한 대체 라이브러리 와 함께 작동하는 단일 라이너 :

$('p').filter((i, p) => $(p).text().trim() === "hello").css('font-weight', 'bold');

그리고 이것은 jQuery의 a:contains("pattern")선택기와 같습니다.

var res = $('a').filter((i, a) => $(a).text().match(/pattern/));

-4

.first ()가 여기에 도움이 될 것입니다.

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

물론 ...이 특정한 경우에. 주문이 개발 시간에 알려지지 않은 경우 어떻게해야합니까?
BLSully
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.