Öğeleri özelliğe göre seçme


253

Oluşturulan kimlikleri ile onay kutuları bir koleksiyon var ve bazıları ekstra bir niteliğe sahip. Bir öğenin belirli bir niteliği olup olmadığını kontrol etmek için JQuery kullanmak mümkün müdür? Örneğin, aşağıdaki öğenin "myattr" özelliğine sahip olup olmadığını doğrulayabilir miyim? Özelliğin değeri değişebilir.

<input type="checkbox" id="A" myattr="val_attr">A</input>

Örneğin, tek tek kontrol etmeden bu özelliğe sahip tüm onay kutularının bir koleksiyonunu nasıl alabilirim? Mümkün mü?


2
Bir kenara, <input /> içinde içerik olması gerekmeyen boş bir etikettir. Belki de myatttr hediyeniz olduğu gibi görmeyi onaylamakla ilgilenmiyorsunuz ...
ScottE


Zaten bir koleksiyonunuz varsa ve yalnızca belirli özelliklere sahip öğeleri filtrelemek istiyorsanız - sadece yapın -$filtered = $collection.filter('[attribute_name]');
jave.web

Yanıtlar:


190

Bunları seçebilir misin? Öyleyse, evet:

$(":checkbox[myattr]")

4
Varlığını test ediyorsanız (muhtemelen bir if ifadesinde) muhtemelen daha doğru / güvenilir olduğunu unutmayın: if ($ (": checkbox [myattr]"). Length ()> 0) ...
rinogo

14
@rinogo: aslında ihtiyacınız olan tek şey if ($ (": checkbox [myattr]"). length). () Uzunluk gerekli olmadığında, katı eşitlik (hem değer hem de tip) gerektirmeyen eşitlik testlerinde> 0, 0 değeri yanlış olarak değerlendirilmez.
bmarti44

1
Eğer td [myattr] gibi bir şey denerseniz js hataları atar. Bu yüzden bu özelliğin özellikle onay kutularını hedeflediğini düşünüyorum.
fooledbyprimes

6
İki nokta üst üste türüyle belirlenen sahte sınıfları seçer. Aynı şeyi td'lere uygulamak için iki nokta üst üste işaretini atlayın.
dhochee

Veya bir şeyin, nitelikleri olmayan tüm bağlantıları bulma gibi bir özelliği olup olmadığını görmek istiyorsanız href. $("#myBox").find('a').filter(':not([href])')
timbrown

368
if ($('#A').attr('myattr')) {
    // attribute exists
} else {
    // attribute does not exist
}

DÜZENLE:

Yukarıdaki, else-branch'a düşecek myattrancak boş bir dize veya "0" olacaktır. Bu bir sorunsa, açıkça test etmelisiniz undefined:

if ($('#A').attr('myattr') !== undefined) {
    // attribute exists
} else {
    // attribute does not exist
}

3
Harika bir cevap değil. "undefined" Javascript'teki bir anahtar kelime değil. Bkz. Constc.blogspot.com/2008/07/…
mhenry1384

16
Haklısın ... Ama yeniden tanımlamanın undefinedbir uç dava olduğu düşünülüyor ve yukarıdaki karşılaştırma tüm vakaların% 99'unda işe yarayacak.
Stefan Gehrig

6
Özniteliğin boş bir dizesi varsa çalışmaz. Bir örnek myattr = ''
efsanevi

3
@mhenry - o zaman hata yaparsınız :) Projeyi benim için veya yanımda inşa ediyor olsaydınız, hatayı düzeltmenizi isterdim. Açık kaynaklı bir paket olsaydı, ben (birçok kullanıcıyla birlikte) kötü kodlandığı gerekçesiyle onu kullanmayı bırakardım. Eğer siz değiştirmediyseniz, o zaman bir başkası hatasız bir sürümü çatallayacaktı ve insanlar bunu kullanacaktı ve birileri iyi bir fikir olan bir paket oluşturduğunda daha önce olduğu gibi kendi projenizi kaybedeceksiniz. zayıf uygulama. Her iki durumda da size kodlama uygulamaları hakkında bir ders verecekti :)
Jimbo Jonny

8
if (typeof $ ('# A'). attr ('myattr')! == 'tanımsız')
James Westgate

