Як передати масив в атрибут jQuery .data ()


86

Гаразд, я хочу передати дуже базовий масив у сторону сервера jtruery attrubute:

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

а потім відступити так:

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

alert(stuff[0]);

Чому це видає попередження "[", а не "a" (див. Посилання JSfiddle)

Посилання JSFiddle: http://jsfiddle.net/ktw4v/3/

Відповіді:


144

Він обробляє вашу змінну як рядок, нульовим елементом якої є [.

Це відбувається тому, що ваш рядок неприпустимий JSON , який повинен використовувати подвійні лапки як роздільник рядків замість одинарних лапок. Потім вам доведеться використовувати одинарні лапки, щоб обмежити все значення атрибута.

Якщо ви виправили лапки, оригінальний код працює (див. Http://jsfiddle.net/ktw4v/12/ )

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

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

Коли jQuery бачить дійсний JSON в атрибуті даних, він автоматично розпаковує його для вас .


5
infact, ['a', 'b', 'c'] НЕ є дійсним JSON;)
stecb

2
['a', 'b', 'c'] не є дійсним JSON
Мутт

Яким повинен бути JSON?
wilsonpage

5
Він повинен використовувати подвійні лапки, але тоді вам доведеться використовувати одинарні лапки, щоб укласти атрибут HTML.
Альнітак

1
@JoeBrockhaus вони обидва роздільники - лапки - це "роздільники рядків", а коми - "роздільники записів". Лише перші стосуються питання ОП.
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]);

Відступ: аналіз jQuery не вдається, оскільки він не відповідає правилам parseJSON.

Однак я буду стояти за своїм рішенням. Є аспекти інших, які є менш ніж ідеальними, так само, як це рішення є певним чином ідеальним. Все залежить від того, якими є ваші парадигми.


4
ні, оголосивши його недійсним JSON означає, що він обробляється як рядок.
Альнітак

@Alnitak - Хоча це цілком може бути способом, яким поводиться jQuery з цим, - я не бачу цього у посиланні на jQuery Api, і, звичайно, це не зрозуміло у специфікації w3c. Оскільки визначення JSON в об’єкті dom порушить «нейтральність» w3c, це, схоже, є розширенням jQuery або, з огляду на відсутність документації, химерністю. У будь-якому випадку, хоча я не можу сказати, що я з цим згідний з вами - я не настільки роздратований, що збираюся видалити той перший ваш +1. :)
Джон Грін

@John це буде документовано в API JQuery - «Кожна спроба перетворити рядок в значення JavaScript (це включає в себе булеві, числа, об'єкти, масиви і нуль) в іншому випадку вона залишається у вигляді рядка.»
Альнітак

@Alnitak Тоді я на висоті, бо перед публікацією прочитав майже весь розділ даних та багато коментарів. Я просто подивився ще раз.
Джон Грін,

@Alnitak ok, я знайшов це з вашого редагування. Так, це розширення 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.