Jquery, $ jquery.data () içeren tüm öğeleri seçer


Yanıtlar:


99

Yapabilirsin

$('[data-myAttr!=""]'); 

bu data-myAttr, '' değerine eşit olmayan bir niteliğe sahip tüm öğeleri seçer (bu nedenle ayarlanmış olması gerekir);

ayrıca filter () kullanabilirsiniz

$('*').filter(function() {
    return $(this).data('myAttr') !== undefined;
});

68
Veya sadece:$('[data-myAttr]')
andlrc

4
Aynı şeyi düşündüm. Beklendiği gibi çalışmıyor. bkz bu DEMO
gdoron Monica destekliyor

ilk kod parçasında bir kapanış 'eksik (yanıtı doğrudan değiştiremezsiniz)
Florent2

1
$ ('[data-myAttr! = ""]'); atanmamış öğeleri döndürür. @NULL 'un yorumu yalnızca ayarladığı öğeleri alır.
arleslie

6
YANLIŞ! doğru çözüm: $ ('[data-myAttr]') - açıklama için aşağıdaki yanıta bakın
BassMHL

76

Bunları seçmenin en iyi ve basit yolu:

$('[data-myAttr]')

Daha fazla bilgi:

Bir çok şeyi test ettim.

Kullanmak $('[data-myAttr!=""]')her durumda çalışmaz. Çünkü data-myAttrseti olmayan elemanlar data-myAttreşit olacak undefinedve bunları $('[data-myAttr!=""]')da seçecek, ki bu yanlış.


4
Bu yalnızca biçimlendirmede tanımlanan veri özellikleriyle çalışır. Bu verilerle çalışma jQuery ile tanımlanan niteliklerini DEĞİLDİR, bkz jsfiddle.net/2p7h0Lj8/1
Sophivorus

20

Filter () kullanabilirsiniz :

var elements = $("*").filter(function() {
    return $(this).data("myAttr") !== undefined;
});

1
Bunu göndermek üzereydim, işte işe yaradığını gösteren bir keman: jsfiddle.net/gbHFZ/1
Rory McCrossan

1
Öznitelik seçici neden işi yapmıyor? $('[data-myAttr]')?
gdoron Monica'yı

6
@gdoron, çünkü data()alıcı formunun gerçekten HTML5 data-özniteliklerini okuması , ancak ayarlayıcı biçimi onları oluşturmaz veya güncellemiyor.
Frédéric Hamidi

ummm, verileri nereye kaydediyor? bana bir referans verebilir misin? Bunu okudum "(tüm veri değerleri daha sonra jQuery'de dahili olarak saklanır)." ama nerede???
gdoron Monica'yı destekliyor

3
@gdoron, veriler bir expando özelliği aracılığıyla öğeyle ilişkilendirilen bir kimlik tarafından anahtarlanan global bir önbellekte saklanır.
Frédéric Hamidi


8

JQuery kullanıcı arayüzünü şu şekilde kullanabilirsiniz : data () seçici

Belirtilen anahtar altında depolanan verilere sahip öğeleri seçer.

Kontrol bu jsfiddle bir örnek için

Eşleşen tüm öğeleri elde etmek için .data('myAttr')kullanabilirsiniz

var matches = $(':data(myAttr)');

Bu, hem data-özniteliklere sahip öğeler hem de veriler kullanılarak depolanan öğeler için çalışmalıdır $.data()çünkü

JQuery 1.4.3'ten itibaren HTML 5 veri öznitelikleri otomatik olarak jQuery'nin veri nesnesine çekilecektir.

Ama bu pek iyi çalışmıyor. Bu jsfiddle'ı kontrol edin ve seçicinin ikinci çağrıldığında 2 öğeyle eşleştiğini ve yalnızca biriyle eşleştiğini göreceksiniz. Bunun nedeni jquery-ui kitaplığındaki "bir hata" dır.

Bu, çekirdek jquery-ui dosyasından alınır.

 $.extend( $.expr[ ":" ], {
    data: $.expr.createPseudo ?
        $.expr.createPseudo(function( dataName ) {
            return function( elem ) {
                return !!$.data( elem, dataName );
            };
        }) :
        // support: jQuery <1.8
        function( elem, i, match ) {
            return !!$.data( elem, match[ 3 ] );
        }
});

Gördüğünüz gibi, $.data(elem, match)bunun yerine kullanıyorlar, $(elem).data(match)bu da data-özniteliklere sahip öğeler talep etmeniz durumunda önbelleğin güncellenmemesine neden oluyor . Öğe data()depolama için test edilmişse, bu iyi çalışır, ancak değilse, sonuçtaki eşleşmelere dahil edilmeyecektir.

İstediğiniz şey yalnızca sizin tarafınızdan belirlenen veri bilgileriyle eşleştirmekse, ancak iki seçeneğiniz kalmadıysa bu bir hata olmayabilir.

  1. Jquery-ui kullanmayın ve kendi sözde seçicinizi genişletmeyin $(:mydata(myAttr))

    $.extend($.expr[":"], {
       mydata: $.expr.createPseudo ?
       $.expr.createPseudo(function(dataName) {
          return function(elem) {
             return !!$(elem).data(dataName);
          };
       }) : function(elem, i, match) {
           return !!$(elem).data(match[3]);
       }
    });
    

  2. :dataSözde seçici ile jquery-ui kullanın ve [data-myAttr]atlanabilecek olanları dahil etmek için seçim sonuçlarını birleştirin

    var matches = $(':data(myAttr)', '[data-myAttr]')
    


Bu, gerçek kimliği veya veri özniteliği adını bilmeden data- * özniteliklerine sahip öğeleri seçme sorunumun çözümünün bir parçasıydı. Bunu başka bir yerde yapmak için jQuery'yi genişletmenin bir yolunu buldum, ancak pratik uygulamayı göstermek için kod parçacığını burada + 1'leyin. Bazıları ipucu verecek kadar verir, ancak bazen verilen bilgileri nasıl kullanacağınızı GÖSTERMENİZ gerekir. Teşekkürler! :)
Brandon Elliott

7
$('[data-myAttr]').each(function() {
       var element = $(this);
       // Do something with the element
});

2

Daha önce ayarladığım öğeleri seçin jquery.data();


Soru, herhangi bir veriye değil, belirli bir anahtara sahip tüm öğeleri bulmak içindir.


Kullanmayı deneyin jQuery.data()

$(".myClass").each(function(i){
    if( i % 2 == 0 ){
        $(this).data("myAttr",i + 1);                
    }
});
    
var res = $(".myClass").map(function(i) {
    console.log($(this).data("myAttr"));
    return $.data(this, "myAttr") !== undefined ? this : null
});    

console.log(res);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js">
</script>
<div class="myClass">1</div>
<div class="myClass">2</div>
<div class="myClass">3</div>
<div class="myClass">4</div>
<div class="myClass">5</div>

jsfiddle http://jsfiddle.net/xynZA/142/


Cevap için teşekkürler. Soru, herhangi bir veriye değil, belirli bir anahtara sahip tüm öğeleri bulmak içindir.
Argiropoulos Stavros

@ArgiropoulosStavros Hem html data-*öznitelik kümesine sahip hem de jQuery.data()ayarlanmış öğeleri döndürme şartı var mı?
misafir271314
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.