jQuery 1.8 이상을 포함하여 jQuery 포함을 대소 문자를 구분하지 않게하려면 어떻게해야합니까?


91

대소 문자를 구분하지 않고 "포함"을 사용하려고합니다. 다음 stackoverflow 질문에서 솔루션을 사용해 보았지만 작동하지 않았습니다.

대소 문자를 구분하지 않는 jQuery : contains selector가 있습니까?

편의를 위해 솔루션이 여기에 복사됩니다.

jQuery.extend(
        jQuery.expr[':'], { 
                Contains : "jQuery(a).text().toUpperCase().indexOf(m[3].toUpperCase())>=0" 
});

오류는 다음과 같습니다.

Error: q is not a function
Source File: /js/jquery-1.4.js?ver=1.4
Line: 81

내가 사용하는 곳은 다음과 같습니다.

  $('input.preset').keyup(function() {
    $(this).next().find("li").removeClass("bold");
    var theMatch = $(this).val();
    if (theMatch.length > 1){
      theMatch = "li:Contains('" + theMatch + "')";
      $(this).next().find(theMatch).addClass("bold");
    }
  });

동일한 시나리오에서 원래 대소 문자 구분 "포함"을 사용하면 오류없이 작동합니다. 누구에게 아이디어가 있습니까? 감사합니다.


경우 누구나 관심, 나는 내 업데이트 한 블로그 게시물을 추가로 3가 선택기 포함에 :containsExact, :containsExactCase그리고 :containsRegexjQuery를의 모든 버전에서 현재 작업에 선택기.
Mottie


.filter ()가 또 다른 좋은 방법이라고 생각합니다. 참조
劉鎮 瑲

답변:


127

이것은 현재 프로젝트에서 사용하고 있으며 문제가 없었습니다. 이 형식으로 더 나은 운이 있는지 확인하십시오.

jQuery.expr[':'].Contains = function(a, i, m) { 
  return jQuery(a).text().toUpperCase().indexOf(m[3].toUpperCase()) >= 0; 
};

jQuery 1.8에서 이에 대한 API가 변경되었으며 jQuery 1.8+ 버전은 다음과 같습니다.

jQuery.expr[":"].Contains = jQuery.expr.createPseudo(function(arg) {
    return function( elem ) {
        return jQuery(elem).text().toUpperCase().indexOf(arg.toUpperCase()) >= 0;
    };
});

여기에서 테스트 할 수 있습니다 . 1.8 개 이상의 사용자 지정 선택기에 대한 자세한 내용은 여기에서 Sizzle 위키를 확인하세요 .


당신은 생명의 은인입니다. 감사.
Matrym 2010

3
이것이 무엇을하고 있는지 정확히 말할 수있는 기회가 있습니까?
Abe Miessler 2011 년

4
@ClovisSix-고마워요, 1.8+ 방법을 제공했습니다. 문제가 있으면 알려주세요.
Nick Craver

1
이것은 대체하지 않는다는 점에 유의하십시오. : contains 다른 선택기를 추가하십시오 : Contains.
albanx 2014 년

3
선택자는 icontains, 또는 이와 유사한 것으로 호출되어야합니다 .
Sebastian

43

대답은 정확하지만 예상치 못한 동작을 유발할 수 :Contains있는 별칭 :contains(또는 민감하고 민감하지 않은 검색을 모두 필요로하는 고급 응용 프로그램을 위해 디자인에 의해 사용될 수 있음) 만 포함한다는 점에 주목할 가치가 있습니다.

별칭에 대한 확장명을 복제하여 해결할 수 있습니다.

jQuery.expr[':'].Contains = function(a, i, m) { 
  return jQuery(a).text().toUpperCase().indexOf(m[3].toUpperCase()) >= 0; 
};
jQuery.expr[':'].contains = function(a, i, m) { 
  return jQuery(a).text().toUpperCase().indexOf(m[3].toUpperCase()) >= 0; 
};

왜 그것이 나를 위해 작동하지 않는지 알아내는 데 시간이 걸렸습니다.


나는 이것을 위에서 언급했을 것이지만 분명히 나는 ​​할 수 없습니다.
Ellipsis 2011

5
여기서 뭘 얻고 있는지 잘 모르겠습니다. 이는의 예상되고 문서화 된 동작을 재정의합니다 :contains. 원본은 그대로두고 :contains새 선택기를 호출 하는 것이 더 분명하다고 생각합니다 :icontains.
저스틴 포스

5
그것은 내 게시물의 요점 옆에 있습니다. 대체 선택기를 만드는 것은 확실히 유효한 옵션이지만 : contains를 확장하지만 : Contains를 확장하지 않으면 다른 결과가 나올 때 사용자 혼란을 초래할 수 있음을 지적했습니다.
Ellipsis

1
그렇다면이 "gotcha"를 공유해 주셔서 감사합니다. :) 그래도 비파괴적인 병렬 동작을 구축하는 작업이 적을 때 기본 제공 동작을 재정의하지 않는 것이 더 낫다는 것을 언급하는 것이 좋습니다.
Justin Force

나는 이것을 위해 게시 된 몇 가지 다른 솔루션을 시도했지만 마침내 작동했습니다. 감사.
taylor michels 2014 년


6

늦어도 ....하지만,

이쪽으로 가고 싶어요 ..

$.extend($.expr[":"], {
"MyCaseInsensitiveContains": function(elem, i, match, array) {
return (elem.textContent || elem.innerText || "").toLowerCase().indexOf((match[3] || "").toLowerCase()) >= 0;
}
});

이렇게하면 jQuery의 NATIVE '.contains'를 조작 하지 마십시오. 나중에 기본값이 필요할 수 있습니다 ... 조작하면 stackOverFlow로 돌아갈 수 있습니다 .


0

내 친구를 추가 할 수 있습니다.

$.expr[":"].containsNoCase = function (el, i, m) { 
    var search = m[3]; 
    if (!search) return false; 
    return eval("/" + search + "/i").test($(el).text()); 
}; 

0

아래 코드를 사용하여 원하는 것을 얻기 위해 jQuery의 대소 문자 구분을 모두 무시할 수있었습니다.

            $.expr[":"].contains = $.expr.createPseudo(function(arg) {
            return function( elem ) {
                return $(elem).text().toUpperCase().indexOf(arg.toUpperCase()) >= 0;
            };
        });

이 링크를 사용하여 https://css-tricks.com/snippets/jquery/make-jquery-contains-case-insensitive/에서 대소 문자 구분을 무시하는 jQuery 버전을 기반으로 코드를 찾을 수 있습니다.

또한 : contains를 사용하고 검색을하려면 http://technarco.com/jquery/using-jquery-search-html-text-and-show-or-hide-를 살펴볼 수 있습니다. 따라서

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.