HTML jQuery의 데이터 속성에 JSON 객체 저장


134

data-접근 방식을 사용하여 HTML 태그에 데이터를 저장 하고 있습니다.

<td><"button class='delete' data-imagename='"+results[i].name+"'>Delete"</button></td>

그런 다음 콜백에서 데이터를 다음과 같이 검색합니다.

$(this).data('imagename');

잘 작동합니다. 내가 붙어있는 것은 객체의 속성 중 하나 대신 객체를 저장하려고합니다. 나는 이것을 시도했다 :

<td><button class='delete' data-image='"+results[i]+"'>Delete</button></td>

그런 다음 이름 속성에 다음과 같이 액세스하려고했습니다.

var imageObj = $(this).data('image');
console.log('Image name: '+imageObj.name);

로그가 알려줍니다 undefined. 따라서 data-속성에 간단한 문자열을 저장할 수 있지만 JSON 객체를 저장할 수없는 것 같습니다 ...

나는 운이 없이이 아이를 사용하려고했습니다.

<div data-foobar='{"foo":"bar"}'></div>

data-접근 방식을 사용하여 HTML 태그에 실제 객체를 저장하는 방법에 대한 아이디어가 있습니까?

답변:


140

텍스트에 포함시키는 대신 $('#myElement').data('key',jsonObject);

실제로는 html에 저장되지 않지만 jquery.data를 사용하는 경우 모든 것이 추상화됩니다.

JSON을 다시 가져 오려면 구문 분석하지 마십시오 .

var getBackMyJSON = $('#myElement').data('key');

당신이 얻는 경우 [Object Object]대신 직접 JSON의 데이터 만 키하여 JSON에 액세스 :

var getBackMyJSON = $('#myElement').data('key').key;

1
따라서 데이터 접근 방식을 사용하면 위의 그림과 같이 hmtl 태그를 넣어 각 삭제 버튼 (각 버튼마다 다른 json 객체를 얻습니다 ...)에 대한 값을 저장할 수 있습니다. 각 객체를 해당 삭제 버튼에 연결할 수 있도록 제안하고 있습니까? 어떻게해야합니까, 어떻게 $ ( '# myElement')를 사용합니까? 같은 방법으로? 미안, 나는 이것에 경험이 없습니다. 감사합니다
zumzum

그래서 각 HTML 버튼에 색인을 할당했습니다 : <td> <button class = 'delete'data-index = ' "+ i +"'> Delete </ button> </ td>, JSON 객체 배열 저장 $ objects 변수에서. 그런 다음 버튼을 클릭하면 다음을 수행하여 버튼 인덱스를 봅니다. var buttonIndex = $ (this) .data ( 'index'); 그런 다음 $ objects [buttonIndex]와 같이 이전에 저장된 해당 객체를 얻습니다. 올바른 방법인지 확실하지 않지만 제대로 작동합니다. 의견 주셔서 감사합니다!
zumzum

필드에 PHP 인코딩의 JSON이 포함되어 있으면 대신 대신이 작업을 수행 할 수 있습니다 htmlspecialchars(json_encode($e))( Nicolas의 아이디어에 대한 의견).
CPHPython

첫 번째 예에서 jsonObject문자열을 지정해야합니까? 편집 : 다른 사람을 돕기 위해, 나는 그 질문에 대한 답을 여기서 찾았습니다 : stackoverflow.com/a/42864472 "You don't need to stringify objects to store them using jQuery.data()"
user1063287

154

실제로 마지막 예 :

<div data-foobar='{"foo":"bar"}'></div>

