วิธีส่งอาร์เรย์ไปยังแอตทริบิวต์ jQuery .data ()


86

ตกลงดังนั้นฉันต้องการส่งอาร์เรย์พื้นฐานไปยังฝั่งเซิร์ฟเวอร์ jquery data attrubute ดังนี้:

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

แล้วถอยออกมาดังนี้:

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

alert(stuff[0]);

เหตุใดสิ่งนี้จึงปรากฏขึ้นเพื่อแจ้งเตือน "[" และไม่ใช่ "a" (ดูลิงก์ JSfiddle)

ลิงค์ JSFiddle: http://jsfiddle.net/ktw4v/3/

คำตอบ:


145

[มันรักษาตัวแปรของคุณเป็นสตริงองค์ประกอบข้อที่ศูนย์ซึ่งเป็น

สิ่งนี้เกิดขึ้นเนื่องจากสตริงของคุณไม่ใช่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 ที่ถูกต้อง
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]);

การถอนกลับ: การแยกวิเคราะห์ของ jQuery ล้มเหลวเนื่องจากไม่เป็นไปตามกฎของการแยกวิเคราะห์

อย่างไรก็ตามฉันจะยืนอยู่เบื้องหลังการแก้ปัญหาของฉัน มีแง่มุมอื่น ๆ ที่น้อยกว่าอุดมคติเช่นเดียวกับการแก้ปัญหานี้น้อยกว่าอุดมคติในบางวิธี ทั้งหมดขึ้นอยู่กับว่ากระบวนทัศน์ของคุณคืออะไร


4
ไม่การประกาศว่าเป็น JSON ที่ไม่ถูกต้องหมายความว่าถือว่าเป็นสตริง
Alnitak

@Alnitak - แม้ว่านั่นอาจเป็นวิธีที่ jQuery ปฏิบัติต่อมันได้เป็นอย่างดี - ฉันไม่เห็นสิ่งนั้นในการอ้างอิง jQuery Api และแน่นอนว่ามันไม่ชัดเจนในข้อมูลจำเพาะ w3c เนื่องจากการกำหนด JSON ในอ็อบเจ็กต์ dom จะทำลาย 'ความเป็นกลาง' ของ w3c สิ่งนี้ดูเหมือนจะเป็นส่วนขยาย jQuery หรือเนื่องจากขาดเอกสาร - มุมแหลม ไม่ว่าอย่างไรก็ตามฉันไม่สามารถพูดได้ว่าฉันเห็นด้วยกับคุณในประเด็นนี้ แต่ฉันก็ไม่ได้โกรธที่ฉันจะลบ +1 แรกที่คุณได้รับ :)
จอห์นกรีน

@ จอห์นมีการบันทึกไว้ใน jQuery API - "ทุกครั้งที่พยายามแปลงสตริงเป็นค่า JavaScript (ซึ่งรวมถึงบูลีนตัวเลขวัตถุอาร์เรย์และค่าว่าง) มิฉะนั้นจะถูกปล่อยให้เป็นสตริง"
Alnitak

@Alnitak ถ้าอย่างนั้นฉันก็สูงเพราะฉันอ่านส่วนข้อมูลทั้งหมดและความคิดเห็นมากมายก่อนโพสต์ ฉันเพิ่งมองอีกครั้งด้วยซ้ำ
John Green

@Alnitak ตกลงฉันพบมันจากการแก้ไขของคุณ ใช่นี่คือส่วนขยาย Jquery ฉันจะแก้ไขโพสต์ของฉัน
John Green

-2

เนื่องจากคนอื่น ๆ ระบุว่าค่านี้ถือว่าเป็นสตริงดังนั้นจึงส่งคืน "[" โปรดลองสิ่งนี้ (aaa คือชื่อของ div และฉันเอา data-stuff):

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

-3

มีการโพสต์แนวทางอื่นที่jsfiddle ; var stuff = $('div').data('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.