Übergeben eines Arrays an das Attribut jQuery .data ()

85

Ok, also ich möchte ein sehr einfaches Array wie folgt an eine jquery data attrubute-Serverseite übergeben:

<div data-stuff="['a','b','c']"></div>

und dann wie folgt zurückerhalten:

var stuff = $('div').data('stuff');

alert(stuff[0]);

Warum scheint dies '[' und nicht 'a' zu alarmieren (siehe JSfiddle-Link)

JSFiddle Link: http://jsfiddle.net/ktw4v/3/

wilsonpage
quelle

Antworten:

143

Es behandelt Ihre Variable als Zeichenfolge, deren nulltes Element ist [.

Dies geschieht, weil Ihre Zeichenfolge kein gültiges JSON ist , bei dem anstelle von einfachen Anführungszeichen doppelte Anführungszeichen als Zeichenfolgenbegrenzer verwendet werden sollten. Sie müssen dann einfache Anführungszeichen verwenden, um den gesamten Attributwert abzugrenzen.

Wenn Sie Ihre Anführungszeichen korrigieren, funktioniert Ihr Originalcode (siehe http://jsfiddle.net/ktw4v/12/ ).

<div data-stuff='["a","b","c"]'> </div>

var stuff = $('div').data('stuff');

Wenn jQuery gültiges JSON in einem Datenattribut sieht, wird es automatisch für Sie entpackt .

Alnitak
quelle
5
infact, ['a', 'b', 'c'] ist KEIN gültiger JSON;)
stecb
2
['a', 'b', 'c'] ist nicht gültig JSON
Mutt
Wie soll der JSON aussehen?
Wilsonpage
5
Es sollte doppelte Anführungszeichen verwenden, aber dann müssten Sie einfache Anführungszeichen verwenden, um das HTML-Attribut einzuschließen.
Alnitak
1
@ JoeBrockhaus beide sind Trennzeichen - Anführungszeichen sind "Zeichenfolgenbegrenzer" und Kommas sind "Datensatztrennzeichen". Nur die ersteren sind für die Frage des OP relevant.
Alnitak
15

Wenn Sie es als Attribut deklarieren, bedeutet dies, dass es sich um eine Zeichenfolge handelt.

Also stuff[0]wäre gleichbedeutend mit:var myString = "['a','b','c']"; alert(myString[0]);

Sie müssen es so aussehen lassen:

<div data-stuff="a,b,c"></div>

var stuff = $('div').data('stuff').split(',');
alert(stuff[0]);

Rückzug: Das Parsen von jQuery schlägt fehl, weil es nicht den Regeln von parseJSON entspricht.

Ich werde jedoch hinter meiner Lösung stehen. Es gibt Aspekte der anderen, die weniger als ideal sind, genauso wie diese Lösung in mancher Hinsicht weniger als ideal ist. Alles hängt davon ab, was Ihre Paradigmen sind.

John Green
quelle
4
Nein, wenn Sie es als ungültiges JSON deklarieren, wird es als Zeichenfolge behandelt.
Alnitak
@Alnitak - Auch wenn jQuery das so behandelt, sehe ich das in der jQuery-API-Referenz nicht, und in der w3c-Spezifikation ist es mit Sicherheit nicht klar. Da das Definieren von JSON in einem dom-Objekt die 'Neutralität' des w3c beeinträchtigen würde, scheint dies eine jQuery-Erweiterung oder angesichts der fehlenden Dokumentation eine Eigenart zu sein. Auf jeden Fall, obwohl ich nicht sagen kann, dass ich Ihnen in diesem Punkt zustimme - ich bin nicht so verärgert, dass ich die ersten +1 entfernen werde, die Sie bekommen haben. :)
John Green
@ John es ist in der jQuery-API dokumentiert - "Bei jedem Versuch wird versucht, die Zeichenfolge in einen JavaScript-Wert zu konvertieren (dies schließt Boolesche Werte, Zahlen, Objekte, Arrays und Null ein), andernfalls bleibt sie als Zeichenfolge erhalten."
Alnitak
@Alnitak Dann bin ich hoch, weil ich vor dem Posten so ziemlich den gesamten Datenbereich und viele der Kommentare gelesen habe. Ich habe gerade noch einmal geschaut.
John Green
@Alnitak ok, ich habe es aus deiner Bearbeitung gefunden. Ja, dies ist eine Jquery-Erweiterung. Ich werde meinen Beitrag ändern.
John Green
-2

Wie andere identifiziert haben, wird der Wert als Zeichenfolge behandelt, sodass "[" zurückgegeben wird. Bitte versuchen Sie dies (aaa ist der Name des Div und ich habe das Datenmaterial herausgenommen):

$(function(){
    $.data($("#aaa")[0],"stuff",{"aa":['a','b','c']});
    var stuff = $.data($("#aaa")[0],"stuff").aa;
    alert(stuff[0]); //returns "a"
});
Raja
quelle
-4

Ein anderer Ansatz ist bei jsfiddle zu finden . var stuff = $('div').data('stuff');stuff ist eine Zeichenfolge mit dem 0. Zeichen als '['

Nun, var stuff = eval($('div').data('stuff'));sollte Ihnen ein Array besorgen

Mayank
quelle
3
Eval ist böse :) Es gibt immer einen besseren Weg
BYTE RIDER
Bitte passen Sie Ihre Antwort an, um zu sagen, dass eval (), obwohl eine mögliche Lösung, dazu führen kann, dass Einhörner sterben ... stackoverflow.com/questions/86513/…
Just Plain High