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

96

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

tzn. Wybierz wszystkie elementy, .data('myAttr')które zostały już ustawione.

ROZWIĄZANIE

Jsfiddle do zaprezentowania to Fiddle

Argiropoulos Stavros
źródło

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;
});
Nicola Peluchetti
źródło
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.

Ashkan Mobayen Khiabani
źródło
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;
});
Frédéric Hamidi
źródło
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
17

Możesz użyć tego rozszerzenia jQuery Selector: Zapytanie o dane elementu

$(':data');       // All elements with data  
$(':not(:data)'); // All elements without data
roberkules
źródło
Interfejs użytkownika jQuery już to ma, więc niektórzy mogą nie potrzebować wywoływać funkcji anonimowej. api.jqueryui.com/data-selector
arleslie
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]')

devconcept
źródło
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
});
Khalid
źródło
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/

gość271314
źródło
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