gpt4 book ai didi

javascript - 使用 Javascript 解析的 HTML5 嵌套数据-* 属性不返回嵌套对象

转载 作者:行者123 更新时间:2023-11-30 16:08:50 24 4
gpt4 key购买 nike

我陷入了 html5 数据属性的概念。该属性允许像这样嵌套:

<div data-user--name="John" data-user--surname="Doe"></div>

我以前见过插件(比如 select2 ),其中一些插件使用以下类似的语法来进行 AJAX 调用:

<div data-ajax--url="my/url" data-ajax--method="POST">

此代码在后台转换为 javascript 中的数据集,并返回如下内容:

data = { 
ajax: {
url: "my/url",
method: "POST"
}
}

但在实践中,vanilla javascript 的 dataset 和 jQuery data() 方法返回不同的对象内容。

Javascript

var el = document.getElementsByTagName("div")[0];
el.innerHTML = "<pre>"+JSON.stringify(el.dataset)+"</pre>";
<div data-ajax--url="my/url" data-ajax--method="POST"></div>

jQuery 1.x

$('div').html("<pre>"+JSON.stringify($('div').data())+"</pre>");
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<div data-ajax--url="my/url" data-ajax--method="POST"></div>

jQuery 2.x

$('div').html("<pre>"+JSON.stringify($('div').data())+"</pre>");
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div data-ajax--url="my/url" data-ajax--method="POST"></div>


错误的代码似乎是 jQuery 1.x 版本,因为在 2.x 版本中,jQuery 返回的结果与 vanilla Javascript 相同。我发现了一个相关的错误,因此得到确认:https://github.com/select2/select2/issues/2969

但是我找不到用嵌套的 html 语法构造嵌套的 javascript 对象的位置,如下例所示:

{ 
ajax: {
url: "my/url"
method: "POST"
}
}

是否有任何 Javascript 方法或 polyfill 可以使此类对象读取 data-* HTML 属性?是否可以解析数据 javascript 字符串(即 ajax-Method)并返回嵌套对象(ajax.method)?

最佳答案

遇到完全相同的需求,但@artofcode 的回答仅解析了 2 个级别。所以我必须弄清楚如何解析无限数量的级别。这是我的解决方案,没有限制级别,基于原始答案。

function parseNestedDataSet(data_set) {
var keys = Object.keys(data_set);
var data = {};
for (var i = 0; i < keys.length; i++) {
var key = keys[i];
var value = data_set[key];
var splat = key.split('-');

data = parseNestedDataSetKey(splat, value, data);
}

return data;
}

function parseNestedDataSetKey(keys, value, data) {
data = data || {};
var key = keys[0].toLowerCase();

// Not tested, but should convert to camel case
// var key = keys[0].replace(/-([a-z])/g, function (g) {
// return g[1].toUpperCase();
// });

if (!data[key]) {
data[key] = {};
}

if (keys.length > 1) {
keys.splice(0, 1);
data[key] = parseNestedDataSetKey(keys, value, data[key]);
} else {
data[key] = value;
}

return data;
}

没有彻底测试它,但它适用于我的情况,例如:

  • data-buttons--btn1--title;
  • data-buttons--btn1--icon;
  • data-buttons--btn2--title

关于javascript - 使用 Javascript 解析的 HTML5 嵌套数据-* 属性不返回嵌套对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36592578/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com