将JSON对象存储在HTML jQuery中的data属性中

zum*_*zum 125 html jquery json

我正在使用data-HTML标记中的方法存储数据,如下所示:

<td><"button class='delete' data-imagename='"+results[i].name+"'>Delete"</button></td>
Run Code Online (Sandbox Code Playgroud)

然后我在回调中检索数据,如下所示:

$(this).data('imagename');
Run Code Online (Sandbox Code Playgroud)

这很好.我坚持的是试图保存对象而不仅仅是其中一个属性.我试着这样做:

<td><button class='delete' data-image='"+results[i]+"'>Delete</button></td>
Run Code Online (Sandbox Code Playgroud)

然后我尝试访问name属性,如下所示:

var imageObj = $(this).data('image');
console.log('Image name: '+imageObj.name);
Run Code Online (Sandbox Code Playgroud)

日志告诉我undefined.所以看起来我可以在data-属性中存储简单的字符串,但我无法存储JSON对象......

我也试过使用这个语法孩子没有运气:

<div data-foobar='{"foo":"bar"}'></div>
Run Code Online (Sandbox Code Playgroud)

有关如何使用该data-方法在HTML标记中存储实际对象的任何想法?

Nic*_*uin 142

实际上,你的最后一个例子:

<div data-foobar='{"foo":"bar"}'></div>
Run Code Online (Sandbox Code Playgroud)

似乎运作良好(见http://jsfiddle.net/GlauberRocha/Q6kKU/).

好处是data-属性中的字符串会自动转换为JavaScript对象.相反,我认为这种方法没有任何缺点!一个属性足以存储整个数据集,可以通过对象属性在JavaScript中使用.

(注意:对于自动赋予Object类型而不是String类型的数据属性,您必须小心编写有效的JSON,特别是将键名括在双引号中).

  • 如果它对任何人有帮助,这里是如何访问上面的:`$('div').data('foobar').foo`.http://api.jquery.com/data/ (20认同)
  • @GlauberRocha,如果数据包含单引号怎么办?当我从php回复json_encode($ array)时,```对我不起作用.因为它将通过单引号终止属性值.除了从数组中手动​​转义单引号外的任何建议. (4认同)
  • @GlauberRocha感谢您的回复.我用同样的技巧解决了它.我使用了htmlspecialchars()[http://php.net/manual/en/function.htmlspecialchars.php].它解决了.:) (2认同)
  • 单引号可能会导致问题,对于面向未来的解决方案,请使用提到的答案中提到的 base64 编码数据... (2认同)

nat*_*lez 128

而不是将其嵌入文本中使用 $('#myElement').data('key',jsonObject);

它实际上不会存储在html中,但是如果你使用的是jquery.data,那么所有这些都是抽象的.

要获取JSON,请不要解析它,只需调用:

var getBackMyJSON = $('#myElement').data('key');
Run Code Online (Sandbox Code Playgroud)

如果您要获取[Object Object]而不是直接JSON,只需通过数据键访问您的JSON:

var getBackMyJSON = $('#myElement').data('key').key;
Run Code Online (Sandbox Code Playgroud)


小智 37

这就是它对我有用的方式.

宾语

var my_object ={"Super Hero":["Iron Man", "Super Man"]};
Run Code Online (Sandbox Code Playgroud)

使用encodeURIComponent()对字符串化对象进行编码并设置为属性:

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

得到

要将值作为对象获取,请使用decodeURIComponent()属性值解析已解码的值:

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

  • 在处理和转义引号方面,这似乎比其他选项更强大 (4认同)

mol*_*oco 13

对我来说,它的工作方式就像那样,因为我需要将它存储在模板中 ......

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

// Later
var dataObj = $('div').data('dataObj'); // jQuery automatically unescape it
Run Code Online (Sandbox Code Playgroud)


Way*_*yne 12

window.btoaandwindow.atobJSON.stringifyand结合使用JSON.parse

- 这适用于包含单引号的字符串

编码数据:

var encodedObject = window.btoa(JSON.stringify(dataObject));
Run Code Online (Sandbox Code Playgroud)

解码数据:

var dataObject = JSON.parse(window.atob(encodedObject));
Run Code Online (Sandbox Code Playgroud)

这是稍后如何使用单击事件构造和解码数据的示例。

构造html并对数据进行编码:

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

"<td>" + "<a class='eventClass' href='#' data-topic='" + encodedObject + "'>" 
+ "Edit</a></td>"
Run Code Online (Sandbox Code Playgroud)

解码单击事件处理程序中的数据:

$("#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"] 
}
Run Code Online (Sandbox Code Playgroud)


小智 11

存储序列化数据的许多问题可以通过将序列化字符串转换为base64来解决.

可以在几乎任何地方接受base64字符串而不用担心.

看一眼:

WindowOrWorkerGlobalScope.btoa()方法从String对象创建base-64编码的ASCII字符串,其中字符串中的每个字符都被视为二进制数据的字节.

WindowOrWorkerGlobalScope.atob()函数解码使用base-64编码编码的数据字符串.

根据需要转换为/从.

  • 在我看来,这种方法非常防弹。但是,一旦检索并取消编码 Base64 字符串,您就已经序列化了 JSON。因此,您需要先使用 JSON.parse,然后才能将结果用作对象。 (2认同)

Art*_*yan 9

有一种在 HTML 中存储 JSON 的更好方法:

HTML

<script id="some-data" type="application/json">{"param_1": "Value 1", "param_2": "Value 2"}</script>
Run Code Online (Sandbox Code Playgroud)

JavaScript

JSON.parse(document.getElementById('some-data').textContent);
Run Code Online (Sandbox Code Playgroud)