Büyük / küçük harfe duyarlı olmayan bir jQuery: içerir seçici var mı?


Yanıtlar:


127

JQuery 1.2 için yaptığım şey:

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

Bu, jquery'yi bir: Büyük / küçük harfe duyarlı olmayan bir seçici içerir,: içerir seçicisi değişmeden kalır.

Düzenleme: jQuery 1.3 (teşekkürler @ user95227) ve sonrası için ihtiyacınız olan

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

Düzenleme: Görünüşe göre DOM'a doğrudan erişim

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

onun yerine

jQuery(a).text()

Önceki ifadede bunu önemli ölçüde hızlandırır, bu nedenle hız önemliyse kendi sorumluluğunuzda deneyin. ( @John 'un sorusuna bakın )

Son düzenleme: jQuery 1.8 için şöyle olmalıdır:

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

Sadece, @Pat ve diğerleri tarafından jQuery 1.3 için açıklanan çözümün 1.4.3 için de işe yaradığını bilmelerini istedim.
Jim Ade

Buradaki bağlantı silindiğinden beri @ John'un sorusuna / cevabına bağlantı: stackoverflow.com/questions/1407434/…
Mottie

Bu jQuery 1.8 için çalışmaz. Güncellenmiş bir sürüm için aşağıdaki martı JS'nin cevabına bakın - stackoverflow.com/a/12113443/560114
Matt Browne

105

İsteğe bağlı olarak büyük / küçük harfe duyarlı olmamak için: 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;
  }
});

o zaman :containsiyerine kullanın:contains


3
yeni bir işlev eklemek benim için üzerine
yazmaktan

22
bu standart jquery kitaplığına
eklenmelidir

41

JQuery 1.3'ten itibaren bu yöntem kullanımdan kaldırılmıştır. Bunun çalışması için bir işlev olarak tanımlanması gerekir:

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

38

Birisi (benim gibi) ilgileniyorsa , İçerir tanımında a ve m [3] ne anlama gelir ?


ANAHTAR / AÇIKLAMALAR: jQuery tarafından seçici tanımlarında kullanılmak üzere sunulan parametreler:

r = jQuery incelenmekte olan öğeler dizisi. (örneğin: r.length = Eleman sayısı)

i = r dizisi içinde şu anda incelenmekte olan öğenin dizini .

a = öğesi şu anda inceleniyor. Seçici ifadesi, onu eşleşen sonuçlarına dahil etmek için true döndürmelidir.

m [2] = aradığımız düğümAdı veya * (iki nokta üst üste).

m [3] = param: seçiciye (param) geçirildi. Tipik olarak : nth-of-type (5) ' deki gibi bir dizin numarası veya : color (blue) gibi bir dize .


32

JQuery 1.8'de kullanmanız gerekecek

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

2
Mükemmel çalıştı, teşekkürler! Sadece 1.8'e güncellendi ve bu çalışmayı durdurdu.
Andreas

3
güncelleme için thanx. JQuery 1.8'e yeni güncellendi ve çalışmayı durdurdu
Wasim

15

Biraz daha hızlı performans gösteren ve normal ifadelere de izin veren bir varyasyon :

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);
    }
);



Bu yalnızca büyük / küçük harfe duyarlı olmakla kalmaz, aynı zamanda aşağıdaki gibi güçlü aramalara da olanak tanır:

  • $("p:containsCI('\\bup\\b')") ("Yukarı" veya "yukarı" ile eşleşir ancak "yukarı", "uyandırma" vb. İle eşleşmez.)
  • $("p:containsCI('(?:Red|Blue) state')") ("Kırmızı durum" veya "mavi durum" ile eşleşir ancak "yukarı durum" vb. İle eşleşmez)
  • $("p:containsCI('^\\s*Stocks?')") ("Hisse senedi" veya "hisse senetleri" ile eşleşir, ancak yalnızca paragrafın başlangıcında (baştaki herhangi bir boşluk yok sayılır).)

11

Geç olabilir ... ama,

Bu yoldan gitmeyi tercih ederim ..

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

Bu şekilde, DO NOT jQuery'nin YERLİ ile kurcalamaya ' .Contains' Sen tahrif varsayılan bir sonraki ..., geri kendinizi bulabilirsiniz gerekebilir ... StackOverflow'daki ...


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

Güncelleme kodu 1.3'te harika çalışıyor, ancak "içerir" ifadesi önceki örnekten farklı olarak ilk harfte küçük harf olmalıdır.


1
Onun hem böylece ayrı bir işlevi istediğini düşünüyorum :containsve :Containsolur her iki çalışma eş zamanlı olarak.
joshperry

": içerir seçicisi değişmeden kalır."
Harry B

4

Bir HTML kodundan gelen büyük / küçük harfe duyarlılığı yok sayan metni bulmak için ": içerir" ifadesini kullanmak için aşağıya bakın,

 $.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");
          }              
        });

Bu bağlantıyı, jquery sürümünüze göre kodu yok sayan durumu bulmak için de kullanabilirsiniz, Make jQuery: Büyük / Küçük Harfe Duyarlı Değildir


3

Normal ifadeler kullanan daha hızlı bir sürüm.

$.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());
};

Harika iş! Çok teşekkür ederim. Bu soruya verilecek en iyi ve en güncel cevabın bu olduğuna inanıyorum.
mavrosxristoforos

0

Aşağıdaki çalışmama ile benzer bir sorun yaşadım ...

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

Bu, bir uzantıya ihtiyaç duymadan çalışır

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

Bu da işe yarıyor, ancak muhtemelen "manuel döngü" kategorisine giriyor ...

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

0

Yeni bir değişken Ben ona subString adını veriyorum ve bazı elemanlar metninde aramak istediğiniz dizgeyi koyuyorum. Sonra Jquery seçici kullanarak örneğim gibi ihtiyacınız olan öğeleri seçin $("elementsYouNeed")ve buna göre filtreleyin .filter(). İçinde .filter()her bir öğeyi $("elementsYouNeed")işlevle karşılaştıracaktır.

İ .toLowerCase()element metni için kullanma işlevinde ayrıca büyük / küçük harfe duyarlı koşulu önleyebilen ve içinde bir alt dizge olup olmadığını kontrol edebilen subString. Bundan sonra .filter()yöntem, eşleşen öğelerin bir alt kümesinden yeni bir jQuery nesnesi oluşturur.

Artık matchObjects'teki eşleştirme öğelerini alabilir ve istediğinizi yapabilirsiniz.

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

var matchObjects = $("elementsYouNeed").filter(function () {return $(this).text().toLowerCase().indexOf(subString) > -1;});
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.