대소 문자를 구분하지 않는 jQuery가 있습니까 : 선택기가 포함되어 있습니까?


145

대소 문자를 구분하지 않는 버전의 jQuery 선택기 가 포함되어 있습니까? 아니면 모든 요소를 ​​반복하고 .text ()를 내 문자열과 비교하여 수동으로 작업해야합니까?


2
jQuery 8.1 +의 경우이 답변을
Praveen

1
^ 그것은 8.1이 아니라 1.8.1입니다.
TylerH

여기 좋은 예 입니다.
劉鎮 瑲

답변:


125

내가 jQuery 1.2를 위해했던 일은 다음과 같습니다.

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

이것은 jquery를 확장하여 : 대소 문자를 구분하지 않는 선택자를 포함하고 : contains 선택기를 변경하지 않고 유지합니다.

편집 : jQuery 1.3 (@ user95227 덕분) 이상이 필요합니다.

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

편집 : 분명히 사용하여 DOM에 직접 액세스

(a.textContent || a.innerText || "") 

대신에

jQuery(a).text()

앞의 표현에서는 속도가 상당히 빨라지므로 속도가 문제가되면 위험을 감수하십시오. ( @John질문 참조 )

최신 편집 : jQuery 1.8의 경우 다음과 같아야합니다.

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

@Pat 및 jQuery 1.3에 대해 설명 된 솔루션이 1.4.3에서도 작동한다는 것을 사람들에게 알리고 싶었습니다.
Jim Ade

링크가 삭제 된 이후
@John

jQuery 1.8에서는 작동하지 않습니다. 업데이트 된 버전은 아래 seagullJS의 답변을 참조하십시오.- stackoverflow.com
Matt Browne

105

선택적으로 대소 문자를 구분하지 않으려면 다음을 수행하십시오. http://bugs.jquery.com/ticket/278

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

:containsi대신에 사용:contains


3
새 기능을 추가하는 것이 나에게 덮어 쓰는 것보다 가장 좋습니다. 이제이 옵션을 사용합니다 (매력처럼 작동)
GôTô

22
이것은 표준 jquery 라이브러리에 추가되어야합니다
user482594

41

jQuery 1.3부터는이 메소드가 더 이상 사용되지 않습니다. 이 기능을 사용하려면 함수로 정의해야합니다.

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

38

누군가 (나 같은) 관심이 있다면 포함 정의 에서 am [3]의 의미는 무엇입니까 ?


KEY / LEGEND : 선택기 정의에 사용하기 위해 jQuery에서 사용할 수있는 매개 변수 :

r = 면밀히 조사되는 요소의 jQuery 배열. (예 : r.length = 요소 수)

저는 어레이 내에 현재 주목 받고 요소의 인덱스 = R .

a = 현재 감시중인 요소. 선택기 명령문은 일치하는 결과에 포함 시키려면 true를 리턴해야합니다.

m [2] = 우리가 찾고있는 nodeName 또는 * (콜론의 왼쪽).

m [3] = 매개 변수가 : selector (param)에 전달되었습니다. 일반적으로하는 인덱스 번호 : n 번째의 식 (5) , 또는 같은 문자열 : 색 (파란색) .


31

jQuery 1.8에서는 다음을 사용해야합니다.

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

2
고마워요! 1.8로 방금 업데이트되어 작동이 중지되었습니다.
Andreas

3
업데이트 감사합니다. 그냥 JQuery와 1.8로 업데이트가 작동 중지
Wasim

15

약간 더 빠르게 수행되고 정규 표현식을 허용 하는 변형은 다음과 같습니다 .

jQuery.extend (
    jQuery.expr[':'].containsCI = function (a, i, m) {
        //-- faster than jQuery(a).text()
        var sText   = (a.textContent || a.innerText || "");     
        var zRegExp = new RegExp (m[3], 'i');
        return zRegExp.test (sText);
    }
);



