JQuery Contains'i jQuery 1.8+ dahil olmak üzere büyük / küçük harfe duyarlı hale nasıl getirebilirim?


91

Duyarsız bir şekilde "içerir" kutusunu kullanmaya çalışıyorum. Çözümü aşağıdaki stackoverflow sorusunda kullanmayı denedim, ancak işe yaramadı:

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

Kolaylık sağlamak için çözüm burada kopyalanmıştır:

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

İşte hata:

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

İşte onu kullandığım yer:

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

Aynı senaryoda orijinal büyük / küçük harfe duyarlı "içerir" ifadesini kullanmam herhangi bir hata olmadan çalışıyor. Herhangi bir fikri olan var mı? Memnuniyet duydum.


Vaka kimse ilgileniyor, benim güncelledik blog yazısı ek üç seçicileri içermektedir üzerine :containsExact, :containsExactCaseve :containsRegexjQuery tüm sürümlerinde artık işe seçiciler.
Mottie


Bence .filter () başka bir iyi yol. Referans
劉鎮 瑲

Yanıtlar:


127

Mevcut bir projede kullandığım şey bu, herhangi bir sorun yaşamadım. Bu formatla daha iyi şansınız olup olmadığına bakın:

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

JQuery 1.8'de bunun için API değişti, bunun jQuery 1.8+ sürümü şöyle olurdu:

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

Burada test edebilirsiniz . 1.8+ özel seçici hakkında daha fazla ayrıntı için, buradan Sizzle wiki'ye göz atın .


Sen bir hayat kurtarıcısın. Teşekkürler.
Matrym

3
Bunun tam olarak ne yaptığı hakkında konuşma şansın var mı?
Abe Miessler

4
@ClovisSix - uyarı için teşekkürler, 1.8+ aynı şeyi yapmanın bir yöntemini sağladım, herhangi bir sorununuz olursa bana bildirin.
Nick Craver

1
Bunun yerine geçmediğini unutmayın: içerir sadece başka bir seçici ekleyin: İçerir.
albanx

3
seçici icontainsveya benzer bir şey çağrılmalıdır .
Sebastian

43

Cevabın doğru olduğunu, ancak beklenmedik davranışlara yol açabilecek (veya hem hassas hem de duyarsız arama gerektiren gelişmiş uygulamalar için tasarım tarafından kullanılabilecek) :Containsdiğer adı değil, yalnızca kapsadığını :containsbelirtmek gerekir.

Bu, takma adın uzantısının çoğaltılmasıyla çözülebilir:

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

Neden benim için işe yaramadığını anlamam biraz zaman aldı.


Bunu yukarıda yorumlardım ama görünüşe göre yapamıyorum.
Ellipsis

5
Burada ne elde ettiğinden emin değilim. Bu, beklenen, belgelenmiş davranışını geçersiz kılar :contains. Orijinali :containsrahat bırakıp yeni seçicinizi aramanızın daha net olduğunu düşünüyorum :icontains.
Justin Force

5
Yazımın amacı bu değil. Alternatif bir seçici oluşturmak kesinlikle geçerli bir seçenektir, ancak ben genişletme: içerir, ancak genişletmeyi ihmal ettim: İçerir, farklı sonuçlar verdiğinde kullanıcının kafa karışıklığına yol açabilir.
Ellipsis

1
Öyleyse bu "getcha" yı paylaştığınız için teşekkür ederiz. :) Yine de, tahribatsız, paralel bir davranış oluşturmak için daha az çaba harcarken yerleşik davranışı geçersiz kılmamanın daha iyi olduğunu belirtmenin iyi bir fikir olduğunu düşünüyorum.
Justin Force

Bunun için yayınlanan birkaç farklı çözümü denedim ve bu sonunda işe yaradı. Teşekkürler.
taylor michels

27

Böyle bir şey yapardım

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

Ve :containsYalnız Bırakın ...

DEMO

Peki jQuery neden kütüphanesinde onu desteklemiyor ?! eğer o kadar kolaysa ...

çünkü kodunuz türkiye kodunu geçiyor mu?


6

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 ...


0

arkadaşlarımı eklememe izin vereceğim:

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

0

Aşağıdaki kodu kullanarak istediğimi elde etmek için jQuery'nin büyük / küçük harf duyarlılığını tamamen görmezden gelebildim:

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

Büyük / küçük harfe duyarlılığı yok saymak için jQuery sürümlerinize dayalı kod bulmak için bu bağlantıyı kullanabilirsiniz, https://css-tricks.com/snippets/jquery/make-jquery-contains-case-insensitive/

Ayrıca şunu kullanmak istiyorsanız: içerir ve bazı arama yapın, şuna bir göz atmak isteyebilirsiniz: http://technarco.com/jquery/using-jquery-search-html-text-and-show-or-hide- buna göre

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.