Lassen Sie mich die Frage anders formulieren: Was sind die praktischen Unterschiede zwischen den beiden verfügbaren Datenbindungsoptionen?
Eigentlich gibt es drei Möglichkeiten:
$(e).prop('myKey', myValue);
$(e).data('myKey', myValue);
$(e).attr('data-myKey', myValue);
Anmerkung: OP's e.myKey = myValue
ist praktisch dasselbe wie die .prop()
Linie.
- wenn Sie mehr als Strings benötigen, verwenden Sie
.prop()
d.h. Expandierungseigenschaften
- wenn Sie DOM/CSS-Transparenz und/oder HTML-Serialisierung benötigen, verwenden Sie
.attr('data-*')
- wenn Sie beides brauchen, haben Sie Pech gehabt
- wenn Sie nur Strings verwenden, aber kein DOM benötigen, lesen Sie weiter, um die Vor- und Nachteile selbst abzuwägen
- Was ist mit
.data()
Lesen Sie die letzten beiden Absätze
Wenn Sie jemals die Daten mit serialisiertem HTML weitergeben benötigen Sie die .attr()
Lösung. D.h. immer wenn Sie Dinge verwenden wie .innerHTML
ou .html()
oder Snippets aus Strings mit enthaltenen Daten konstruieren wollen. Das Gleiche gilt, wenn Sie CSS-Selektoren verwenden wollen wie elem[data-myKey]
. Nachteil: Sie können nur Zeichenketten speichern.
Wenn Ihre Daten nicht im DOM sichtbar oder für CSS-Interaktionen verfügbar sein müssen .data()
y .prop()
könnte funktionieren. Ihr größter Vorteil ist: Sie kann einen beliebigen Javascript-Wert enthalten .
.prop()
Der größte Nachteil ist die Möglichkeit, dass Namenskollision . Wählen Sie nur Namen, bei denen Sie sicher sein können, dass sie niemals als einheimisches Eigentum verwendet werden. Z.B.. scope
als Schlüssel ist eine schlechte Idee, weil sie bei einigen HTML-Elementen existiert...
Jetzt kommt .data()
. Die anderen Antworten scheinen darauf zu schwören, ich vermeide es. Die Speicherlecks im Zusammenhang mit .prop()
und Expando-Eigenschaften gehören im Allgemeinen der Vergangenheit an, so dass dies keinen Vorteil mehr darstellt. Aber Sie werden gegen Namenskollisionen mit HTML-Eigenschaften abgesichert sein. Das ist ein Vorteil. Aber Sie erhalten eine Reihe von Nachteilen:
$(e).data('myKey')
bezieht seinen uninitialisierten Wert aus der data-myKey
Attribut, falls vorhanden, führt JSON.parse() für diese aus und manchmal gibt das zurück oder greift auf den String-Wert des Attributs zurück. Sobald Sie die $(e).data('myKey', myValue)
verlieren Sie die Beziehung zu den data-myKey
Attribut, das dennoch mit seinem "alten" Wert weiterlebt und im DOM und in CSS-Interaktionen angezeigt wird. Hinzu kommt, dass der von Ihnen verwendete Schlüsselname möglicherweise missbraucht wird. D.h. wenn Sie sich jemals entscheiden, alle Schlüssel-Werte über $(e).data()
die Schlüssel in diesem Objekt können unterschiedlich sein.
Aus diesem Grund fehlerhaftes Verhalten (Vermischung von Expando-Eigenschaftstechnologie mit data-*
Attribute) und inkonsistentes get/set-Design habe ich immer vermeiden .data()
Glücklicherweise ist das leicht zu machen mit .prop()
y .attr()
(mit data-*
Schlüssel für die Einhaltung der Vorschriften).
Wenn Sie wirklich Folgendes verwenden möchten .data()
um Namenskonflikte mit einheimischen Eigenschaften zu vermeiden, rate ich: nicht mit data-*
Attribute, betrachten Sie diese als etwas anderes und vermeiden Sie Namenskonflikte mit diesen. Für die automatische Vermeidung von Konflikten müssen Sie Konflikte an anderer Stelle manuell vermeiden. Tolles Design.