대소 문자를 구분하지 않을뿐만 아니라 다음과 같은 강력한 검색을 허용합니다.

  • $("p:containsCI('\\bup\\b')") ( "위"또는 "위"와 일치하지만 "위", "위상"등은 일치하지 않습니다.)
  • $("p:containsCI('(?:Red|Blue) state')") ( "적색 상태"또는 "청색 상태"와 일치하지만 "업 상태"등은 일치하지 않습니다.)
  • $("p:containsCI('^\\s*Stocks?')") "주식"또는 "주식"과 일치하지만 단락의 시작 부분에서만 시작합니다 (앞의 공백은 무시).

11

늦을지도 모르지만 ...

이런 식으로 가고 싶습니다 ..

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

이 방법을 사용하면 NOT DO jQuery의 NATIVE와 변조 '.contains' 당신이 무단으로 변경하는 경우 기본 하나 나중에 ... 다시 자신을 찾을 수 있습니다해야 할 수도 있습니다 ... 유래 ...


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

업데이트 코드는 1.3에서 훌륭하게 작동하지만 이전 예제와 달리 첫 글자의 "포함"은 소문자 여야합니다.


1
나는이 양 있도록 별개의 기능을 원 생각 :contains하고 :Contains것 두 작업을 동시에.
joshperry

": : 선택기가 포함되어 있습니다."
Harry B

4

HTML 코드에서 대소 문자 구분을 무시하고 텍스트를 찾으려면 ": contains"를 사용하려면 아래를 참조하십시오.

 $.expr[":"].contains = $.expr.createPseudo(function(arg) {
            return function( elem ) {
                return $(elem).text().toUpperCase().indexOf(arg.toUpperCase()) >= 0;
            };
        });
        $("#searchTextBox").keypress(function() {
          if($("#searchTextBox").val().length > 0){
            $(".rows").css("display","none");
            var userSerarchField = $("#searchTextBox").val();
            $(".rows:contains('"+ userSerarchField +"')").css("display","block");
          } else {
            $(".rows").css("display","block");
          }              
        });

이 링크를 사용하여 jquery 버전에 따라 대소 문자 무시 코드를 찾을 수 있습니다. Make jQuery : 대소 문자를 구분하지 않습니다.


2

정규식을 사용하는 더 빠른 버전입니다.

$.expr[':'].icontains = function(el, i, m) { // checks for substring (case insensitive)
    var search = m[3];
    if (!search) return false;

    var pattern = new RegExp(search, 'i');
    return pattern.test($(el).text());
};

잘 했어! 대단히 감사합니다. 나는 이것이이 질문에 대한 가장 좋은 최신 응답이라고 생각합니다.
mavrosxristoforos

0

다음과 같이 작동하지 않는 비슷한 문제가 발생했습니다 ...

// This doesn't catch flac or Flac
$('div.story span.Quality:not(:contains("FLAC"))').css("background-color", 'yellow');

이것은 확장이 필요없이 작동합니다.

$('div.story span.Quality:not([data*="flac"])').css("background-color", 'yellow');

이것도 작동하지만 "수동 루프"범주에 해당합니다.

$('div.story span.Quality').contents().filter(function()
{
  return !/flac/i.test(this.nodeValue);
}).parent().css("background-color", 'yellow');

0

새로운 변수 이름을 subString으로 지정하고 검색하려는 문자열을 일부 요소 텍스트에 넣습니다. 그런 다음 Jquery 선택기 select 요소를 사용하여 예 $("elementsYouNeed")와 같이 필터링하고 필터링하십시오 .filter(). 에서 .filter()각 요소를 $("elementsYouNeed")함수와 비교 합니다.

.toLowerCase()요소 텍스트에 사용하는 함수에서 subString은 대소 문자를 구분하지 않고 subString이 있는지 확인할 수 있습니다. 그런 다음이 .filter()메소드는 일치하는 요소의 서브 세트에서 새 jQuery 오브젝트를 구성합니다.

이제 matchObjects에서 match 요소를 가져 와서 원하는대로 수행 할 수 있습니다.

var subString ="string you want to match".toLowerCase();

var matchObjects = $("elementsYouNeed").filter(function () {return $(this).text().toLowerCase().indexOf(subString) > -1;});
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.