166

Sorunun sorulmasından bu yana uzun zaman geçtiğini biliyorum, ancak çekin daha net olduğunu gördüm:

if ($("#A").is('[myattr]')) {
    // attribute exists
} else {
    // attribute does not exist
}

(As bu sitede bulunan buraya )

Belgeler yaklaşık edilir bulunabilir burada


W3C'ye göre, boole özellikleri, özelliğin varlığı veya yokluğu ile tanımlanır. jQuery, öznitelik değerlerini işlemek için .attr () yöntemini sağlar. Ancak değeri olmayan bir özelliği nasıl ekleyebiliriz? Bir özelliğin varlığını test etmek için sağladığınız yöntem jQuery belgelerinde (1.8.2) açıklanmamıştır. JQuery ile nasıl öznitelik ekleneceğini biliyor musunuz?
chmike

@chmike Bir özellik eklemek için şu şekilde yaparım: $ ("# A"). prop ("myNewAttribute", someValue); SomeValue'ya istediğiniz herhangi bir değeri verebilirsiniz: dize, sayı, boş dize, true / false.
Jonathan Bergeron

Bu, değeri olmayan bir öznitelikle aynı olmayan, atanmış bir değere sahip özniteliği ekler.
chmike

5
Kabul ediyorum, bu en iyi cevap (jQuery kullanarak) - çok açık ve özlü. Kendimi neden jQuery sadece bir hasAttribute () işlevi var merak ettim ve cevap, yerel javascript zaten bir tane var. Herhangi bir HTML Dom Öğesinin hasAttribute ('attributeName') yöntemi vardır. Böylece şunları yapabilirsiniz: $ ('# A') [0] .hasAttribute ('myattr') @chmike - jQuery işlevlerini kullanarak boş bir özellik ekleyebileceğinizi düşünmüyorum, ancak HTML Dom Öğesi ile yapabilirsiniz nesneyi aşağıdaki gibi benzer bir şekilde yazın: $ ("# A") [0] .setAttributeNode (document.createAttribute ("myNewAttribute"));
Daniel Howard

1
Sadece bu cevabı sevdiğim ama bir değeri olmayan bir özniteliğin nasıl ekleneceğini soran yorumlar hakkında karıştı. Bunlar soru veya cevap ile ilgili değildir.
goodeye

9

Bu çalışacak:

$('#A')[0].hasAttribute('myattr');


@RetroCoder, bağlantınız hakkında ne düşünüyorsunuz? Bu test oldukça iyi görünüyor, çünkü özellikle $(this).<something>burada this.hasAttribute('...')doğrudan yapabileceğiniz zaman kullanıyorsunuz (ve elbette eski tarayıcıları umursamıyorsunuz.)
Alexis Wilke

8

JavaScript'te ...

null == undefined

... döndürür true*. Bu arasındaki fark bu ==ve ===. Ayrıca, ad undefinedtanımlanabilir ( nullis gibi bir anahtar kelime değildir ), bu yüzden başka bir şekilde kontrol etmeniz daha iyi olur. En güvenilir yol muhtemelen typeofoperatörün dönüş değerini karşılaştırmaktır .

typeof o == "undefined"

Bununla birlikte, bu durumda null ile karşılaştırmak işe yaramalıdır.

* Varsayım undefinedaslında tanımsızdır.


Tanımsız, JavaScript'te ayrılmış bir anahtar kelime değil. JQuery'de tam olarak "var" yapıcısı ile yapıldığı ve değer vermediği için isminin okunması mümkündür. Sihirli kütüphane kodunun üstünde, infact, "var undefined;" ve bu şekilde jQuery kapsamındaki bu adla tanımlanmamış bir değişken tanımlanır ... Ancak, "var unnamed" yazarak aynı şekilde "adsız" olarak adlandırılabilir;
Emanuele Del Grande

1
Bu bir öznitelik için kontrol değil, bir javascript nesnesindeki bir özellik için bu kontrol neden bu 6 upvotes var?
ncubica

5

$("input[attr]").length daha iyi bir seçenek olabilir.


4

Birkaç fikir "typeof", jQuery ".is" ve ".filter" kullanarak etrafında attı, bu yüzden onları hızlı bir karşılaştırma karşılaştırmak düşündüm. Typeof bunun için en iyi seçim gibi görünüyor. Diğerleri çalışacak olsa da, jq kütüphanesini bu çaba için çağırırken net bir performans farkı var gibi görünüyor.


2
if (!$("#element").attr('my_attr')){
  //return false
  //attribute doesn't exists
}

1
değeri olmayan bir özellik ekleyebileceğiniz için bu muhtemelen işe yaramaz. bu durumda, istenen koşul true değerine dönebilse de, bu özellik geçerlilik kazanır. isset()$("#element").attr('my_attr') === false
PHP'lere

2

gibi bu yazı kullanarak .isve nitelik seçicisi [], kolayca bir işlev (veya prototip) ekleyebilirsiniz:

function hasAttr($sel,attr) {
    return $sel.is('['+attr+']');
}


1

basitçe:

$('input[name*="value"]')

daha fazla bilgi: resmi dokümanlar


1
Geçerli bir dize değil, çift tırnak ile tanımlanan dize içindeki çıkışsız çift tırnak. Ne yazık ki sizin için düzenleyemiyorum çünkü bir düzenlemenin 6 veya daha fazla karakteri değiştirmesi gerekiyor, ancak değiştirilmesi gerekiyor.
Jimbo Jonny

0

Bir özelliğin tüm unsurları seçimine ek olarak $('[someAttribute]')ya $('input[someAttribute]')da böyle bir tıklama işleyicisi gibi bir nesne üzerinde boole kontrolleri yapmak için bir fonksiyon kullanabilirsiniz:

if(! this.hasAttribute('myattr') ) { ...


0

Yukarıda açıklandığı gibi amaçlanan davranış ile npm paketi oluşturdum.

Link [NPM] ve [github]

Kullanımı çok basit. Örneğin:

<p id="test" class="test">something</p>
$("#test").hasAttr("class")

true değerini döndürür.

Deve ile de çalışır.


0

Belirli bir niteliğe sahip öğeleri seçmek için yukarıdaki cevaplara bakın.

Belirli bir jQuery öğesinin belirli bir özniteliği trueolup olmadığını belirlemek için ajQuery koleksiyonundaki ilk öğenin bu özniteliğe sahip olması durumunda döndüren küçük bir eklenti kullanıyorum :

/** hasAttr
 ** helper plugin returning boolean if the first element of the collection has a certain attribute
 **/
$.fn.hasAttr = function(attr) {
   return 0 < this.length
       && 'undefined' !== typeof attr
       && undefined !== attr
       && this[0].hasAttribute(attr)
}

-5

JQuery özniteliği dize olarak döndürür. Bu nedenle, ayarlanıp ayarlanmadığını belirlemek için bu dizenin uzunluğunu kontrol edebilirsiniz:

if ($("input#A").attr("myattr").length == 0)
 return null;
else
 return $("input#A").attr("myattr");

Yani, bir yıldan fazla olduğunu biliyorum ve uzun zaman önce ele almalıydım. Hangi bölümün işe yaramadığını merak ediyorum? Sadece onları seçmeye çalıştığını bilseydim, yukarıdaki kodu vermezdim. Onları tek tek kontrol etmek istediğini sanıyordum. JQuery aslında özniteliği bir dize olarak döndürür ve diğer dize gibi bu dizenin uzunluğunu kontrol edebilirsiniz. Seçiciniz ve özelliğiniz doğru olduğu sürece, belirli bir girdinin bu özelliğe sahip olup olmadığını test edebilmelisiniz. Her neyse, insanların prensibi indirmesini istemedim çünkü işe yarıyor.
zach

6
özniteliğin mevcut olmadığı durumlarda başarısız olur, bu durumda $ ("input # A"). attr ("myattr") bir dize yerine tanımsız olarak döner ve undefined.length başarısız olur
Rune FS

Yalnızca boş bir niteliği ve içeriğe sahip olanı algılar, var olmayan bir özellikte başarısız olur. Orijinal soru, özelliğin varlığını tespit etmek ve bu soruyu bir cevap olarak başarısız kılmaktı.
Jimbo Jonny
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.