텍스트로 링크 선택 (정확히 일치)


89

jQuery를 사용하여 정확히 어떤 종류의 텍스트가 포함 된 링크를 선택하고 싶습니다. 예를 들면 :

<p><a>This One</a></p>
<p><a>"This One?"</a></p>
<p><a>Unlikely</a></p>

나는 이것을 시도했다 :

$('a:contains("This One")')

그러나 첫 번째와 두 번째 링크를 선택합니다. 정확히 "This One"을 포함하는 첫 번째 링크를 원합니다. 어떻게 할 수 있습니까?


답변:


138

다음과 같이 할 수 있습니다.

$('a').filter(function(index) { return $(this).text() === "This One"; });

참조 : http://api.jquery.com/filter/


5
이 경우 어느 쪽이든 작동하지만 === 값과 유형이 일치하기 때문에 사용하는 경향이 있습니다. 즉, 유형을 강제하지 않습니다. stackoverflow.com/questions/359494/...
FishBasketGordo

1
을 (를) 놓쳤습니다 return. 나는 그것을 변경해야function(index) { return (this.text === 'This One') }
앤디 Tjahjono

또한 텍스트 길이를 확인할 수 있습니다.
bestinamir

39

내 동료가 다음을 수행하는 기능으로 jQuery를 확장했습니다.

$.expr[':'].textEquals = function(a, i, m) {
    return $(a).text().match("^" + m[3] + "$");
};

그 결과 다음과 같이 정확한 텍스트로 무언가를 선택할 수 있습니다.

$("label:textEquals('Exact Text to Match')");

매번 정확한 구문을 기억할 필요가 없기 때문에 쉽게 할 수 있습니다. 그의 전체 게시물은 다음과 같습니다. 정확한 텍스트로 요소를 선택하는 jQuery Custom Selector : textEquals


28

FishBasketGordo의 답변을 확장하려면. 많은 양의 요소를 선택하려는 경우 먼저을 사용 :contains()하여 범위를 좁힌 다음 필터를 적용하십시오.

이렇게하면 전반적인 속도가 향상됩니다.

$('a:contains("This One")').filter(function(index)
{
    return $(this).text() === "This One";
});

속도 / 효율성으로 선정되었습니다. 또한 .filter (..) 내에 $ .trim () 공백이 필요하지 않습니다.
JoePC

8

Nariman의 솔루션을 다음과 같이 수정해야했습니다.

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

그렇지 않으면 크롬에서 작동하지 않았습니다 (Linux).


6

나는 확장을 사용하고 있었다

$.expr[':'].textEquals

그러나 구현이 더 이상 jQuery 1.7에서 작동하지 않는다는 것을 발견했습니다 (분명히 Sizzla.filter의 변경 사항). 그것을 작동시키기 위해 얼마 동안 고군분투 한 후에 나는 단순히 jQuery 플러그인을 작성하여 동일한 작업을 수행했습니다.

$.fn.textEquals = function (text) {
    var match = false;
    $(this).each(function () {
        if ($(this).text().match("^" + escapeRegex(text) + "$")) {
            match = true;
            return false;
        }
    });
    return match;
};

사용하다:

$(".ui-autocomplete li").textEquals('Exact Text to Match');

다른 사람이이 (,


3

그래서 Narnian의 대답은 꽤 잘 작동합니다. 그러나 그것을 야생에서 사용하면서 몇 가지 문제에 부딪 혔는데, 내가 발견 할 것으로 예상했던 것이 발견되지 않았습니다. 이것은 때때로 요소의 텍스트를 둘러싸는 임의의 공백이 있기 때문입니다. "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은 검색된 텍스트 앞뒤의 공백 만 제거합니다. 단어 중간의 공백은 제거하지 않습니다. 나는 이것이 바람직한 행동이라고 믿지만 원한다면 그것을 바꿀 수 있습니다.


3
$('a:contains("This One")')[0];

필터링에 대한 다른 모든 사람의 답변을 기반으로 무언가를 놓친 것 같은 느낌이 들지만 'contains'에 의해 반환 된 요소 배열 내에서 첫 번째 항목을 선택하지 않는 이유는 무엇입니까?

이것은 첫 번째 링크가 찾고있는 것과 정확히 일치하는 것을 알고있는 경우에만 작동합니다. 링크 순서가 확실하지 않은 경우 다른 답변이 더 잘 작동합니다.


그는 항상 그가 원하는 일을 모르기 때문에 첫 번째입니다
카메론

질문은 구체적으로 "나는 단지 첫 번째 링크를 원합니다"라고 묻습니다.
Michael Khalili

질문은 정확한 일치를 요구하며 저자는 원하는 요소를 설명하는 첫 번째 요소를 나타냅니다.
dlopezgonzalez

2

드롭 드원에서 선택한 값을 가져 오는 방법 :

$.fn.textEquals = function (text) {
    var match = false; 
    var values="";
    $(this).each(function () {
        if ($(this).text().match("^" + text + "$")) {
            values=$(this).val();
            match = true;
            return false;
        }
    });
    return values;
};

console.log($("option").textEquals("Option One")); -드롭 다운의 값을 반환합니다.


2
var link = $('a').filter(function(index) { return $(this).text() === "Availability"; });
 $(link).hide();
        $(link).removeAttr('href');

1
답변에 대한 설명을 추가하십시오.
Michał Perłakowski

해당 텍스트가있는 링크를 선택하는 첫 번째 줄, 두 번째 및 세 번째 줄에서 링크를 숨기거나 링크를 비활성화 할 수있는 작업 jquery 설명서 api.jquery.com/filter
David Fawzy

@DavidFawzy-죄송합니다, 음 ... 뭐 ?? 두 번째 또는 세 번째 줄이 OP의 질문과 관련이 있다고 생각하지 않습니다. 혼란을 더합니다.
jbyrd

2

죄송합니다. 위의 답변과 정확히 일치하면

   $.fn.equalsText = function (text, isCaseSensitive) {
      return $(this).filter(function () {
         if (isCaseSensitive) {
            return $(this).text() === text
         } else {
            return $(this).text().toLowerCase() === text.toLowerCase()
         }
      })
   }

다음은 Linkedin 검색 결과 페이지 콘솔의 일부 출력입니다.

$("li").equalsText("Next >", false)
[<li class="next">​…​</li>​] // Output

$("li").equalsText("next >", false)
[<li class="next">​…​</li>​] // Output

$("li").equalsText("Next >", true)
[<li class="next">​…​</li>​] // Output

$("li").equalsText("next >", true)
[] // Output

대소 문자 구분도 지원하며 사용하지 않습니다. :contains()

편집 (2017 년 5 월 22 일) :-

   $.fn.equalsText = function (textOrRegex, isCaseSensitive) {
      return $(this).filter(function () {
         var val = $(this).text() || this.nodeValue
         if (textOrRegex instanceof RegExp) {
            return textOrRegex.test(val)
         } else if (isCaseSensitive) {
            return val === textOrRegex
         } else {
            return val.toLowerCase() === textOrRegex.toLowerCase()
         }
      })
   }
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.