jQuery Eşleşen bir sınıfın belirli bir kimliği olup olmadığını belirleyin


97

JQuery'nin aşağıdaki ifadenin id eşdeğeri nedir?

$('#mydiv').hasClass('foo')

böylece bir sınıf adı verebilir ve verilen bir kimlik içerip içermediğini kontrol edebilirsiniz.

gibi bir şey:

$('.mydiv').hasId('foo')

Belirli bir div'e stil uygulamak istiyorum. Örneğin, yükleme zamanında foo sınıfının tümü gösterilecektir, ancak bir bar id'sine sahip foo sınıfının bir örneğini kapatmak isteyebilirim.
Nicholas Murray

1
O zaman $('#bar.foo').toggle();, belgeye özel olması GEREKTİRDİĞİ için yalnızca bir kimliğe sahip olacaksınız. Bu kimliği yalnızca sınıfsa değiştirmeyi düşünüyorsanız, fooo zaman sınıfı id seçiciye ekleyin. seçici boş bir küme bulursa hiçbir şey olmayacak, sonuçlarla (bunlardan yalnızca bir tane olacak) bir küme bulursa, o zaman elemanı değiştirecektir. bence bunu çok düşünüyorsun.
prodigitalson

3
sadece insanların "bunu neden yapmak isteyesin ki?" demesinin sinir bozucu olduğunu söylemek için Şu anda bunu yapmaya çalışırken. HasClass ile ilgili sorun, seçici ile eşleşen HERHANGİ bir öğenin belirtilen sınıfa sahip olması durumunda True döndürmesidir. Bu yüzden, "kek" sınıfı ve her biri için ek sınıf isimleri ("bir", "iki" vb.) Olan birçok p'ye sahip olduğum yerde bir sorun yaşıyorum. Genel p.cake kümesini seçmek ve ardından bir koşullu olmak istiyorum (eğer sınıf = "bir" - $ var = 23 - vb.). Önemli olan, ek sınıf adına bağlı olarak farklı bir $ var aktarmaya çalışıyorum. Biraz o
Stella

Yanıtlar:


174

Birden çok seçiciyi birleştirerek bu mantığı seçicide pişirebilirsiniz . Örneğin, belirli bir sınıfa sahip, belirli bir kimliği olan tüm öğeleri hedefleyebiliriz:

$("#foo.bar"); // Matches <div id="foo" class="bar">

Bu, CSS'de yazacağınız bir şeye benzemelidir. Tüm #fooöğeler için geçerli olmayacağını (ancak yalnızca bir tane olması gerekir) ve tüm .baröğeler için geçerli olmayacağını unutmayın (çok sayıda olsa da). Yalnızca her iki öznitelikte de nitelendirilen öğeleri referans alacaktır.

jQuery ayrıca, bir öğenin belirli niteliklere sahip olup olmadığını belirlemenizi sağlayan harika bir .isyönteme sahiptir. Bir jQuery koleksiyonunu bir dize seçici, bir HTML Öğesi veya başka bir jQuery nesnesine karşı test edebilirsiniz. Bu durumda, onu bir dizi seçiciye göre kontrol edeceğiz:

$(".bar:first").is("#foo"); // TRUE if first '.bar' in document is also '#foo'

32
+1 is(). Bir .hasId()seçici olmalı çünkü .hasClass()gerçekten bariz bir ortak gibi göründüğü için ...
Matt Fletcher

43

Muhtemelen bunu kullanırdım $('.mydiv').is('#foo');, eğer kimliği biliyorsanız neden ilk başta seçiciye uygulamıyorsunuz?


17
Belki kod, belirli bir durumu farklı şekilde ele alması gereken bir geri arama işlevine giriyordur. Böylece, işleve otomatik olarak bilinmeyen özniteliklere sahip bir jQuery nesnesi geçirilir. Bu durumda, $ ['cevabınız']. İs ('yardımcı');
Peter G

1
Aklıma birçok sebep gelebilir. Bir öğenin id = "mobile" olması gibi mobile özel bir ayar uygulamak isterseniz ne olur? Neden önemli değil.
Yerleştirilebilir

Peki, sadece 1 element bir idveriye sahip olmalı, aksi takdirde başka bir öznitelik olmalıdır ... Sanırım, söz konusu elemanın yapısal konumu sayfaya veya istemci / kullanıcı aracısına göre değişirse tamam, ancak bunun dışında .. .
prodigitalson

19

güncelleme: üzgünüm soru yanlış anlaşıldı, .has()cevap kaldırıldı .