잘 작동하는 것 같습니다 ( http://jsfiddle.net/GlauberRocha/Q6kKU/ 참조 ).

좋은 점은 data-attribute의 문자열이 자동으로 JavaScript 객체로 변환된다는 것입니다. 나는이 접근법에서 반대로 단점을 보지 못합니다! 객체 속성을 통해 JavaScript에서 사용할 수 있도록 전체 데이터 세트를 저장하기에 하나의 속성으로 충분합니다.

(참고 : 데이터 속성에 String 대신 자동으로 Object 유형이 제공되도록하려면 특히 키 이름을 큰 따옴표로 묶으려면 유효한 JSON을 작성해야합니다.)


20
누군가에게 도움이된다면 위의 방법에 액세스하는 방법은 다음과 같습니다 $('div').data('foobar').foo.. api.jquery.com/data
Gary

5
@GlauberRocha, 데이터에 작은 따옴표가 포함되어 있으면 어떻게됩니까? PHP에서 '나는 동안 나를 위해 작동하지 않습니다 echo json_encode($array). 작은 따옴표로 속성 값을 종료하기 때문입니다. 배열에서 작은 따옴표를 수동으로 이스케이프 처리하는 것을 제외한 모든 제안?
Ravi Dhoriya ツ

1
@ Log1c ツ 아이디어 : '를 &amp;quot;(이중 이스케이프 처리 된 HTML 엔티티) 로 인코딩 하여 소스에서 & quot; 하지만 어쩌면 당신은 당신이 "수동으로 작은 따옴표를 이스케이프"말할 때 피하고 싶은 물건의 종류의 그 ...
니콜라스 르 티에리 드 Ennequin

2
@GlauberRocha 답장을 보내 주셔서 감사합니다. 나는 같은 트릭을 사용하여 그것을 해결했다. htmlspecialchars () [ php.net/manual/en/function.htmlspecialchars.php] 사용했습니다 . 해결되었습니다. :)
Ravi Dhoriya ツ

1
객체 속성 중 하나가 작은 따옴표가 포함 된 문자열 일 때이 방법을 사용하는 데 문제가 발생했습니다. data 속성은 첫 번째 작은 따옴표로 끝나고 유효한 JSON이 아니므로 문자열로 해석됩니다. 문자열을 인코딩 할 수는 있지만 가장 쉬운 해결책은 여러 데이터 속성을 사용하는 것입니다.
Jon Hulka

43

이것이 나를 위해 일한 방법입니다.

목적

var my_object ={"Super Hero":["Iron Man", "Super Man"]};

세트

encodeURIComponent ()문자열 화 된 객체를 인코딩하고 속성으로 설정하십시오.

var data_str = encodeURIComponent(JSON.stringify(my_object));
$("div#mydiv").attr("data-hero",data-str);

가져 오기

값을 객체로 가져 오려면 decodeURIComponent () 속성 값으로 디코딩 된 값을 구문 분석하십시오 .

var data_str = $("div#mydiv").attr("data-hero");
var my_object = JSON.parse(decodeURIComponent(data_str));

14

직렬화 된 문자열base64 로 변환하면 직렬화 된 데이터 저장과 관련된 많은 문제를 해결할 수 있습니다 .

base64 문자열은 소란없이 어디에서나 수용 할 수 있습니다.

보세요:

WindowOrWorkerGlobalScope.btoa()메소드는 문자열의 각 문자가 2 진 데이터의 바이트로 처리되는 String 오브젝트에서 base-64로 인코딩 된 ASCII 문자열을 작성합니다.

WindowOrWorkerGlobalScope.atob()함수 는 base-64 인코딩을 사용하여 인코딩 된 데이터 문자열을 디코딩 합니다.

필요에 따라 변환합니다.


복잡한 객체를 속성에 전달할 때 실제로 효과적입니다.
baacke

불행히도, 부팅에는 유니 코드 문제가 있으며 모든 언어에 적합하지 않습니다.
AhmadJavadiNejad 15:56에

브라우저 사용window.btoa
Henry

1
이 방법은 방탄 IMO입니다. 그러나 base64 문자열을 검색하고 인코딩을 해제하면 JSON이 직렬화됩니다. 따라서 JSON.parse결과를 객체로 사용하려면 먼저 사용해야합니다.
헨리

13

나를 위해 템플릿에 저장해야 하므로 그렇게 작동합니다 ...

