Verzeihen Sie mir, dass ich nicht genauer darauf eingegangen bin. Ich habe so einen seltsamen Fehler. Nachdem das Dokument geladen wurde, schleife ich einige Elemente, die ursprünglich vorhanden waren data-itemname=""
, und setze diese Werte mit .attr("data-itemname", "someValue")
.
Problem: Wenn ich diese Elemente später durchschleife elem.data().itemname
, bekomme ich ""
, wenn ich es tue elem.attr("data-itemname")
, aber wenn ich es tue , bekomme ich "someValue"
. Es ist, als würde der .data()
Getter von jQuery nur Elemente abrufen, die anfänglich so eingestellt sind, dass sie einen bestimmten Wert enthalten. Wenn sie jedoch ursprünglich leer sind und später festgelegt werden, .data()
wird der Wert später nicht mehr abgerufen.
Ich habe versucht, diesen Fehler wiederherzustellen, konnte es aber nicht.
Bearbeiten
Ich habe den Fehler neu erstellt! http://jsbin.com/ihuhep/edit#javascript,html,live
Auch Ausschnitte aus dem obigen Link ...
JS:
var theaters = [
{ name: "theater A", theaterId: 5 },
{ name: "theater B", theaterId: 17 }
];
$("#theaters").html(
$("#theaterTmpl").render(theaters)
);
// DOES NOT WORK - .data("name", "val") does NOT set the val
var theaterA = $("[data-theaterid='5']");
theaterA.find(".someLink").data("tofilllater", "theater5link"); // this does NOT set data-tofilllater
$(".someLink[data-tofilllater='theater5link']").html("changed link text"); // never gets changed
// WORKS - .attr("data-name", "val") DOES set val
var theaterB = $("[data-theaterid='17']");
theaterB.find(".someLink").attr("data-tofilllater", "theater17link"); // this does set data-tofilllater
$(".someLink[data-tofilllater='theater17link']").html("changed link text");
HTML:
<body>
<div id="theaters"></div>
</body>
<script id="theaterTmpl" type="text/x-jquery-tmpl">
<div class="theater" data-theaterid="{{=theaterId}}">
<h2>{{=name}}</h2>
<a href="#" class="someLink" data-tofilllater="">need to change this text</a>
</div>
</script>
elem.data("itemname")
nicht nichtelem.data().itemname
?elem.data().itemname = somevalue;
also nicht die zugrunde liegenden Daten.)Antworten:
Ich bin vor einigen Tagen auf einen ähnlichen "Fehler" gestoßen, als ich mit
.data()
und.attr('data-name')
für HTML5-Datenattribute gearbeitet habe.Das Verhalten, das Sie beschreiben, ist kein Fehler, sondern beabsichtigt.
Der
.data()
Aufruf ist etwas Besonderes - er ruft nicht nur HTML5-Datenattribute ab, sondern versucht auch, die Attribute auszuwerten / zu analysieren.data-myjson='{"hello":"world"}'
Wenn also ein Attribut wie beim Abrufen von über zurückgegeben.data()
wird, wirdObject
beim Abrufen von über.attr()
eine Zeichenfolge zurückgegeben. Siehe jsfiddle-Beispiel.Da
.data()
bei der zusätzlichen Verarbeitung jQuery die Ergebnisse der Attributauswertung in speichert, ist es nach der Auswertung$.cache
eines Datenattributs verschwenderisch, bei jedem.data()
Aufruf eine Neubewertung vorzunehmen - insbesondere, da Datenvariablen komplexe JSON-Zeichenfolgen enthalten können.Ich habe das alles gesagt, um Folgendes zu sagen: Nach dem Abrufen eines Attributs über
.data()
Änderungen, die von vorgenommen wurden,.attr('data-myvar', '')
werden nachfolgende.data()
Aufrufe nicht mehr angezeigt. Testen Sie dies auf jsfiddle.Um dieses Problem zu vermeiden, mischen Sie nicht
.data
und.attr()
rufen Sie nicht auf. Verwenden Sie den einen oder anderen.quelle
Dies ist das Ergebnis eines Missverständnisses:
data
ist KEIN Accessor fürdata-*
Attribute . Es ist mehr und weniger.data
ist ein Accessor für den Datencache von jQuery für das Element. Das Cache wird initialisiert vondata-*
Attributen , wenn überhaupt vorhanden sind, aberdata
nie schreibt auf die Attribute, noch hat die Attributänderung nach der Initialisierung Ändern der Daten - Cache:data
Massiert auch das, was es findet, auf verschiedene Arten, errät Datentypen, erstelltdata("answer")
ein Element mitdata-answer="42"
einer Zahl, nicht einer Zeichenfolge, oder analysiert sogar Dinge als JSON, wenn sie wie JSON aussehen:Wenn Sie die Attribute verwenden möchten (sowohl zum Lesen als auch zum Festlegen), verwenden Sie
attr
nichtdata
.attr
ist ein Accessor für Attribute.quelle
Das liegt daran, dass das Attribut heißt
data-itemname
. Sie können nicht-
in der Kurzschreibweiseobj.attribute
verwenden (obj.data-itemname wird als "obj.data minus itemname" interpretiert).quelle
.attr("data-itemname", "someValue")
ändert das DOM..data("itemname", "someValue")
Ändert den jQuery-Cache.Damit dies in folgendem Javascript und zusätzlich in CSS funktioniert, müssen Sie beide festlegen.
quelle
Warum benutzt du nicht einfach
.data()
überall?Sie können Standardwerte auch inline im HTML deklarieren, was ebenfalls in Ordnung ist.
und
Wenn Sie es ändern möchten, tun Sie es einfach
und um es insgesamt zu entfernen, könnten Sie aufrufen
Sie sollten wirklich versuchen, die Verwendung zu vermeiden
.attr("data-*")
. Ich weiß nicht, warum Sie dies sowieso tun möchten.quelle
.attr('data-*', ...)
wird die Daten nicht sichtbar machen für.data()
getAttribute()
undsetAttribute()
-, sodass beide Methoden auf die tatsächlichen Attribute zugreifen und es wieder funktioniert. Oder Sie nutzen einfach diedataSet
Eigenschaft, die moderne Browser bieten.class
stattdessen a, da Browser native Funktionen haben, um Elemente mit einer bestimmten Klasse abzurufen.Sie müssen die Daten mit einstellen
.data('itemname', 'someValue');
. Das Festlegen.attr()
von Datenattributen funktioniert nicht: http://jsfiddle.net/ThiefMaster/YHsKx/Sie können jedoch Inline-Werte bereitstellen, indem Sie z
<div data-key="value">
. B. im Markup verwenden.quelle
.data()
Aufruf setzt das Attribut, während der.attr()
Aufruf nichts tut..attr()
überhaupt, nur.data()
, und die Länge des Wählers,$(".someLink[data-tofilllater='theater5link']")
ist Null. Es ist also so, als müsste ich Folgendes verwenden.attr()
: /Ich kann sehen, dass dies zu einer gewissen Aufteilung der Vorgehensweise bei der Einstellung der Datenattribute geführt hat.
Auch ich bin auf dieses Problem gestoßen und habe festgestellt, dass das Problem einfach in der Formatierung des Namens des Datenattributs zu liegen scheint .
Nach meiner Erfahrung sollten Sie die Verwendung von Bindestrichen in der Datenvariablen (dem Variablennamen nach " data- ") vermeiden .
Das hat bei mir nicht funktioniert:
[Markup]
[jQuery]
Aber das Folgende hat gut funktioniert! :):
(Ich verwende bei Bedarf einen Unterstrich anstelle eines Bindestrichs.)
[Markup]
[jQuery]
Ich hoffe, es hilft. Prost alle!
quelle