将JSON对象存储在HTML jQuery的data属性中 htmljqueryjson Store JSON object in data attribute in HTML jQuery 我使用data-方法在HTML标记中存储数据,如下所示: 1<td><"button class='delete' data-imagename='"+results[i].name+"'>Delete"</button></td> 然后,我在这样的回调中检索数据: 1$(this).data('imagename'); 很好 我所坚持的是尝试保存对象,而不仅仅是保存其属性之一。 我试图这样做: 1<td><button class='delete' data-image='"+results[i]+"'>Delete</button></td> 然后,我尝试像这样访问name属性: 12var imageObj = $(this).data('image'); console.log('Image name: '+imageObj.name); 日志告诉我undefined。 所以看来我可以在data-属性中存储简单的字符串,但不能存储JSON对象... 我也尝试过使用这种语法的孩子,但运气不好: 1 关于如何使用data-方法将实际对象存储在HTML标记中的任何想法? 实际上,您的最后一个示例: 1 似乎运行良好(请参阅http://jsfiddle.net/GlauberRocha/Q6kKU/)。 令人高兴的是,data-属性中的字符串会自动转换为JavaScript对象。相反,我认为这种方法没有任何缺点!一个属性足以存储整套数据,可以通过对象属性在JavaScript中使用。 (注意:要为data-attribute属性自动分配为Object类型而不是String类型,您必须小心编写有效的JSON,尤其是将键名括在双引号中)。 相关讨论 如果可以帮助任何人,请访问以下内容:$(div).data(foobar).foo。 api.jquery.com/data @GlauberRocha如果您在data-foobar对象中有两个元素,并且只想删除一个元素,该怎么办? 将标记中的数据作为javascript对象(var foobar = $(div).data(foobar))访问后,就可以使用Delete运算符删除属性:delete foobar.foo(或delete foobar[foo]),或对其进行任何处理。 @GlauberRocha,如果数据包含单引号怎么办?当我echo json_encode($array)来自php时,对我不起作用。因为它将用单引号终止属性值。除了手动从数组中转义单引号之外,还有其他建议吗? @ Log1cツ一个想法:尝试将您的编码为"(双转义的HTML实体),以便其在您的源中呈现为"。但是当您说"手动转义单引号"时,这可能就是您想要避免的事情... @GlauberRocha感谢您的回复。我使用相同的技巧解决了它。我使用了htmlspecialchars()[php.net/manual/en/function.htmlspecialchars.php]。解决了:) 此解决方案更好,因为我可以将数据设置为服务器端循环(如PHP中的llist),然后在页面加载时以jquery点表示法对其进行更改。 @RaviDhoriyaツhtmlspecialchars(json_encode($e))非常完美,稍后在该字段上使用jQuery .data()返回具有所有属性的对象!完全忘记了这一点,给您和尼古拉斯带来了支持。 当对象属性之一是包含单引号的字符串时,使用该方法遇到麻烦。 data属性在遇到的第一个单引号处结束,由于它不是有效的JSON,因此将其解释为字符串。可能可以对字符串进行编码,但是我发现最简单的解决方案是仅使用多个数据属性。 单引号可能会导致问题,对于将来的解决方案,请使用提及的答案base64编码数据... 而不是将其嵌入文本中,只需使用$('#myElement').data('key',jsonObject); 它实际上不会存储在html中,但是如果您使用的是jquery.data,则无论如何都是抽象的。 要获取JSON,请不要解析它,只需调用: 1var getBackMyJSON = $('#myElement').data('key'); 如果获取的是[Object Object]而不是直接JSON,只需通过数据键访问JSON: 1var getBackMyJSON = $('#myElement').data('key').key; 相关讨论 因此,使用data-method方法可以让我存储表格中的每个删除按钮的值(每个按钮获得一个不同的json对象...),方法是像上面显示的那样放入hmtl标签。您的建议是允许我将每个对象与相应的删除按钮相关联吗?我将如何使用$(#myElement)。以同样的方式?抱歉,我对此没有经验。谢谢 因此,我最终为每个html按钮分配了一个索引: Delete button> td>,并将JSON对象数组存储在$ objects中变量。然后,当单击按钮时,我通过执行以下操作来查看按钮索引:var buttonIndex = $(this).data(index);然后从以前这样保存的对象中获取相应的对象:$ objects [buttonIndex]。这可以正常工作,不确定其是否正确。感谢您的反馈意见! 如果该字段包含来自PHP编码的JSON,则您可能只想这样做:htmlspecialchars(json_encode($e))(来自Nicolas答案的想法)。 在第一个示例中,是否需要对jsonObject进行字符串化?编辑:万一它对其他人有帮助,我只是在这里找到了该问题的答案:stackoverflow.com/a/42864472 "You dont need to stringify objects to store them using jQuery.data()" 这就是它为我工作的方式。 宾语 1var my_object ={"Super Hero":["Iron Man","Super Man"]}; 组 使用encodeURIComponent()对字符串化的对象进行编码,并将其设置为属性: 12var data_str = encodeURIComponent(JSON.stringify(my_object)); $("div#mydiv").attr("data-hero",data-str); 得到 要将值作为对象获取,请使用decodeURIComponent()属性值解析解码后的内容: 12var data_str = $("div#mydiv").attr("data-hero"); var my_object = JSON.parse(decodeURIComponent(data_str)); 对我来说,它就像那样工作,因为我需要将其存储在模板中。 12345// Generate HTML var gridHtml = ''; // Later var dataObj = $('div').data('dataObj'); // jQuery automatically unescape it 相关讨论 感谢您的分享。正是我所寻找的...尝试解析接受的答案时,一直得到[Object Object]。 @greaterKing您不会从接受的答案中解析JSON,您只需通过与数据名称相同的密钥来访问它即可,例如$(body).data(myData, { h:"hello", w:"world" }) _____________________________________________________________________________________________您将通过$(body).data().myData获取JSON对象 为了简化,您可以执行。 这些都是单引号,开始和结尾都被转义了,所以和{"some":"thing"}一样。 @IamFace-replace()解决了在json数据中出现单引号的可能性,这是完全可能的。 通过将序列化的字符串转换为base64,可以解决存储序列化数据的许多问题。 base64字符串几乎可以在任何地方接受而不必大惊小怪。 看一眼: btoa() The WindowOrWorkerGlobalScope.btoa() method creates a base-64 encoded ASCII string from a String object in which each character in the string is treated as a byte of binary data. atob() The WindowOrWorkerGlobalScope.atob() function decodes a string of data which has been encoded using base-64 encoding. 根据需要转换。 相关讨论 这对于将复杂的对象传递到属性中非常有效。 不幸的是,启动存在Unicode问题,并不适合所有语言。 对于浏览器,请使用window.btoa 这种方法是非常防弹的IMO。 但是,一旦检索并取消对base64字符串进行编码,就可以序列化JSON。 因此,在将结果用作对象之前,需要使用JSON.parse。 对我来说,技巧是在键和值周围添加双引号。如果您使用类似json_encode的php函数,则会为您提供json编码的字符串以及如何正确编码您的字符串的想法。 如果字符串正确编码为json,则jQuery('#elm-id')。data('datakey')将返回字符串的对象。 根据jQuery文档:(http://api.jquery.com/jquery.parsejson/) 传递格式错误的JSON字符串会引发JavaScript异常。例如,以下都是无效的JSON字符串: " {test:1}"(测试周围没有双引号)。 " {'test':1}"('test'使用单引号而不是双引号)。 "'test'"(" test"使用单引号而不是双引号)。 " .1"(数字必须以数字开头;" 0.1"有效)。 "未定义"(未定义不能用JSON字符串表示;但是可以为null)。 " NaN"(NaN不能用JSON字符串表示; Infinity的直接表示也为n 这段代码对我来说很好用。 使用btoa编码数据 12let data_str = btoa(JSON.stringify(jsonData)); $("#target_id").attr('data-json', data_str); 然后用atob解码 12let tourData = $(this).data("json"); tourData = atob(tourData); 相关讨论 不幸的是,启动存在Unicode问题,并不适合所有语言。 1!DOCTYPE html> 123456789101112<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"> $("#btn1").click(function() { person = new Object(); person.name ="vishal"; person.age =20; $("div").data(person); }); $("#btn2").click(function() { alert($("div").data("name")); }); }); 1234567891011<body> <button id="btn1">Attach data to div element</button> <button id="btn2">Get data attached to div element</button> </body> </html> Anser:-Attach data to selected elements using an object with name/value pairs. GET value using object propetis like name,age etc... 作为记录,我发现以下代码有效。它使您能够从数据标签中检索数组,将新元素压入,然后以正确的JSON格式将其存储回数据标签中。因此,如果需要,可以再次使用相同的代码将其他元素添加到数组中。我发现$('#my-data-div').attr('data-namesarray', names_string);正确存储了数组,但是$('#my-data-div').data('namesarray', names_string);无法正常工作。 1234var 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); .data()在大多数情况下均可完美运行。我唯一的问题是JSON字符串本身带有单引号。我找不到任何简单的方法来克服这个问题,所以诉诸这种方法(我使用Coldfusion作为服务器语言): 1234567891011121314151617181920212223242526272829303132 <!DOCTYPE html> <html> <head> Special Chars in Data Attribute <meta http-equiv="X-UA-Compatible" content="IE=edge"> <script src="https://code.jquery.com/jquery-1.12.2.min.js"> $(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. }); Title of the document </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 --> </body> </html> 出于某种原因,仅当在页面上使用一次时,可接受的答案才对我有用,但就我而言,我试图将数据保存在页面上的许多元素上,并且除第一个元素之外,所有这些数据都丢失了。 作为替代方案,我最终将数据写出到dom,然后在需要时将其解析回去。也许它的效率较低,但是可以很好地达到我的目的,因为我实际上是在对数据进行原型设计,而不是将其编写用于生产。 保存我使用的数据: 1$('#myElement').attr('data-key', JSON.stringify(jsonObject)); 然后读回数据与接受的答案相同,即: 1var getBackMyJSON = $('#myElement').data('key'); 如果我要使用Chrome的调试器检查元素,以这种方式进行操作也会使数据显示在dom中。 使用记录的jquery .data(obj)语法,可以将对象存储在DOM元素上。检查该元素将不会显示data-属性,因为没有为该对象的值指定键。但是,可以使用.data("foo")通过键引用对象内的数据,也可以使用.data()返回整个对象。 因此,假设您设置了循环和result[i] = { name:"image_name" }: 123$('.delete')[i].data(results[i]); // => <button class="delete">Delete</delete> $('.delete')[i].data('name'); // =>"image_name" $('.delete')[i].data(); // => { name:"image_name" }