Menggunakan pemilih 'dimulai dengan' pada nama kelas individual

158

Jika saya memiliki yang berikut ini:

<div class="apple-monkey"></div>
<div class="apple-horse"></div>
<div class="cow-apple-brick"></div>

Saya dapat menggunakan pemilih berikut untuk menemukan dua DIV pertama:

$("div[class^='apple-']")

Namun, jika saya memiliki ini:

<div class="some-other-class apple-monkey"></div>
<div class="apple-horse"></div>
<div class="cow-apple-brick"></div>

Ini hanya akan menemukan DIV kedua, karena kelas div pertama dikembalikan sebagai string (saya pikir) dan tidak benar-benar dimulai dengan 'apple-' melainkan 'some-'

Salah satu cara untuk tidak menggunakan dimulai dengan, tetapi berisi:

$("div[class*='apple-']")

Masalahnya adalah itu juga akan memilih DIV ke-3 dalam contoh saya.

Pertanyaan: Melalui jQuery, apa cara yang tepat untuk menggunakan pemilih predikat pada nama kelas individu, dan bukan seluruh atribut kelas sebagai string? Apakah ini hanya masalah meraih CLASS, kemudian membaginya menjadi sebuah array dan kemudian mengulang setiap individu dengan regex? Atau apakah ada solusi yang lebih elegan / kurang bertele-tele?

DA.
sumber

Jawaban:

304

Kelas yang dimulai dengan "apple-" plus kelas yang berisi "apple-"

$("div[class^='apple-'],div[class*=' apple-']")
Josh Stodola
sumber
5
+1. Meskipun saya setuju dengan saran @parrots bahwa "apel" harus kelasnya sendiri di sini, karena jelas tumpang tindih beberapa div namun merupakan entitas yang berbeda. Tapi ini memang memecahkan masalah.
jvenema
Hmm ... pintar! Saya tidak pernah berpikir untuk menggunakan ruang di sana. Bisakah satu menggunakan operator boolean di pemilih jquery? Idealnya, di atas akan menjadi 'ATAU' untuk menghindari kasus (jarang dan mungkin dapat dihindari) di mana ada lebih dari satu kelas yang menatap 'apel-'
DA.
Tidak yakin saya mengerti, tetapi jika Anda hanya ingin menggunakan pemilih kedua ketika pemilih pertama mengembalikan nol elemen, Anda bisa melakukan sesuatu seperti ini: var divs = $("div[class^='apple-']"); if(divs.length == 0) divs = $("div[class*=' apple-']");
Josh Stodola
sekarang saya berpikir tentang itu, solusi awal Anda berfungsi dengan baik. DIV yang memiliki kelas seperti "apple-brick apple-horse" masih akan hanya dipilih sekali ke objek jQuery.
DA.
gunakan * alih-alih div jika Anda tidak membatasi kelas untuk elemen tertentu :)
Hidayt Rahman
13

Saya akan merekomendasikan membuat "apel" kelasnya sendiri. Anda harus menghindari permulaan-dengan / akhir-dengan jika Anda bisa karena bisa memilih menggunakan div.appleakan jauh lebih cepat. Itu solusi yang lebih elegan. Jangan takut untuk membagi hal-hal menjadi kelas yang terpisah jika itu membuat tugas lebih mudah / lebih cepat.

Bayan
sumber
Bagaimana menurut Anda itu akan jauh lebih cepat? Masih harus memindai seluruh DOM dan mengevaluasi atribut kelas. Ini akan menjadi sedikit lebih cepat (paling-paling) karena itu tidak harus substring atribut kelas. Dapat diabaikan.
Josh Stodola
2
componenthouse.com/article-19 : Jika Anda melihat bagian get by class, menggunakan sintaks dot biasa biasanya sedikit lebih cepat daripada memperlakukan kelas sebagai atribut. Tambahkan pencarian substring (dan pekerjaan tambahan yang harus dia lakukan untuk membagi elemen dengan beberapa nama kelas) dan itu akan menambah penghematan kinerja yang layak.
Burung beo
1
Saya setuju. Tangkapannya adalah bahwa kami masih sangat mendukung IE6 dan tidak mendukung pemilih selektif di CSS: .class1.class2.class3, kami mengandalkan penggunaan nama kelas yang lebih panjang di mana 'parameter' dibagi dengan tanda hubung.
DA.
6

