Gegeben ein beliebiges HTML-Element mit null oder mehr data-*
Wie kann man bei Attributen eine Liste von Schlüssel-Wert-Paaren für die Daten abrufen?
ZB gegeben:
<div id='prod' data-id='10' data-cat='toy' data-cid='42'>blah</div>
Ich möchte dies programmgesteuert abrufen können:
{ "id":10, "cat":"toy", "cid":42 }
Mit jQuery (v1.4.3) ist der Zugriff auf die einzelnen Datenbits mit $.data()
einfach, wenn die Schlüssel im Voraus bekannt sind. Es ist jedoch nicht klar, wie dies mit beliebigen Datensätzen geschehen kann.
Ich suche nach einer 'einfachen' jQuery-Lösung, falls es eine gibt, hätte aber sonst nichts gegen einen Ansatz auf niedrigerer Ebene. Ich habe versucht zu analysieren, $('#prod').attributes
aber mein Mangel an Javascript-Fu lässt mich im Stich.
aktualisieren
customdata macht was ich brauche. Das Einfügen eines jQuery-Plugins für einen Bruchteil seiner Funktionalität schien jedoch ein Overkill zu sein.
Das Betrachten der Quelle half mir, meinen eigenen Code zu reparieren (und mein Javascript-Fu zu verbessern).
Hier ist die Lösung, die ich gefunden habe:
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;
}
Update 2
Wie in der akzeptierten Antwort gezeigt, ist die Lösung mit jQuery trivial (> = 1.4.4). $('#prod').data()
würde das erforderliche Diktat zurückgeben.
quelle
Antworten:
Eigentlich, wenn Sie mit jQuery arbeiten, ab Version
1.4.31.4.4 (aufgrund des in den Kommentaren unten erwähnten Fehlers) werdendata-*
Attribute unterstützt durch.data()
:Die
jQuery.fn.data
Funktion gibt das gesamtedata-
Attribut in einem Objekt als Schlüssel-Wert-Paare zurück, wobei der Schlüssel der Teil des Attributnamens nachdata-
und der Wert der Wert dieses Attributs nach der Konvertierung gemäß den oben angegebenen Regeln ist.Ich habe auch eine einfache Demo erstellt, wenn Sie das nicht überzeugt: http://jsfiddle.net/yijiang/WVfSg/
quelle
!jQuery.isNaN( data ) ? parseFloat( data ) : ...
). Ich hatte Produktseriennummern in meinem Attribut, z. B.data-serial="00071134"
welche jQuery in eine Nummer umgewandelt wurde71134
, was mich zwang, zu den weniger eleganten zurückzukehren.attr('data-serial')
(in Ihrem Fall keine Option). Ich habe Fragen auf SO gesehen, die ähnliche Frustrationen geäußert haben.data()
, werde versuchen, eine herauszufinden ...$.data()
auch alles zurückgegeben wird, was Sie mit gespeichert haben$.data(key, value)
. Wenn Sie wirklich überprüfen möchten, ob tatsächlich etwas im Markup als data- * -Attribut gespeichert ist, ist diese Methode möglicherweise nicht die beste Wahl.Eine reine JavaScript-Lösung sollte ebenfalls angeboten werden, da die Lösung nicht schwierig ist:
Dies gibt eine Reihe von Attribut - Objekte, die haben
name
undvalue
Eigenschaften:Bearbeiten: Um noch einen Schritt weiter zu gehen, können Sie ein Wörterbuch erhalten, indem Sie die Attribute iterieren und ein Datenobjekt füllen:
Sie können dann auf den Wert von beispielsweise
data-my-value="2"
as zugreifendata.myValue
.jsfiddle.net/3KFYf/33
Bearbeiten: Wenn Sie Datenattribute für Ihr Element programmgesteuert von einem Objekt aus festlegen möchten, können Sie:
jsfiddle.net/3KFYf/34
BEARBEITEN: Wenn Sie Babel oder TypeScript verwenden oder nur für es6-Browser codieren, ist dies ein guter Ort, um es6-Pfeilfunktionen zu verwenden und den Code ein wenig zu verkürzen:
quelle
-
Zeichen nicht wie jQuery, die bearbeitete Antwort jedoch.JSON.stringify()
die JSON-Formatierung eingebaut ist.el.getAttribute("data-foo")
. Ich habe meine Antwort aktualisiert, um zu zeigen, wie Sie Datenattribute basierend auf einem Objekt festlegen können.Schauen Sie hier :
Wenn der Browser auch die HTML5-JavaScript-API unterstützt, sollten Sie in der Lage sein, die Daten abzurufen mit:
oder
Oh, aber ich habe auch gelesen:
Es ist ab Mai 2010.
Wenn Sie jQuery trotzdem verwenden, sollten Sie sich das Plugin für benutzerdefinierte Daten ansehen . Ich habe jedoch keine Erfahrung damit.
quelle
$("#my").customdata()
sollte dir geben{method: "delete", remote: "true"}
... also sollte es funktionieren.Wie oben erwähnt, verfügen moderne Browser über die API The HTMLElement.dataset .
Mit dieser API erhalten Sie eine DOMStringMap , und Sie können die Liste der
data-*
Attribute einfach abrufen :Sie können auch ein Array mit den
data-
Schlüsselnamen der Eigenschaft wie abrufenoder ordnen Sie seine Werte mit
Auf diese Weise können Sie diese iterieren und verwenden, ohne zwischen allen Attributen des Elements filtern zu müssen, wie wir es zuvor getan haben .
quelle
oder konvertieren Sie
gilly3
die hervorragende Antwort auf eine jQuery-Methode:Verwenden von :
$('.foo').info()
;quelle
Sie sollten die Daten über die Dataset-Attribute erhalten
Datensatz ist ein nützliches Werkzeug zum Abrufen von Datenattributen
quelle
this.dataset
funktioniert noch nicht in allen Browsern. Es gibt jedoch ein jquery-Plugin , das diese Funktion bietet.Sie können die Datenattribute wie jedes andere Objekt einfach durchlaufen, um Schlüssel und Werte abzurufen. Gehen Sie dazu folgendermaßen vor
$.each
:quelle
Ich benutze verschachtelt jeweils - für mich ist das die einfachste Lösung (leicht zu steuern / ändern „ , was man mit den Werten zu tun - in meinem Beispiel Ausgangsdaten-Attribute wie
ul-list
) (JQuery - Code)Codepen: https://codepen.io/ezra_siton/pen/GRgRwNw?editors=1111
quelle
Eine Möglichkeit, alle Datenattribute zu finden, ist die Verwendung
element.attributes
. Mit.attributes
können Sie alle Elementattribute durchlaufen und die Elemente herausfiltern, die die Zeichenfolge "data-" enthalten.quelle