jquery 将JavaScript数组存储到HTML数据属性中以及从HTML数据属性中检索JavaScript数组

rdrgkggo  于 2023-03-17  发布在  jQuery
关注(0)|答案(7)|浏览(546)

如何将JavaScript数组存储在HTML自定义数据属性中?
我尝试了JSON字符串化和转义字符的各种变体。
存储数组并再次检索它的精确方法是什么?
我用[ $("#firstSelectedElement").val(), $("#secondSelectedElement").val() ]构建数组,用$("#storageElement").data('storeit')检索id="storageElement" data-storeIt="stuff"
我似乎永远无法将数据检索为真正的数组,只能检索字符数组。

oymdgrw7

oymdgrw71#

这取决于你在数组中存储的数据类型,如果它只是字符串(看起来是这样),并且你有一个你知道永远不会成为你的数据的一部分的字符(比如下面例子中的逗号),那么我会忘记JSON序列化,而只使用string.split:

<div id="storageElement" data-storeIt="stuff,more stuff"></div>

然后在检索时:

var storedArray = $("#storageElement").data("storeIt").split(",");

它的处理能力比使用JSON要好一些,使用的字符更少,而且比JSON.parse更便宜。
但是,如果必须这样做,JSON实现应该类似于:

<div id="storageElement" data-storeIt='["hello","world"]'></div>

并检索:

var storedArray = JSON.parse($("#storageElement").data("storeIt"));

注意,在这个例子中,我们必须在data-storeIt属性两边使用半引号('),这是因为JSON语法要求我们在数据中的字符串两边使用引号。

u1ehiz5o

u1ehiz5o2#

HTML5 data属性只能存储字符串,所以如果你想存储一个数组,你需要序列化它。JSON可以工作,看起来你走对了路。你只需要在检索序列化数据后使用JSON.parse()

var retrieved_string = $("#storageElement").data('storeit');
var retrieved_array = JSON.parse(retrieved_string);

回顾API文档,jQuery应该尝试自动转换JSON编码的字符串,只要它被正确编码。你能给予一个你正在存储的值的例子吗?
还要注意HTML5 data attribute和jQuery .data()方法是两个不同的东西。它们相互作用,但是jQuery更强大,可以存储任何数据类型。你可以直接使用jQuery存储javascript数组,而不需要序列化它。但是如果你需要在标记中将它作为HTML5 data attribute,那么你只能使用字符串。

tp5buhyn

tp5buhyn3#

需要说明的是,它对编码实体不起作用,但似乎要将其解析为对象,data属性必须是格式良好的JSON对象
所以我可以使用一个对象:

data-myarray="{&quot;key&quot;: &quot;value&quot;}"

或者只用单引号

data-myobject='{"key1": "value1", "key2": value2}'

是时候玩得开心了

zfycwa2u

zfycwa2u4#

您可以将任何对象存储到节点中,如下所示:

$('#storageElement').data('my-array', ['a', 'b', 'c']);

var myArray = $('#storageElement').data('my-array');
p4rjhz4m

p4rjhz4m5#

如果你需要嵌套的数组或者其他的方法来实现它。

$('[data-example]').each(function (i, e) {
    var json = $(e).data('example');
  for(var index in json){
    console.log(json[index]["name"] + "=" + json[index]["value"]);
  }

});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div data-example='[{"name": "A", "value": 1}, {"name": "B", "value": 2}]' />
<div data-example='[{"name": "C", "value": 3}, {"name": "D", "value": 4}]' />

Ulysse BN所建议
或者使用eval(),这是Bonifacius Sarumpaet所指出的危险解决方案,但可以正常工作

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div data-example="[['A', 1], ['B', 2]]" />
<div data-example="[['C', 3], ['D', 4]]" />

<script>
  $('[data-example]').each(function (i, e) {
    var arrayFromText = eval($(e).data('example'));
    console.log(arrayFromText[0][0] + "=" + arrayFromText[0][1]);
    console.log(arrayFromText[1][0] + "=" + arrayFromText[1][1]);
  });
</script>
0g0grzrc

0g0grzrc6#

如果使用PHP,请在PHP中执行以下操作:

$arr_test = ['A','C','E'];
$coded = json_encode($arr_test);
// paste coded in data-atribute
print '<div class="funPlus" data-arr_diensten="'. $coded . '"></div>';

检查时的HTML如下所示:

<div class="funPlus" data-arr_diensten="[&quot;A&quot;,&quot;C&quot;,&quot;E&quot;]"></div>

现在在javascript中检索数组,但是如果它只有一个值,它返回一个字符串,所以你必须测试并修正这个问题,如果它是一个字符串,我们必须去掉多余的引号,$(this)必须指向对象。

var arr_diensten = $(this).data("arr_diensten");
if (typeof arr_diensten == "string") arr_diensten = [arr_diensten.slice(1, -1)];
console.log(arr_diensten);
mhd8tkvw

mhd8tkvw7#

您可以在元素data属性中使用HTML转义字符来获得类似JSON的数组(编码为引号):

<div id="demo" data-stuff='[&#34;some&#34;, &#34;string&#34;, &#34;here&#34;]'></div>

然后在JavaScript中获得它,无需任何额外的魔法:

var ar = $('#demo').data('stuff');

看这个JSFiddle demo
但是,转义不是必需的。您可以改为执行以下操作:

<div id="demo" data-stuff='["some", "string", "here"]'></div>

看这个JSFiddle demo

相关问题