ini untuk awalan dengan

$("div[class^='apple-']")

ini untuk permulaan sehingga Anda tidak perlu memiliki '-' char di sana

$("div[class|='apple']")

Anda dapat menemukan banyak variasi keren lainnya dari pemilih jQuery di sini https://api.jquery.com/category/selectors/

Mexicoder
sumber
6

Sementara jawaban teratas di sini adalah solusi untuk kasus khusus si penanya, jika Anda mencari solusi untuk benar-benar menggunakan 'dimulai dengan' pada nama kelas individual:

Anda dapat menggunakan pemilih jQuery khusus ini, yang saya sebut :acp()"Awalan Kelas." Kode ada di bagian bawah posting ini.

var test = $('div:acp("starting_text")');

Ini akan memilih setiap dan semua <div>elemen yang memiliki setidaknya satu nama kelas yang diawali dengan string yang diberikan ("starting_text" dalam contoh ini), terlepas dari apakah kelas itu di awal atau di tempat lain di string atribut kelas.

<div id="1" class="apple orange lemon" />
<div id="2" class="orange applelemon banana" />
<div id="3" class="orange lemon apple" />
<div id="4" class="lemon orangeapple" />
<div id="5" class="lemon orange" />

var startsWithapp = $('div:acp("app")');

Ini akan mengembalikan elemen 1, 2, dan 3, tetapi tidak 4 atau 5.

Berikut deklarasi untuk :acppemilih khusus, yang dapat Anda tempatkan di mana saja:

$(function(){
    $.expr[":"].acp = function(elem, index, m){
          var regString = '\\b' + m[3];
          var reg = new RegExp(regString, "g");
          return elem.className.match(reg);
    }
});

Saya membuat ini karena saya melakukan banyak peretasan situs GreaseMonkey di mana saya tidak memiliki kontrol backend, jadi saya sering perlu menemukan elemen dengan nama kelas yang memiliki sufiks dinamis. Sudah sangat berguna.

pengguguran
sumber
2

Coba ini:

$("div[class]").filter(function() {
    var classNames = this.className.split(/\s+/);
    for (var i=0; i<classNames.length; ++i) {
        if (classNames[i].substr(0, 6) === "apple-") {
            return true;
        }
    }
    return false;
})
Gumbo
sumber
2
<div class="apple-monkey"></div>
<div class="apple-horse"></div>
<div class="cow-apple-brick"></div>

dalam hal ini sebagai pertanyaan, Josh Stodola menjawab dengan benar Kelas yang dimulai dengan "apple-" plus kelas yang berisi "apple-"

$("div[class^='apple-'],div[class*=' apple-']")

tetapi jika elemen memiliki beberapa kelas seperti ini

<div class="some-class apple-monkey"></div>
<div class="some-class apple-horse"></div>
<div class="some-class cow-apple-brick"></div>

maka solusi Josh Stodola tidak akan berhasil
karena ini harus melakukan hal seperti ini

$('.some-parent-class div').filter(function () {
  return this.className.match(/\bapple-/);// this is for start with
  //return this.className.match(/apple-/g);// this is for contain selector
}).css("color","red");

mungkin itu membantu orang lain, terima kasih

code.rider
sumber
0

Jika suatu elemen memiliki kelas kelipatan "[class ^ = 'apple-']" tidak bisa berfungsi, misalnya

<div class="fruits apple-monkey"></div>
Ramón Mtz
sumber
OP memang menyebutkan ini dalam pertanyaan.
Angsa