Jquery wybiera wszystkie elementy, które mają $ jquery.data ()


Odpowiedzi:


98

Mógłbyś

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

to zaznacza wszystkie elementy, które mają atrybut data-myAttrróżny od „” (więc musi być ustawiony);

możesz też użyć filter ()

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

68
Lub po prostu:$('[data-myAttr]')
andlrc

4
Myślałem o tym samym. Nie działa zgodnie z oczekiwaniami. zobaczyć ten DEMO
gdoron wspiera Monica

w pierwszym fragmencie kodu brakuje zamykającego
znaku

1
$ ('[data-myAttr! = ""]'); zwróci elementy, do których nie został przypisany. Komentarz @NULL pobiera tylko elementy, dla których jest ustawiony.
arleslie,

6
ŹLE! prawidłowe rozwiązanie: $ ('[data-myAttr]') - zobacz odpowiedź poniżej w celu wyjaśnienia
BassMHL

75

Najlepszym i najprostszym sposobem ich wybrania jest:

$('[data-myAttr]')

Więcej informacji:

Przetestowałem wiele rzeczy.

Używanie $('[data-myAttr!=""]')nie działa we wszystkich przypadkach. Bo elementy, które nie mają data-myAttrzbioru, będą miały swoje data-myAttrrówne undefinedi $('[data-myAttr!=""]')te też będą wybierać, co jest niepoprawne.


4
Działa to tylko z atrybutami danych zdefiniowanymi w znacznikach. NIE działa z atrybutami danych zdefiniowanymi przez jQuery, patrz jsfiddle.net/2p7h0Lj8/1
Sophivorus

19

Możesz użyć filtra () :

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


1
Dlaczego selektor atrybutów nie działa? $('[data-myAttr]')?
gdoron wspiera Monikę

6
@gdoron, to dlatego data(), że forma pobierająca rzeczywiście czyta data-atrybuty HTML5 , ale jej forma ustawiająca nie tworzy ich ani nie aktualizuje.
Frédéric Hamidi

ummm, więc gdzie zapisuje dane? czy możesz mi podać referencje? Czytałem to „(wszystkie wartości danych są następnie przechowywane wewnętrznie w jQuery)”. ale gdzie???
gdoron wspiera Monikę

3
@gdoron, dane są utrwalane w globalnej pamięci podręcznej, kluczowane przez identyfikator, który jest powiązany z elementem za pomocą właściwości expando.
Frédéric Hamidi


8

Możesz użyć interfejsu użytkownika JQuery z selektorem: data ()

Wybiera elementy, które mają dane przechowywane pod określonym kluczem.

Sprawdź na przykład ten plik jsfiddle

Aby dopasować wszystkie elementy .data('myAttr'), możesz użyć

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

Powinno to działać zarówno w przypadku elementów z data-atrybutami, jak i elementów z danymi przechowywanymi przy użyciu funkcji $.data()ponieważ

Od wersji jQuery 1.4.3 atrybuty danych HTML 5 będą automatycznie pobierane do obiektu danych jQuery.

Ale to nie działa zbyt dobrze. Sprawdź to jsfiddle, a zobaczysz, że przy drugim wywołaniu selektora powinien on pasować do 2 elementów i pasuje tylko do jednego. Jest to spowodowane "błędem" w bibliotece jquery-ui.

Jest to pobierane z podstawowego pliku jquery-ui.

 $.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 ] );
        }
});

Jak widać, używają $.data(elem, match)zamiast tego, $(elem).data(match)co powoduje, że pamięć podręczna nie jest aktualizowana w przypadku, gdy żądasz elementów z data-atrybutami. Jeśli element został przetestowany pod kątem data()przechowywania, działa to dobrze, ale jeśli nie, nie zostanie uwzględniony w wynikowych dopasowaniach.

Może to wcale nie być błąd, jeśli chcesz dopasować tylko elementy do informacji o danych ustawionych przez Ciebie, ale jeśli nie, masz dwie opcje.

  1. Nie używaj jquery-ui i rozszerzaj swój własny pseudo-selektor $(: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. Użyj jquery-ui z :datapseudoselektorem i połącz wyniki wyboru, [data-myAttr]aby uwzględnić te, które mogą zostać pominięte

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


To była część rozwiązania mojego problemu polegającego na wybieraniu elementów z atrybutami data- * bez znajomości faktycznego identyfikatora lub nazwy atrybutu danych. Znalazłem sposób na rozszerzenie jQuery, aby to zrobić, gdzie indziej, ale +1 tutaj, aby fragment kodu pokazał praktyczne zastosowanie. Inni dają tylko wskazówkę, ale czasami trzeba POKAŻ, jak KORZYSTAĆ z dostarczonych informacji. Dzięki! :)
Brandon Elliott

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

2

Wybierz elementy, które wcześniej ustawiłem jquery.data();


Pytanie dotyczy znalezienia wszystkich elementów z określonym kluczem, a nie żadnych danych.


Spróbuj wykorzystać 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/


Dzięki za odpowiedź Pytanie dotyczy znalezienia wszystkich elementów z określonym kluczem, a nie żadnych danych.
Argiropoulos Stavros

@ArgiropoulosStavros Czy wymagane jest zwrócenie elementów, które mają html data-*ustawiony atrybut, a także jQuery.data()ustawiony?
gość271314
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.