başka bir alternatif yol, .hasId()eklenti oluştur

// the plugin
$.fn.hasId = function(id) {
  return this.attr('id') == id;
};

// select first class
$('.mydiv').hasId('foo') ?
  console.log('yes') : console.log('no');

// select second class
// $('.mydiv').eq(1).hasId('foo')
// or
$('.mydiv:eq(1)').hasId('foo') ?
  console.log('yes') : console.log('no');
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<div class="mydiv" id="foo"></div>
<div class="mydiv"></div>


5
Üzgünüz ama soruyu yanlış yorumladığınızı düşünüyorum: has () API bunu bildiriyor: Eşleşen öğeler kümesini seçici veya DOM öğesiyle eşleşen bir alt öğeye sahip olanlarla azaltın . OP, 'myDiv' sınıfına sahip öğenin aynı zamanda Id foo'ya sahip olup olmadığını nasıl test edeceğini sorarken has (), 'foo' kimliğine sahip 'myDiv' in torunlarını arayacaktır.
eğin

7

Diyelim ki bazı DOM nesneleri arasında yineleme yaptığınızı ve belirli bir kimliğe sahip bir öğeyi bulup yakalamak istediğinizi

<div id="myDiv">
    <div id="fo"><div>
    <div id="bar"><div>
</div>

Bulmak gibi bir şey yazabilirsin

$('#myDiv').find('#bar')

Bir sınıf seçici kullanıyorsanız, find yönteminin tüm eşleşen öğeleri döndüreceğini unutmayın.

ya da daha gelişmiş işler yapacak yinelenen bir işlev yazabilirsiniz

<div id="myDiv">
    <div id="fo"><div>
    <div id="bar"><div>
    <div id="fo1"><div>
    <div id="bar1"><div>
    <div id="fo2"><div>
    <div id="bar2"><div>
</div>

$('#myDiv div').each(function() {
   if($(this).attr('id') == 'bar1')
       //do something with bar1
});

Aynı kod, sınıf seçici için kolayca değiştirilebilir.

<div id="myDiv">
    <div class="fo"><div>
    <div class="bar"><div>
    <div class="fo"><div>
    <div class="bar"><div>
    <div class="fo"><div>
    <div class="bar"><div>
</div>

$('#myDiv div').each(function() {
   if($(this).hasClass('bar'))
       //do something with bar
});

Index () ile probleminizi çözdüğünüz için memnunum, sizin için işe yarayan her şey. Umarım bu aynı problemi yaşayan başkalarına yardımcı olur. Şerefe :)


4
$('#' + theMysteryId + '.someClass').each(function() { /* do stuff */ });

her biri gereksiz çünkü asla birden fazla olmayacak #theMysteryId.
prodigitalson

2
Pekala, sizi bir değişkene atama, uzunluğun boş olup olmadığını kontrol etme ve sonra kodla devam etme zahmetinden kurtarır. Seçici hiçbir şeyle eşleşmezse, jQuery "her" işlevini çağırmaz, bu nedenle güzel ve temizdir. Şimdi yapmak istediğiniz tek şey biraz jQuery API'si çağırmaksa, o zaman emin olun.
Pointy

4

Bunu sonunda index () kullanarak çözdüğümü söylemek için.

HİÇBİR ŞEY işe yaradı gibi görünüyordu.

Öyleyse, kardeş öğeler için, önce ortak bir sınıfa göre seçim yapıyorsanız ve ardından her biri için bir şeyi farklı şekilde değiştirmek istiyorsanız, bu iyi bir çözümdür.

DÜZENLEME: Bilmeyenler için (benim gibi) index (), DOM'daki sıralarına bağlı olarak 0'dan başlayarak seçici ile eşleşen her öğe için bir dizin değeri verir. Class = "foo" ile kaç öğe olduğunu bildiğiniz sürece bir id'ye ihtiyacınız yoktur.

Açıkçası bu her zaman yardımcı olmayacaktır, ancak birileri onu yararlı bulabilir.


4

Öğenin kimliğinin mevcut olup olmadığını kontrol edin

if ($('#id').attr('id') == 'id')
{
  //OK
}


1

Bunu yaparak id öğesinin kullanılıp kullanılmadığını da kontrol edebilirsiniz:

if(typeof $(.div).attr('id') == undefined){
   //element has no id
} else {
   //element has id selector
}

Bu yöntemi global dataTables ve belirli sıralı dataTables için kullanıyorum


tanımsız, çok 'tanımsız' gibi çalışması için tırnak içinde olmalıdır
Aslan
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.