【发布时间】:2011-05-14 14:16:24
【问题描述】:
我可以向 JavaScript DOM 对象添加任意属性,例如 <INPUT> 或 <SELECT> 元素吗?或者,如果我不能这样做,有没有办法通过引用属性将我自己的对象与页面元素相关联?
【问题讨论】:
标签: javascript dom
我可以向 JavaScript DOM 对象添加任意属性,例如 <INPUT> 或 <SELECT> 元素吗?或者,如果我不能这样做,有没有办法通过引用属性将我自己的对象与页面元素相关联?
【问题讨论】:
标签: javascript dom
ECMAScript 6 具有 WeakMap,只要该对象存在,您就可以将私有数据与 DOM 元素(或任何其他对象)相关联。
const wm = new WeakMap();
el = document.getElementById("myelement");
wm.set(el, "my value");
console.log(wm.get(el)); // "my value"
与其他答案不同,此方法保证不会与任何属性或数据的名称发生冲突。
【讨论】:
是的,您可以将自己的属性添加到 DOM 对象,但请记住要注意避免命名冲突和循环引用。
document.getElementById("myElement").myProperty = "my value";
HTML5 引入了一种通过标记将数据附加到元素的有效方法 - 使用 data- 属性前缀。您也可以在 HTML 4 文档中毫无问题地使用此方法,但它们不会验证:
<div id="myElement" data-myproperty="my value"></div>
您可以使用 getAttribute() 通过 JavaScript 访问:
document.getElementById("myElement").getAttribute("data-myproperty");
【讨论】:
setAttribute()吗?
当然,人们已经这样做了很久了。不建议这样做,因为它很乱,您可能会弄乱现有属性。
如果您使用for..in 循环代码,您的代码可能会中断,因为您现在将枚举这些新附加的属性。
我建议使用像 jQuery 的 .data 这样的东西,它可以将元数据附加到对象上。如果不想使用库,重新实现jQuery.data
【讨论】:
$.data 由 jQuery 定义。您可以像 $('#el').data('key', 'value') 一样使用它。
$(element).data('name', value),读取是$(element).data('name')。
el['data-foo'] = 'value';
$.data,则IE 中的getAttribute 和setAttribute 存在错误/不一致,请在属性前加上data-
for...in 循环如何仅因拥有额外的属性而中断?
您想为对象添加属性,还是为元素添加属性?
您可以使用setAttribute添加属性
var el = document.getElementById('myelement');
el.setAttribute('custom', 'value');
或者您可以只向 javascript 对象添加属性:
var el = document.getElementById('myelement');
el.myProperty = 'myValue';
【讨论】:
如果有人在 2015 年想知道,是的,你可以 - 并且 jQuery 在 data 中就是这样做的。只需选择面向未来的名称,例如供应商前缀或基于时间的随机后缀 (jQuery)。
【讨论】:
如果必须,不要使用标准的 HTML 属性。下面是使用自定义属性的教程:
http://www.javascriptkit.com/dhtmltutors/customattributes.shtml
它是 HTML5,但它是向后兼容的。
【讨论】:
我正在探索答案,没有人提到在现代 JavaScript 中,我们可以使用 dataset 属性在 domElements 上设置属性,它可以在 HTMLOrForeignElement 上使用 (这是@ 987654326@、SVGElement 和MathMLElement 接口)。
根据MDN
HTMLOrForeignElement 接口上的
dataset属性提供对元素上设置的所有自定义数据属性(data-*)的读/写访问。这种访问在 HTML 和 DOM 中都可用。它是DOMStrings的映射,每个自定义数据属性对应一个条目。
let element = document.getElementById("test");
let footer = document.querySelector("#output");
/* get element values using camelCase names through .dataset */
let sample = element.dataset.sample;
let sampleNumber = element.dataset.sampleNumber;
let dataFromElement = sample + " :: " + sampleNumber;
footer.innerHTML = element.innerHTML + dataFromElement;
<input type="hidden" id="test" data-sample="Sample" data-sample-number=34 />
<div id="output"> </div>
尽管对 Internet Explorer 的支持和性能存在疑虑,但您可以查看here。
【讨论】: