Veri özelliğine göre öğe seçme


1020

Özelliklerine göre öğeleri seçmek için kolay ve basit bir yöntem var datamı? Örneğin customerID, değerine sahip veri özniteliğine sahip tüm bağlayıcıları seçin 22.

Ben relbu tür bilgileri saklamak için kullanmak için tereddüt veya diğer öznitelikler, ama içinde hangi verilerin depolandığına dayalı bir öğe seçmek çok daha zor buluyorum.



Tüm veri özelliklerini seçmeme yardımcı olan buydu (değerine bakılmaksızın): $('*[data-customerID]')Örneğin kullanabilirsiniz$('*[data-customerID]').each( function() { ... });
Kai Noack

Yanıtlar:


1468
$('*[data-customerID="22"]');

Bunu atlamanız gerekir *, ancak doğru bir şekilde hatırlarsam, kullandığınız jQuery sürümüne bağlı olarak, bu hatalı sonuçlar verebilir.

Selectors API ( document.querySelector{,all}) ile uyumluluk için , bu durumda özellik değeri ( 22) etrafındaki tırnak işaretlerinin atlanamayabileceğini unutmayın .

Ayrıca, jQuery komut dosyalarınızda veri öznitelikleriyle çok çalışıyorsanız, HTML5 özel veri öznitelikleri eklentisini kullanmayı düşünebilirsiniz . Bu, kullanarak daha da okunabilir bir kod yazmanıza olanak tanır .dataAttr('foo')ve küçültmeden sonra (kullanıma kıyasla .attr('data-foo')) daha küçük bir dosya boyutu sağlar .


69
.Data ('foo') 'nun jQuery 1.4.3'ten beri bir' data-foo 'özniteliğinin değerini almak için çalıştığını unutmayın. Ayrıca, jQuery 1.6: .data ('fooBar') 'data-foo-bar' niteliğini alır.
James McCormack

4
@Zootius: Evet, eklenti benioku dosyasında bir not var: “jQuery 1.4.3'ten itibaren, varsayılan .data()olarak özel data-*niteliklerle eşleşiyor ve bu eklentiyi gereksiz kılıyor. Yine de jQuery'nin eski sürümleri için kullanılabilir. ”
Mathias Bynens

Peki nasıl bir yazı jQuery 1.4.3, veri nesnesinin değerine göre bir nesne seçin? Bu örnekte, customerID verileri 22'ye eşit olan herhangi bir nesne seçmek ister misiniz?
Seyahat

54
Ayrıca, yalnızca belirli veri özelliğinin varlığıyla ilgileniyorsanız, bunu yapabilirsiniz:$('[data-customerID]')
Darkside

7
Veri alanı jquery (kullanarak .data()) tarafından ayarlanmışsa, bu işe yaramaz , değil mi?
Martin R.14

329

Google çalışanları ve veri öznitelikleriyle seçim hakkında daha genel kurallar isteyenler için:

$("[data-test]")yalnızca data özelliğine sahip herhangi bir öğeyi seçecektir (özelliğin değeri ne olursa olsun). Dahil olmak üzere:

<div data-test=value>attributes with values</div>
<div data-test>attributes without values</div>

$('[data-test~="foo"]') veri özelliğinin bulunduğu herhangi bir öğeyi seçer içerdiği foo ancak tam olması gerekmeyen , örneğin:

<div data-test="foo">Exact Matches</div>
<div data-test="this has the word foo">Where the Attribute merely contains "foo"</div>

$('[data-test="the_exact_value"]')veri özelliği tam değerinin olduğu herhangi bir öğeyi seçer the_exact_value, örneğin:

<div data-test="the_exact_value">Exact Matches</div>

Ama değil

<div data-test="the_exact_value foo">This won't match</div>

21
İyi. Not bu ~=stoktaki ise kelime boşluk ile ayrılmış *=eşleşir herhangi bir alt.
sam

^Karakter ne olacak ?
kuba44

