将对象绑定到元素的适当位置
Proper Place to Bind Object to Element
Data Attributes 是将字符串存储到 DOM 元素的安全位置,因为可以保证您的 属性 命名永远不会与未来的 [=30= 冲突] 添加到 DOM 规范中。
但是,如果您想将非 JSON javascript 对象作为 属性 绑定到 DOM 元素怎么办?
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Bind Custom Object to DOM Element</title>
<style>
div{ border: solid #333333 1vmin; padding:1vmin;
display:inline-block; font-size:4vmin}
</style>
<script type="text/javascript">
function main()
{
let obj = {}
obj.name = "Lonnie";
let div = document.createElement("div");
div.textContent = "Click Me";
div.myCustomObject = obj;
div.addEventListener('click',function()
{
alert(this.myCustomObject.name);
});
document.body.appendChild(div);
}
window.addEventListener('load', main);
</script>
</head>
<body>
</body>
</html>
数据属性旨在保存字符串,而不是对象。可以将它们用于非 JSON 对象属性,还是规范建议将对象属性添加到 DOM 节点的不同位置?
我会使用 ES6 的 WeakMap 解决方案:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Bind Custom Object to DOM Element</title>
<style>
div{ border: solid #333333 1vmin; padding:1vmin;
display:inline-block; font-size:4vmin}
</style>
<script type="text/javascript">
async function main()
{
let obj = {}
obj.name = "Lonnie";
let obj2 = {}
obj2.name = "Mark"
let div = document.createElement("div");
div.textContent = "Click Me";
div.myCustomObject = obj;
const wm = new WeakMap();
wm.set(div, obj);
wm.set(div, obj2);
console.log(wm.get(div)); // "my value"
div.addEventListener('click',function()
{
alert(wm.get(div).name);
});
document.body.appendChild(div);
}
window.addEventListener('load', main);
</script>
</head>
<body>
</body>
</html>
此方法确保 属性 名称之间没有冲突。
我个人认为将其绑定到属性没有任何问题,而且似乎也没有任何反对这样做的建议,数据属性应该包含字符串
Data attributes are designed to hold strings, not objects.
但是你没有使用属性。因此,您可以在常规 属性.
下存储您想要的所有内容
Is it ok to use them for nonJSON object-properties,
当然可以。
or does the specification recommend a different location for adding object-properties to DOM nodes?
不,不是。 DOM 规范是语言中立的,因此它并没有真正描述 JS 中的对象如何实现该规范的行为。
Data Attributes 是将字符串存储到 DOM 元素的安全位置,因为可以保证您的 属性 命名永远不会与未来的 [=30= 冲突] 添加到 DOM 规范中。
但是,如果您想将非 JSON javascript 对象作为 属性 绑定到 DOM 元素怎么办?
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Bind Custom Object to DOM Element</title>
<style>
div{ border: solid #333333 1vmin; padding:1vmin;
display:inline-block; font-size:4vmin}
</style>
<script type="text/javascript">
function main()
{
let obj = {}
obj.name = "Lonnie";
let div = document.createElement("div");
div.textContent = "Click Me";
div.myCustomObject = obj;
div.addEventListener('click',function()
{
alert(this.myCustomObject.name);
});
document.body.appendChild(div);
}
window.addEventListener('load', main);
</script>
</head>
<body>
</body>
</html>
数据属性旨在保存字符串,而不是对象。可以将它们用于非 JSON 对象属性,还是规范建议将对象属性添加到 DOM 节点的不同位置?
我会使用 ES6 的 WeakMap 解决方案:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Bind Custom Object to DOM Element</title>
<style>
div{ border: solid #333333 1vmin; padding:1vmin;
display:inline-block; font-size:4vmin}
</style>
<script type="text/javascript">
async function main()
{
let obj = {}
obj.name = "Lonnie";
let obj2 = {}
obj2.name = "Mark"
let div = document.createElement("div");
div.textContent = "Click Me";
div.myCustomObject = obj;
const wm = new WeakMap();
wm.set(div, obj);
wm.set(div, obj2);
console.log(wm.get(div)); // "my value"
div.addEventListener('click',function()
{
alert(wm.get(div).name);
});
document.body.appendChild(div);
}
window.addEventListener('load', main);
</script>
</head>
<body>
</body>
</html>
此方法确保 属性 名称之间没有冲突。
我个人认为将其绑定到属性没有任何问题,而且似乎也没有任何反对这样做的建议,数据属性应该包含字符串
Data attributes are designed to hold strings, not objects.
但是你没有使用属性。因此,您可以在常规 属性.
下存储您想要的所有内容Is it ok to use them for nonJSON object-properties,
当然可以。
or does the specification recommend a different location for adding object-properties to DOM nodes?
不,不是。 DOM 规范是语言中立的,因此它并没有真正描述 JS 中的对象如何实现该规范的行为。