Bireysel sınıf adlarında 'şununla başlar' seçicisini kullanma


158

Eğer aşağıdakilere sahipsem:

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

İlk iki DIV'yi bulmak için aşağıdaki seçiciyi kullanabilirim:

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

Ancak, ben varsa:

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

İlk div'in sınıfı bir dize olarak döndürüldüğünden ve aslında 'apple-' ile değil, '' some-

Bunun bir yolu kullanmamaktır, bunun yerine şunları içerir:

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

Buradaki sorun, örneğimde 3. DIV'yi de seçecek olması.

Soru: jQuery aracılığıyla, tüm sınıf özniteliğini dize olarak değil, tek tek sınıf adlarında yüklem seçicileri kullanmanın doğru yolu nedir? Sadece SINIF kapmak, sonra bir diziye bölmek ve daha sonra her bir regex ile döngü meselesi midir? Yoksa daha zarif / daha az ayrıntılı bir çözüm var mı?

Yanıtlar:


304

"Apple-" ile başlayan sınıflar ve "apple-" içeren sınıflar

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

5
+1. @Parrots'un "elmanın" burada kendi sınıfı olması gerektiği fikrini kabul etsem de, açıkçası birden fazla div ile örtüşüyor, ancak farklı bir varlık. Ama bu sorunu çözüyor.
jvenema

Hmm ... zeki! Orada yer kullanmayı düşünmemiştim. Bir jquery seçicide boolean operatörleri kullanılabilir mi? İdeal olarak, yukarıdaki 'apple-'
DA

Anladığımdan emin değilim, ancak ikinci seçiciyi yalnızca ilk seçici sıfır öğe döndürdüğünde kullanmak istiyorsanız, şöyle bir şey yapabilirsiniz: var divs = $("div[class^='apple-']"); if(divs.length == 0) divs = $("div[class*=' apple-']");
Josh Stodola

şimdi düşünüyorum, ilk çözüm iyi çalışıyor. "Elma-tuğla elma-atı" gibi bir sınıfa sahip bir DIV hala bir kez jQuery nesnesine seçilecekti.
DA.

Belirli bir öğe için sınıf sınırlamıyorsanız div yerine * kullanın :)
Hidayt Rahman

13

Kendi sınıfında "elma" yapmayı öneriyorum. Kullanmayı seçebilmeniz div.appleçok daha hızlı olacağından , eğer / ile-ile başlangıçtan kaçınmalısınız . Bu daha zarif bir çözüm. Görevi daha basit / daha hızlı yaparsa, işleri ayrı sınıflara bölmekten korkmayın.


Bunun daha hızlı olacağını nasıl anlarsınız? Hala tüm DOM'u taramalı ve sınıf niteliğini değerlendirmelidir. Sınıf özniteliğini alt dizeye almak zorunda kalmayacağı için marjinal olarak daha hızlı olurdu (en iyi ihtimalle). İhmal edilebilir.
Josh Stodola

2
componenthouse.com/article-19 : Sınıfa göre alma bölümüne bakarsanız, normal nokta sözdizimini kullanmak genellikle sınıfı öznitelik olarak değerlendirmekten daha iyi bir bittir. Alt dize aramasını (ve birden fazla sınıf adı olan öğeleri ayırmak için yapması gereken ek işi) ekleyin ve iyi bir performans tasarrufu elde edin.
Papağanlar

1
Katılıyorum. Yakalama şu ki, IE6'yı hala yoğun bir şekilde destekliyoruz ve CSS: .class1.class2.class3 içindeki bileşik seçicileri desteklemiyor, 'parametrelerin' tire ile bölündüğü daha uzun sınıf adlarını kullanıyoruz.
DA.


6

Buradaki en iyi yanıt, sorucunun özel durumu için bir çözüm olsa da, tek tek sınıf adlarında 'şununla başlar' seçeneğini kullanmak için bir çözüm arıyorsanız:

:acp()"A Class Prefix" için çağırdığım bu özel jQuery seçiciyi kullanabilirsiniz . Kod bu yazının altında.

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

Bu <div>, söz konusu sınıfın sınıf özniteliği dizelerinde başında mı yoksa başka bir yerde mi olduğuna bakılmaksızın, belirtilen dize ile başlayan en az bir sınıf adına (bu örnekte "başlangıç_metni") sahip tüm öğeleri seçer .

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

Bu elemanlar, 1, 2, ve 3'ün yöntemleri kullanılarak fakat döner olmayan 4 ya da 5.

İşte :acpherhangi bir yere koyabileceğiniz özel seçicinin bildirimi :

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

Bunu yaptığım çünkü arka uç kontrolü olmayan web sitelerinin çok fazla GreaseMonkey hacklemesini yapıyorum, bu yüzden genellikle dinamik soneklere sahip sınıf adlarına sahip öğeler bulmam gerekiyor. Çok faydalı oldu.


2

Bunu dene:

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

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

bu durumda soru olarak Josh Stodola yanıtı doğru "apple-" ile başlayan sınıflar artı "apple-" içeren sınıflar

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

ancak öğenin böyle birden fazla sınıfı varsa

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

Josh Stodola'nın çözümü bunun
için işe yaramayacak , böyle bir şey yapmak zorunda

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

belki başka birine yardımcı olabilir teşekkürler


0

Bir öğede birden fazla sınıf varsa "[class ^ = 'apple-']" çalışmaz, ör.

<div class="fruits apple-monkey"></div>

OP soruda bundan bahsediyor.
Goose
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.