Comment passer un tableau dans l'attribut jQuery .data ()

86

Ok donc je veux passer un tableau très basique dans un côté serveur de données jquery comme ceci:

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

puis récupérez comme ceci:

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

alert(stuff[0]);

Pourquoi cela semble-t-il alerter '[' et non 'a' (voir le lien JSfiddle)

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

Wilsonpage
la source

Réponses:

144

Il traite votre variable comme une chaîne dont l'élément zéro est [ .

Cela se produit car votre chaîne n'est pas un JSON valide , qui doit utiliser des guillemets doubles comme délimiteur de chaîne au lieu de guillemets simples. Vous devrez ensuite utiliser des guillemets simples pour délimiter toute la valeur d'attribut.

Si vous corrigez vos guillemets, votre code d'origine fonctionne (voir http://jsfiddle.net/ktw4v/12/ )

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

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

Lorsque jQuery voit du JSON valide dans un attribut de données, il le décompresse automatiquement pour vous .

Alnitak
la source
5
en fait, ['a', 'b', 'c'] n'est PAS un JSON valide;)
stecb
2
['a', 'b', 'c'] n'est pas valide JSON
Mutt
À quoi devrait ressembler le JSON?
wilsonpage
5
Il devrait utiliser des guillemets doubles, mais vous devrez alors utiliser des guillemets simples pour entourer l'attribut HTML.
Alnitak
1
@JoeBrockhaus ce sont tous les deux des délimiteurs - les guillemets sont des "délimiteurs de chaîne" et les virgules sont des "délimiteurs d'enregistrement". Seuls les premiers sont pertinents pour la question du PO.
Alnitak
15

Le déclarer comme attribut signifie qu'il s'agit d'une chaîne.

Ce stuff[0]serait donc équivalent à:var myString = "['a','b','c']"; alert(myString[0]);

Vous devez le faire ressembler à ceci:

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

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

Rétractation: l'analyse de jQuery échoue car elle ne répond pas aux règles de parseJSON.

Cependant, je soutiendrai ma solution. Certains aspects des autres sont loin d'être idéaux, tout comme cette solution est loin d'être idéale à certains égards. Tout dépend de vos paradigmes.

John Green
la source
4
non, le déclarer comme JSON invalide signifie qu'il est traité comme une chaîne.
Alnitak
@Alnitak - Bien que cela puisse très bien être la façon dont jQuery le traite - je ne vois pas cela dans la référence jQuery Api, et ce n'est certainement pas clair dans la spécification w3c. Comme définir JSON dans un objet dom briserait la «neutralité» du w3c, cela semble être une extension jQuery ou, étant donné le manque de documentation - bizarrerie. En tout cas, même si je ne peux pas dire que je suis d'accord avec vous sur ce point, je ne suis pas si irrité que je vais supprimer le premier +1 que vous avez. :)
John Green
@John, il est documenté dans l'API jQuery - "Toutes les tentatives sont faites pour convertir la chaîne en une valeur JavaScript (cela inclut les booléens, les nombres, les objets, les tableaux et null) sinon elle est laissée sous forme de chaîne."
Alnitak
@Alnitak Alors je suis défoncé, car j'ai lu à peu près toute la section de données et de nombreux commentaires avant de poster. J'ai juste regardé encore une fois.
John Green
@Alnitak ok, je l'ai trouvé à partir de votre modification. Oui, c'est une extension Jquery. Je vais modifier mon message.
John Green
-2

Comme d'autres l'ont identifié, la valeur est traitée comme une chaîne et renvoie donc "[". Veuillez essayer ceci (aaa est le nom de la div et j'ai sorti les données):

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

Une approche différente est publiée sur jsfiddle ; var stuff = $('div').data('stuff');stuff est une chaîne avec le 0ème caractère comme '['

Eh bien, var stuff = eval($('div').data('stuff'));devrait vous obtenir un tableau

Mayank
la source
3
eval is evil :) il y a toujours un meilleur moyen
BYTE RIDER
Veuillez ajuster votre réponse pour dire que, bien qu'une solution possible, eval () pourrait provoquer la mort de licornes ... stackoverflow.com/questions/86513
Just Plain High