1
@ kuba44 gerçekten de örneğin, ^ kullanabilir $('[data-test^=foo]')aşağıdaki gibi, foo ile başlayan bir şey seçmek bu durumda <div data-test="foo_exact_value">ya <div data-test="food">ama<div data-test="seafoo">
JDuarteDJ

Kapsamlı özellik seçicileri listesi: drafts.csswg.org/selectors-3/#attribute-selectors
user1460043

142

Kullanmak $('[data-whatever="myvalue"]')html özniteliklerine sahip bir şey seçecektir, ancak daha yeni jQueries'de $(...).data(...)veri eklemek için kullanırsanız, bazı sihirli tarayıcı şeyleri kullanır ve html'yi etkilemez, bu nedenle önceki cevapta.find belirtildiği gibi keşfedilmez .

Doğrulama (1.7.2+ ile test edildi) (ayrıca kemanı inceleyin ): (daha eksiksiz olacak şekilde güncellendi)

var $container = $('<div><div id="item1"/><div id="item2"/></div>');

// add html attribute
var $item1 = $('#item1').attr('data-generated', true);

// add as data
var $item2 = $('#item2').data('generated', true);

// create item, add data attribute via jquery
var $item3 = $('<div />', {id: 'item3', data: { generated: 'true' }, text: 'Item 3' });
$container.append($item3);

// create item, "manually" add data attribute
var $item4 = $('<div id="item4" data-generated="true">Item 4</div>');
$container.append($item4);

// only returns $item1 and $item4
var $result = $container.find('[data-generated="true"]');

1
aha - bir başkası bunu stackoverflow.com/questions/4191386/…
drzaus

4
ve .filter burada
drzaus

22
bazı sihirli tarayıcı şey kullanır ve html etkilemez : büyü diye bir şey yoktur;) learningjquery.com/2011/09/using-jquerys-data-apis
Tom Sarduy


1
Daha sonra bulmanız gereken bir veri özelliği ekliyorsanız, kullanın$item.attr('data-id', 10);
Pedro Moreira

77

JQuery olmadan bir JavaScript yanıtı görmedim. Umarım birine yardımcı olur.

var elements = document.querySelectorAll('[data-customerID="22"]');

elements[0].innerHTML = 'it worked!';
<a data-customerID='22'>test</a>

Bilgi:


1
Bunun için teşekkürler. Jquery olmayan çözümler görmek güzel.
Chuck

68

Veri niteliği olmayan tüm çapa seçmek için data-customerID==22, sen içermelidir ayalnızca bu eleman türü aramanın kapsamını sınırlamak için. Sayfada çok sayıda öğe olduğunda veri özniteliği aramaları büyük bir döngüde veya yüksek sıklıkta yapmak performans sorunlarına neden olabilir.

$('a[data-customerID="22"]');

27

Yerel JS Örnekleri

Öğelerin Düğüm Listesini Al

var elem = document.querySelectorAll('[data-id="container"]')

html: <div data-id="container"></div>

İlk elemanı al

var firstElem = document.querySelector('[id="container"]')

html: <div id="container"></div>

Bir nodelist döndüren bir düğüm koleksiyonunu hedefleme

document.getElementById('footer').querySelectorAll('[data-id]')

html:

<div class="footer">
    <div data-id="12"></div>
    <div data-id="22"></div>
</div>

Öğeleri birden çok (VEYA) veri değerine göre alma

document.querySelectorAll('[data-section="12"],[data-selection="20"]')

html:

<div data-selection="20"></div>
<div data-section="12"></div>

Birleşik (AND) veri değerlerini temel alan öğeleri alma

document.querySelectorAll('[data-prop1="12"][data-prop2="20"]')

html:

<div data-prop1="12" data-prop2="20"></div>

Değerin başladığı öğeleri alın

document.querySelectorAll('[href^="https://"]')

"İlk öğeyi al" seçicisi doğru ancak diğer örneklerle tutarlı değil - "veri-" eksik olduğuna inanıyorum.
GuyPaddock

15

Jquery filter () yöntemi ile:

http://jsfiddle.net/9n4e1agn/1/

HTML:

