Apakah ada case jQuery yang tidak sensitif: mengandung pemilih?


Jawaban:


125

Apa yang akhirnya saya lakukan untuk jQuery 1.2 adalah:

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

Ini akan memperluas jquery untuk memiliki: Berisi pemilih yang tidak peka huruf besar-kecil, pemilih: berisi tetap tidak berubah.

Sunting: Untuk jQuery 1.3 (terima kasih @ user95227) dan nanti Anda butuhkan

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

Sunting: Rupanya mengakses DOM secara langsung dengan menggunakan

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

dari pada

jQuery(a).text()

Dalam ungkapan sebelumnya, tingkatkan kecepatannya jadi cobalah risiko Anda sendiri jika kecepatan adalah masalah. (lihat @ John 's pertanyaan )

Suntingan terbaru: Untuk jQuery 1.8 seharusnya:

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

Hanya ingin memberi tahu orang bahwa solusi seperti yang dijelaskan oleh @Pat dan lainnya untuk jQuery 1.3 juga berfungsi untuk 1.4.3.
Jim Ade

Tautan ke
@Jawaban

Ini tidak berfungsi untuk jQuery 1.8. Lihat jawaban seagullJS di bawah ini untuk versi yang diperbarui - stackoverflow.com/a/12113443/560114
Matt Browne

105

Untuk membuatnya opsional case-sensitive: 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;
  }
});

lalu gunakan :containsisebagai ganti:contains


3
menambahkan fungsi baru lebih baik daripada menimpa saya, sekarang saya menggunakan opsi ini (berfungsi seperti pesona)
GôTô

22
ini harus ditambahkan ke perpustakaan jquery standar
user482594

41

Pada jQuery 1.3, metode ini sudah usang. Agar ini berfungsi, harus didefinisikan sebagai fungsi:

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

38

Jika seseorang (seperti saya) tertarik dengan arti a dan m [3] dalam definisi Berisi .


KEY / LEGENDA: Params disediakan oleh jQuery untuk digunakan dalam definisi pemilih:

r = jQuery array elemen yang diteliti. (mis: r.length = Jumlah elemen)

i = indeks elemen yang sedang diteliti, dalam array r .

a = elemen saat ini sedang dalam pengawasan. Pernyataan pemilih harus mengembalikan true untuk memasukkannya dalam hasil yang cocok.

m [2] = nodeName atau * yang kita cari (kiri dari titik dua).

m [3] = param diteruskan ke: selector (param). Biasanya nomor indeks, seperti pada : n-of-type (5) , atau string, seperti dalam : warna (biru) .


31

Di jQuery 1.8 Anda harus menggunakan

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

2
Bekerja dengan baik, terima kasih! Baru saja diperbarui menjadi 1,8 dan ini berhenti berfungsi.
Andreas

3
thanx untuk pembaruan. Baru saja diperbarui ke JQuery 1.8 dan berhenti berfungsi
Wasim

15

Variasi yang tampaknya berkinerja lebih cepat dan yang juga memungkinkan ekspresi reguler adalah:

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



Tidak hanya case-insensitive, tetapi ini memungkinkan pencarian yang kuat seperti:

  • $("p:containsCI('\\bup\\b')") (Cocokkan "Naik" atau "naik", tetapi bukan "atas", "bangun", dll.)
  • $("p:containsCI('(?:Red|Blue) state')") (Cocokkan "red state" atau "blue state", tetapi bukan "up state", dll.)
  • $("p:containsCI('^\\s*Stocks?')") (Cocokkan "stok" atau "stok", tetapi hanya pada awal paragraf (mengabaikan spasi putih terkemuka).)

11

Mungkin terlambat .... tapi,

Saya lebih suka pergi dengan cara ini ..

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

Dengan cara ini, Anda TIDAK mengutak-atik jQuery's NATIVE '.contains' ... Anda mungkin memerlukan yang default nanti ... jika diubah, Anda mungkin menemukan diri Anda kembali ke stackOverFlow ...


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

Kode pembaruan berfungsi baik dalam 1.3, tetapi "mengandung" huruf kecil pada huruf pertama tidak seperti contoh sebelumnya.


1
Saya pikir dia menginginkan fungsi yang berbeda sehingga keduanya :containsdan :Containsakan bekerja secara bersamaan.
joshperry

"the: berisi pemilih tetap tidak berubah."
Harry B

4

Lihat di bawah untuk menggunakan ": berisi" untuk menemukan teks yang mengabaikan sensitivitas case-nya dari kode HTML,

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

Anda juga dapat menggunakan tautan ini untuk menemukan kode pengabaian case berdasarkan versi jquery Anda, Make jQuery: mengandung Case-Insensitive


2

Versi yang lebih cepat menggunakan ekspresi reguler.

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

Kerja bagus! Terima kasih banyak. Saya percaya bahwa ini adalah jawaban terbaik dan terbaru untuk pertanyaan ini.
mavrosxristoforos

0

Saya memiliki masalah serupa dengan yang berikut ini yang tidak berfungsi ...

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

Ini berfungsi dan tanpa perlu perpanjangan

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

Ini juga berfungsi, tetapi mungkin termasuk dalam kategori "pengulangan manual" ....

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

0

Variabel baru saya beri nama subString dan masukkan string yang ingin Anda cari di beberapa elemen teks. Kemudian menggunakan elemen pilih pemilih Jquery yang Anda butuhkan seperti contoh saya $("elementsYouNeed")dan filter oleh .filter(). Di .filter()dalamnya akan membandingkan setiap elemen $("elementsYouNeed")dengan fungsi.

Dalam fungsi yang saya gunakan .toLowerCase()untuk elemen teks juga subString yang dapat menghindari kondisi case sensitif dan memeriksa apakah ada subString di dalamnya. Setelah itu .filter()metode membangun objek jQuery baru dari subset elemen yang cocok.

Sekarang Anda bisa mendapatkan elemen kecocokan di matchObjects dan melakukan apa pun yang Anda inginkan.

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

var matchObjects = $("elementsYouNeed").filter(function () {return $(this).text().toLowerCase().indexOf(subString) > -1;});
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.