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.