<button   data-id='1'>One</button>
<button   data-id='2'>Two</button>

JavaScript:

$(function() {    
    $('button').filter(function(){
        return $(this).data("id")   == 2}).css({background:'red'});  
     });

Kemanı denedin mi? FIlter yöntemi aynı şeyi başarmak için başka bir yaklaşımdır. Zaten bir Jquery nesnesi kümeniz varsa ve veri özniteliğine veya başka bir şeye göre filtrelemeniz gerektiğinde yararlı olabilir.
Razan Paul

Özür dilerim, @ Blizzard. Yanlış cevap hakkında yorum yaptım. Şimdi sağa yapıştırdı. #AlwaysALongDayAtWork
Peter Bishop

15

Bunun gibi inşaat: Safari 8.0'da$('[data-XXX=111]') çalışmıyor .

Veri özelliğini şu şekilde ayarlarsanız: $('div').data('XXX', 111)yalnızca veri özelliğini doğrudan DOM'da şu şekilde ayarlarsanız çalışır:$('div').attr('data-XXX', 111) .

Bunun nedeni, jQuery ekibinin, bellek değişikliklerini ve her değişiklik veri özniteliğinde DOM üzerinde yeniden oluşturma işlemlerini önlemek için çöp toplayıcıyı optimize etmesidir.


Bu bana çok yardımcı oldu - veri veya prop yöntemlerini kullandıysam, o zaman $ ('... [data-x = "y"]') seçimi işe yaramadı - bunun yerine attr kullandım (öznitelik değişikliğini itiyor) DOM). Thx
Jarda

13

Bu Chrome'da çalışması için değer gerekir değil başka bir çift tırnak gerekir.

Örneğin, sadece şu şekilde çalışır:

$('a[data-customerID=22]');

4
Bu yanlış görünüyor. En azından şimdi doğru değil. Az önce $ ('[data-action = "setStatus"]') kullandım. RemoveClass ('devre dışı'); Chrome'da çalışır ve mükemmel çalışır.
Peter Bishop

Seçici içinde "" hiçbir faydası yoktur sanırım, olarak kullanılabilir$('[data-action=setStatus]').removeClass('disabled')
Animesh Singh

6

Bazen, öğelere programlı olarak eklenmiş veri öğelerine sahip olup olmadıklarına göre filtre uygulamak istenir (diğer bir deyişle dom öznitelikleri aracılığıyla değil):

$el.filter(function(i, x) { return $(x).data('foo-bar'); }).doSomething();

Yukarıdakiler işe yarıyor ama çok okunamıyor. Daha iyi bir yaklaşım, bu tür şeyleri test etmek için bir sahte seçici kullanmaktır:

$.expr[":"].hasData = $.expr.createPseudo(function (arg) {
    return function (domEl) {
        var $el = $(domEl);
        return $el.is("[" + ((arg.startsWith("data-") ? "" : "data-") + arg) + "]") || typeof ($el.data(arg)) !== "undefined";
    };
});

Şimdi orijinal ifadeyi daha akıcı ve okunabilir bir şeye yeniden düzenleyebiliriz:

$el.filter(":hasData('foo-bar')").doSomething();

1
İlk çözüm dönüş ifadesini kaçırır, şu şekilde olması gerekir: $ el.filter (function (i, x) {return $ (x) .data ('foo-bar');}). DoSomething ();
Salma Gomaa

3

Sadece 'yaşam standardının' bazı özellikleri ile tüm cevapları tamamlamak için - Şimdiye kadar (html5 döneminde) bir 3. taraf kütüphanesi olmadan yapmak mümkündür:

  • querySelector ile saf / düz JS (CSS seçicileri kullanır):
    • DOM'da ilkini seçin: document.querySelector('[data-answer="42"],[type="submit"]')
    • DOM'daki tümünü seç: document.querySelectorAll('[data-answer="42"],[type="submit"]')
  • saf / düz CSS
    • bazı özel etiketler: [data-answer="42"],[type="submit"]
    • belirli bir özelliğe sahip tüm etiketler: [data-answer]veyainput[type]
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.