// Generate HTML
var gridHtml = '<div data-dataObj=\''+JSON.stringify(dataObj).replace(/'/g, "\\'");+'\'></div>';

// Later
var dataObj = $('div').data('dataObj'); // jQuery automatically unescape it

1
공유해 주셔서 감사합니다. 정확히 내가 찾던 것 ... 허용 된 답변을 파싱하려고 할 때 [객체 객체]를 얻지 못했습니다.
킹킹

@greaterKing 당신은 허용 된 답변에서 JSON을 구문 분석하지 않고 데이터 이름과 동일한 키를 통해 액세스 할 수 있습니다. 예를 들어 $('body').data('myData', { h: "hello", w: "world" })_____________________________________________________________________________________________ 이면 다음과 같이 JSON 객체를 얻을 수 있습니다.$('body').data().myData
jave.web

단순화하기 위해 할 수 있습니다 '<div data-dataObj=\''+ JSON.stringify(dataObj) +'\'></div>'. 는 것으로 같은 것, 그래서 사람들은 시작과 끝은 바로 탈출 모든 작은 따옴표입니다'{"some":"thing"}'
IamFace

1
@IamFace- replace()json 데이터에 작은 따옴표가 나타날 가능성을 해결합니다.
billynoah

3

나를위한 비결은 키와 값 주위에 큰 따옴표추가 하는 것이 었습니다 . PHP 함수를 사용하면 json_encodeJSON 인코딩 문자열과 올바르게 인코딩하는 방법을 알 수 있습니다.

jQuery('#elm-id').data('datakey') 문자열이 json으로 올바르게 인코딩 된 경우 문자열의 객체를 반환합니다.

jQuery 설명서에 따라 : ( http://api.jquery.com/jquery.parsejson/ )

잘못된 JSON 문자열을 전달하면 JavaScript 예외가 발생합니다. 예를 들어, 다음은 모두 유효하지 않은 JSON 문자열입니다.

  1. "{test: 1}"( test주위에 큰 따옴표가 없습니다).
  2. "{'test': 1}"( 'test'큰 따옴표 대신 작은 따옴표를 사용하고 있습니다).
  3. "'test'"( 'test'큰 따옴표 대신 작은 따옴표를 사용하고 있습니다).
  4. ".1"숫자는 숫자로 시작해야 "0.1"하며 유효합니다.
  5. "undefined"( undefinedJSON 문자열로 표현할 수는 없지만 null가능).
  6. "NaN"( NaNJSON 문자열로 표현할 수 없으며 Infinity의 직접 표현도 n입니다.

2

의 사용 결합 window.btoawindow.atob함께을 JSON.stringify하고 JSON.parse.

-작은 따옴표를 포함하는 문자열에서 작동합니다.

데이터 인코딩 :

var encodedObject = window.btoa(JSON.stringify(dataObject));

데이터 디코딩

var dataObject = JSON.parse(window.atob(encodedObject));

다음은 click 이벤트로 나중에 데이터를 구성하고 디코딩하는 방법의 예입니다.

html을 구성하고 데이터를 인코딩하십시오.

var encodedObject = window.btoa(JSON.stringify(dataObject));

"<td>" + "<a class='eventClass' href='#' data-topic='" + encodedObject + "'>" 
+ "Edit</a></td>"

click 이벤트 핸들러에서 데이터를 디코딩하십시오.

$("#someElementID").on('click', 'eventClass', function(e) {
            event.preventDefault();
            var encodedObject = e.target.attributes["data-topic"].value;
            var dataObject = JSON.parse(window.atob(encodedObject));

            // use the dataObject["keyName"] 
}

0

은 Using 문서화 JQuery와 .DATA (OBJ) 구문은 당신이 DOM 요소에 객체를 저장할 수 있습니다. data-객체 값에 지정된 키가 없으므로 요소를 검사하면 속성이 표시되지 않습니다 . 그러나 객체 내의 데이터는 키로 참조 .data("foo")하거나 전체 객체를로 반환 할 수 있습니다 .data().

루프를 설정했다고 가정하면 result[i] = { name: "image_name" }:

$('.delete')[i].data(results[i]); // => <button class="delete">Delete</delete>
$('.delete')[i].data('name'); // => "image_name"
$('.delete')[i].data(); // => { name: "image_name" }

0

어떤 이유로 든 수락 된 대답은 페이지에서 한 번만 사용되는 경우에만 효과가 있었지만 제 경우에는 페이지의 많은 요소에 데이터를 저장하려고 시도했지만 첫 번째 요소를 제외한 모든 요소에서 데이터가 손실되었습니다.

대안으로, 데이터를 DOM에 작성하고 필요할 때 다시 구문 분석했습니다. 아마도 비효율적이지만 데이터를 실제로 프로토 타이핑하고 프로덕션 용으로 작성하지 않기 때문에 제 목적으로는 잘 작동했습니다.

내가 사용한 데이터를 저장하려면 :

$('#myElement').attr('data-key', JSON.stringify(jsonObject));

그런 다음 데이터를 다시 읽는 것은 허용되는 답변과 동일합니다.

var getBackMyJSON = $('#myElement').data('key');

이렇게하면 Chrome 디버거로 요소를 검사 해야하는 경우 데이터가 DOM에 표시됩니다.


0

.data()대부분의 경우 완벽하게 작동합니다. 내가 문제가 된 유일한 시간은 JSON 문자열 자체에 작은 따옴표가있을 때였습니다. 나는이 접근법을 사용하여 이것을 극복하는 쉬운 방법을 찾지 못했습니다 (Coldfusion을 서버 언어로 사용하고 있습니다)

    <!DOCTYPE html>
        <html>
            <head>
                <title>
                    Special Chars in Data Attribute
                </title>
                <meta http-equiv="X-UA-Compatible" content="IE=edge">
                <script src="https://code.jquery.com/jquery-1.12.2.min.js"></script>
                <script>
                    $(function(){
                        var o = $("##xxx");
                        /**
                            1. get the data attribute as a string using attr()
                            2. unescape
                            3. convert unescaped string back to object
                            4. set the original data attribute to future calls get it as JSON.
                        */
                        o.data("xxx",jQuery.parseJSON(unescape(o.attr("data-xxx"))));
                        console.log(o.data("xxx")); // this is JSON object.
                    });
                </script>
                <title>
                    Title of the document
                </title>
            </head>
            <body>
                <cfset str = {name:"o'reilly's stuff",code:1}>
<!-- urlencode is a CF function to UTF8 the string, serializeJSON converts object to strin -->
                <div id="xxx" data-xxx='#urlencodedformat(serializejson(str))#'>
                </div>
            </body>
        </html>

0

기록을 위해 다음 코드가 작동한다는 것을 알았습니다. 데이터 태그에서 배열을 검색하고 새 요소를 푸시 한 후 올바른 JSON 형식으로 데이터 태그에 다시 저장할 수 있습니다. 따라서 동일한 코드를 다시 사용하여 원하는 경우 배열에 다른 요소를 추가 할 수 있습니다. $('#my-data-div').attr('data-namesarray', names_string);배열 을 올바르게 저장했지만 $('#my-data-div').data('namesarray', names_string);작동하지 않습니다.

<div id="my-data-div" data-namesarray='[]'></div>

var names_array = $('#my-data-div').data('namesarray');
names_array.push("Baz Smith");
var names_string = JSON.stringify(names_array);
$('#my-data-div').attr('data-namesarray', names_string);

0
!DOCTYPE html>

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
$("#btn1").click(function()
{
person = new Object();
person.name = "vishal";
person.age =20;
    $("div").data(person);
});
  $("#btn2").click(function()
{
    alert($("div").data("name"));
});

});

</script>
<body>
<button id="btn1">Attach data to div element</button><br>
<button id="btn2">Get data attached to div element</button>
<div></div>
</body>


</html>

Anser:-Attach data to selected elements using an object with name/value pairs.
GET value using object propetis like name,age etc...

0

이 코드는 나를 위해 잘 작동합니다.

btoa로 데이터 인코딩

let data_str = btoa(JSON.stringify(jsonData));
$("#target_id").attr('data-json', data_str);

그런 다음 atob으로 디코딩하십시오.

let tourData = $(this).data("json");
tourData = atob(tourData);

불행히도, 부팅에는 유니 코드 문제가 있으며 모든 언어에 적합하지 않습니다.
AhmadJavadiNejad
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.