Biorąc pod uwagę dowolny element HTML z zerową lub większą liczbą data-*
atrybutów, w jaki sposób można pobrać listę par klucz-wartość dla danych.
Np. Mając to:
<div id='prod' data-id='10' data-cat='toy' data-cid='42'>blah</div>
Chciałbym móc programowo pobrać to:
{ "id":10, "cat":"toy", "cid":42 }
Korzystając z jQuery (v1.4.3), dostęp do poszczególnych bitów danych za pomocą $.data()
jest prosty, jeśli klucze są znane z góry, ale nie jest oczywiste, jak można to zrobić z dowolnymi zestawami danych.
Szukam „prostego” rozwiązania jQuery, jeśli takie istnieje, ale w przeciwnym razie nie miałbym nic przeciwko podejściu na niższym poziomie. Próbowałem parsować, $('#prod').attributes
ale mój brak javascript-fu zawodzi.
aktualizacja
customdata robi to, czego potrzebuję. Jednak włączenie wtyczki jQuery tylko dla ułamka jej funkcjonalności wydawało się przesadą.
Przeszukanie źródła pomogło mi naprawić mój własny kod (i ulepszyłem mój javascript-fu).
Oto rozwiązanie, które wymyśliłem:
function getDataAttributes(node) {
var d = {},
re_dataAttr = /^data\-(.+)$/;
$.each(node.get(0).attributes, function(index, attr) {
if (re_dataAttr.test(attr.nodeName)) {
var key = attr.nodeName.match(re_dataAttr)[1];
d[key] = attr.nodeValue;
}
});
return d;
}
aktualizacja 2
Jak wykazano w przyjętej odpowiedzi, rozwiązanie jest trywialne z jQuery (> = 1.4.4). $('#prod').data()
zwróci wymagane dane.
źródło
Odpowiedzi:
Właściwie, jeśli pracujesz z jQuery, od wersji
1.4.31.4.4 (z powodu błędu wymienionego w komentarzach poniżej)data-*
atrybuty są obsługiwane przez.data()
:jQuery.fn.data
Funkcja zwraca wszystkichdata-
atrybutów wewnątrz obiektu jako pary wartości klucza, przy czym klucz jest częścią nazwy atrybutu podata-
a wartość jest wartością tego atrybutu Po przekształcone zgodnie z zasadami podanymi powyżej.Stworzyłem również proste demo, jeśli to Cię nie przekonuje: http://jsfiddle.net/yijiang/WVfSg/
źródło
!jQuery.isNaN( data ) ? parseFloat( data ) : ...
). W moim atrybucie miałem numery seryjne produktów, takie jakdata-serial="00071134"
jQuery wtopił się w liczbę71134
, zmuszając mnie do powrotu do mniej eleganckiego.attr('data-serial')
(nie jest to opcja w twoim przypadku). Widziałem pytania dotyczące SO, które wyrażały podobne frustracje we wrt.data()
, spróbuję wykopać jedno ...$.data()
zwraca również wszystko, co zapisałeś przy użyciu$.data(key, value)
. Jeśli naprawdę chcesz sprawdzić, czy coś jest faktycznie przechowywane w znaczniku jako atrybut data- *, ta metoda może nie być najlepszym wyborem.Należy również zaoferować czyste rozwiązanie JavaScript, ponieważ rozwiązanie nie jest trudne:
Daje to tablicę obiektów atrybutów, które mają
name
ivalue
właściwości:Edycja: Aby pójść o krok dalej, możesz uzyskać słownik, iterując atrybuty i wypełniając obiekt danych:
Możesz wtedy uzyskać dostęp do wartości, na przykład
data-my-value="2"
asdata.myValue
;jsfiddle.net/3KFYf/33
Edycja: jeśli chcesz ustawić atrybuty danych w swoim elemencie programowo z obiektu, możesz:
jsfiddle.net/3KFYf/34
EDYCJA: Jeśli używasz babel lub TypeScript, albo kodujesz tylko dla przeglądarek es6, jest to przyjemne miejsce na użycie funkcji strzałkowych es6 i skrócenie nieco kodu:
źródło
-
znaku, jak robi to jQuery, ale edytowana odpowiedź tak.JSON.stringify()
ma wbudowane formatowanie JSON.el.getAttribute("data-foo")
. Zaktualizowałem moją odpowiedź, aby pokazać, jak można ustawić atrybuty danych na podstawie obiektu.Zajrzyj tutaj :
Jeśli przeglądarka obsługuje również HTML5 JavaScript API, powinieneś być w stanie uzyskać dane za pomocą:
lub
Och, ale czytałem też:
Pochodzi z maja 2010 roku.
Jeśli mimo wszystko używasz jQuery, możesz rzucić okiem na wtyczkę customdata . Jednak nie mam z tym doświadczenia.
źródło
$("#my").customdata()
powinno ci dać{method: "delete", remote: "true"}
... więc powinno działać.Jak wspomniano powyżej, nowoczesne przeglądarki mają interfejs API HTMLElement.dataset .
Ten interfejs API zapewnia DOMStringMap i możesz pobrać listę
data-*
atrybutów, wykonując po prostu:możesz również pobrać tablicę z
data-
nazwami kluczy właściwości, takimi jaklub zmapuj jego wartości według
w ten sposób możesz je iterować i używać bez potrzeby filtrowania między wszystkimi atrybutami elementu, tak jak to robiliśmy wcześniej .
źródło
lub konwertuj
gilly3
doskonałą odpowiedź na metodę jQuery:Używanie
$('.foo').info()
:;źródło
Dane należy uzyskać za pośrednictwem atrybutów zestawu danych
dataset jest użytecznym narzędziem do pobierania atrybutu danych
źródło
this.dataset
nie działa jeszcze we wszystkich przeglądarkach. Istnieje jednak wtyczka jquery, która zapewnia tę funkcję.Możesz po prostu iterować po atrybutach danych, jak każdy inny obiekt, aby uzyskać klucze i wartości, oto jak to zrobić za pomocą
$.each
:źródło
Używam zagnieżdżone każdego - dla mnie to jest najprostszym rozwiązaniem (łatwe do sterowania / zmiany „co zrobić z wartościami - w moich przykładowych danych wyjściowych jako atrybuty
ul-list
) (kod jQuery)Codepen: https://codepen.io/ezra_siton/pen/GRgRwNw?editors=1111
źródło
Jednym ze sposobów znajdowania wszystkich atrybutów danych jest użycie
element.attributes
. Używając.attributes
, możesz przeglądać wszystkie atrybuty elementów, odfiltrowując elementy zawierające ciąg „data-”.źródło