배열을 jQuery .data () 속성에 전달하는 방법


86

좋아, 그래서 매우 기본적인 배열을 jquery 데이터 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

변수를 문자열로 처리하고 0 번째 요소는 [.

이는 문자열이 유효한 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
[ '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의 구문 분석이 parseJSON 규칙을 충족하지 않았기 때문에 실패합니다.

그러나 나는 내 솔루션 뒤에 설 것입니다. 이 솔루션이 어떤면에서 이상적이지 않은 것처럼 이상적이지 않은 다른 측면이 있습니다. 모두 당신의 패러다임이 무엇인지에 달려 있습니다.


4
아니요, 잘못된 JSON으로 선언하면 문자열로 처리됩니다.
Alnitak

@Alnitak-jQuery가 처리하는 방식 일 수 있지만 jQuery Api 참조에서는 볼 수 없으며 w3c 사양에서는 명확하지 않습니다. dom 객체에서 JSON을 정의하면 w3c의 '중립성'이 깨지기 때문에 이것은 jQuery 확장으로 보이거나 문서가 부족한 점을 감안할 때 기발합니다. 여하튼, 내가이 점에 대해 동의한다고 말할 수는 없지만-나는 당신이받은 첫 번째 +1을 제거 할 것만 큼 너무 짜증나지는 않습니다. :)
존 그린

이 @ 존 되는 JQuery와 API에 설명 - "모든 시도는 그렇지 않으면 문자열로 남아있는 자바 스크립트 값 (이 논리 값, 숫자, 객체, 배열, 널 포함)로 문자열을 변환하게됩니다."
Alnitak

@Alnitak 그런 다음 게시하기 전에 전체 데이터 섹션과 많은 주석을 거의 읽었 기 때문에 나는 높았습니다. 나는 다시 봤다.
John Green

@Alnitak 좋아, 나는 당신의 편집에서 그것을 찾았습니다. 예, 이것은 Jquery 확장입니다. 내 게시물을 수정하겠습니다.
John Green

-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
평가는 악한 :) 더 좋은 방법은 항상있다
BYTE RIDER

가능한 해결책이기는하지만 eval ()으로 인해 유니콘이 죽을 수 있다고 답변을 조정하십시오 ... stackoverflow.com/questions/86513/…
Just Plain High
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.