Cách chuyển một mảng vào thuộc tính jQuery .data ()


86

Ok, vì vậy tôi muốn chuyển một mảng rất cơ bản vào một phía máy chủ tập tin dữ liệu jquery như sau:

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

và sau đó rút lui như vậy:

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

alert(stuff[0]);

Tại sao điều này xuất hiện để cảnh báo '[' chứ không phải 'a' (xem liên kết JSfiddle)

Liên kết JSFiddle: http://jsfiddle.net/ktw4v/3/

Câu trả lời:


144

Nó coi biến của bạn là một chuỗi, phần tử thứ 0 của nó là [.

Điều này đang xảy ra vì chuỗi của bạn không phải là JSON hợp lệ , nên sử dụng dấu ngoặc kép làm dấu phân cách chuỗi thay vì dấu nháy đơn. Sau đó, bạn sẽ phải sử dụng dấu ngoặc đơn để phân tách toàn bộ giá trị thuộc tính.

Nếu bạn sửa dấu ngoặc kép, mã gốc của bạn sẽ hoạt động (xem http://jsfiddle.net/ktw4v/12/ )

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

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

Khi jQuery nhìn thấy JSON hợp lệ trong một thuộc tính dữ liệu, nó sẽ tự động giải nén nó cho bạn .


5
infact, ['a', 'b', 'c'] KHÔNG phải là JSON hợp lệ;)
stecb

2
['a', 'b', 'c'] không phải là JSON hợp lệ
Mutt

JSON sẽ trông như thế nào?
wilsonpage

5
Nó nên sử dụng dấu ngoặc kép, nhưng sau đó bạn phải sử dụng dấu ngoặc kép để bao gồm thuộc tính HTML.
Alnitak

1
@JoeBrockhaus cả hai đều là dấu phân cách - dấu ngoặc kép là "dấu phân cách chuỗi" và dấu phẩy là "dấu phân cách bản ghi". Chỉ những cái trước mới có liên quan đến câu hỏi của OP.
Alnitak

15

Khai báo nó như một thuộc tính có nghĩa là nó là một chuỗi.

Vì vậy, stuff[0]sẽ tương đương với:var myString = "['a','b','c']"; alert(myString[0]);

Bạn cần làm cho nó trông như thế này:

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

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

Rút lại: phân tích cú pháp của jQuery không thành công vì nó không đáp ứng các quy tắc của parseJSON.

Tuy nhiên, tôi sẽ đứng sau giải pháp của mình. Có những khía cạnh của những khía cạnh khác kém lý tưởng, cũng như giải pháp này kém lý tưởng theo một số cách. Tất cả phụ thuộc vào mô hình của bạn là gì.


4
không, việc khai báo nó là JSON không hợp lệ có nghĩa là nó được coi là một chuỗi.
Alnitak

@Alnitak - Mặc dù đó rất có thể là cách mà jQuery xử lý nó - tôi không thấy điều đó trong tham chiếu jQuery Api và chắc chắn nó không rõ ràng trong thông số w3c. Vì việc xác định JSON trong một đối tượng dom sẽ phá vỡ 'tính trung lập' của w3c, đây có vẻ là một phần mở rộng jQuery hoặc, do thiếu tài liệu - quirk. Ở bất kỳ mức nào, mặc dù tôi không thể nói rằng tôi đồng ý với bạn về điểm này - tôi không bực bội đến mức tôi sẽ xóa +1 đầu tiên mà bạn nhận được. :)
John Green

@John nó được ghi lại trong API jQuery - "Mọi nỗ lực đều được thực hiện để chuyển đổi chuỗi thành giá trị JavaScript (điều này bao gồm boolean, số, đối tượng, mảng và null) nếu không nó sẽ được để dưới dạng chuỗi."
Alnitak

@Alnitak Sau đó, tôi cao, bởi vì tôi đã đọc khá nhiều toàn bộ phần dữ liệu và nhiều bình luận trước khi đăng. Tôi chỉ nhìn lại ngay cả.
John Green

@Alnitak ok, tôi tìm thấy nó từ bản chỉnh sửa của bạn. Có, đây là một phần mở rộng Jquery. Tôi sẽ khen ngợi bài viết của tôi.
John Green

-2

Vì những người khác đã xác định giá trị được coi là chuỗi nên nó đang trả về "[". Hãy thử điều này (aaa là tên của div và tôi đã lấy dữ liệu ra):

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

-4

Một cách tiếp cận khác được đăng tại jsfiddle ; var stuff = $('div').data('stuff');thứ là một chuỗi có ký tự thứ 0 là '['

Chà, var stuff = eval($('div').data('stuff'));sẽ giúp bạn có được một mảng


3
eval là ác :) luôn có cách tốt hơn
BYTE RIDER

Vui lòng điều chỉnh câu trả lời của bạn để nói rằng, mặc dù một giải pháp khả thi, eval () có thể gây ra lân chết ... stackoverflow.com/questions/86513/...
Just Plain cao
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.