配列をjQuery.data()属性に渡す方法


86

さて、次のように非常に基本的な配列をjqueryデータ属性サーバー側に渡したいと思います。

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

そして、次のように取得します。

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

alert(stuff[0]);

これが「a」ではなく「[」に警告するように見えるのはなぜですか(JSfiddleリンクを参照)

JSFiddleリンク: http ://jsfiddle.net/ktw4v/3/

回答:


144

変数を文字列として扱い、その0番目の要素はです[

これは、文字列が有効なJSONではないために発生します。JSONでは、一重引用符ではなく二重引用符を文字列区切り文字として使用する必要があります。次に、属性値全体を区切るために一重引用符を使用する必要があります。

引用符を修正すると、元のコードが機能します(http://jsfiddle.net/ktw4v/12/を参照)。

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

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

jQueryがデータ属性で有効なJSONを検出すると、自動的に解凍されます


5
実際、['a'、 'b'、 'c']は有効なJSONではありません;)
stecb

2
[ ''、 'B'、 'C']は有効なJSONではありません
Muttに

JSONはどのように見えるべきですか?
wilsonpage

5
二重引用符を使用する必要がありますが、HTML属性を囲むには一重引用符を使用する必要があります。
Alnitak

1
@JoeBrockhausは、どちらも区切り文字です。引用符は「文字列区切り文字」で、コンマは「レコード区切り文字」です。前者のみがOPの質問に関連しています。
Alnitak

15

それを属性として宣言することは、それが文字列であることを意味します。

したがってstuff[0]、次と同等になります。var myString = "['a','b','c']"; alert(myString[0]);

次のようにする必要があります。

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

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

撤回:parseJSONのルールを満たしていないため、jQueryの解析は失敗します。

しかし、私は自分の解決策の後ろに立ちます。このソリューションがいくつかの点で理想的ではないのと同じように、他の側面には理想的ではない側面があります。すべてはあなたのパラダイムが何であるかに依存します。


4
いいえ、無効な​​JSONとして宣言すると、文字列として扱われます。
Alnitak

@ Alnitak-それはjQueryがそれを処理する方法である可能性が非常に高いですが-jQueryApiリファレンスではそれがわかりません。また、w3c仕様では明らかに明確ではありません。domオブジェクトでJSONを定義すると、w3cの「中立性」が損なわれるため、これはjQuery拡張機能であるか、ドキュメントが不足していることを考えると、癖のようです。とにかく、私はこの点であなたに同意するとは言えませんが、私はあなたが得た最初の+1を削除するつもりであるほど気になりません。:)
ジョングリーン

@JohnそれjQueryAPIに文書化されています-「文字列をJavaScript値(ブール値、数値、オブジェクト、配列、およびnullを含む)に変換するすべての試みが行われ、それ以外の場合は文字列として残されます。」
Alnitak

@Alnitak投稿する前に、データセクション全体とコメントの多くを読んだので、私は高いです。もう一度見ただけです。
ジョングリーン

@Alnitakわかりました、あなたの編集から見つけました。はい、これはJqueryの拡張機能です。投稿を修正します。
ジョングリーン

-2

他の人が識別したように、値は文字列として扱われるため、「[」を返します。これを試してみてください(aaaはdivの名前で、データを取り出しました):

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

-4

別のアプローチがjsfiddleに投稿されてます; var stuff = $('div').data('stuff');stuffは、0番目の文字が「[」である文字列です。

さて、var stuff = eval($('div').data('stuff'));あなたに配列を取得する必要があります


3
evalは悪です:)常により良い方法があります
BYTE RIDER

可能な解決策ではありますが、eval()によってユニコーンが死ぬ可能性があると答えを調整してください... stackoverflow.com/questions/86513/…–
Just Plain High
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.