我可以给JavaScript DOM对象添加任意属性吗?例如,<INPUT>
或<SELECT>
元素?如果不能添加属性,那么是否有一种方式可以通过引用属性将我的对象与网页元素关联起来?
我可以给JavaScript DOM对象添加任意属性吗?例如,<INPUT>
或<SELECT>
元素?如果不能添加属性,那么是否有一种方式可以通过引用属性将我的对象与网页元素关联起来?
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>
你可以使用JavaScript通过getAttribute()
访问它:
document.getElementById("myElement").getAttribute("data-myproperty");
setAttribute()
吗? - alex当然,人们已经做了很多年了。不建议这样做,因为它会很混乱,而且您可能会干扰现有的属性。
如果您使用 for..in
循环代码,则可能会导致代码中断,因为您现在将枚举这些新附加的属性。
我建议使用类似于jQuery的 .data
的内容,将元数据附加到对象上。如果您不想使用库,请重新实现 jQuery.data
。
data
是被 jQuery 自身使用的,还是我可以自由地给它分配任何值? - Tony the Pony$.data
是由 jQuery 定义的。您可以像这样使用它 $('#el').data('key', 'value')
。 - meder omuraliev$(element).data('name', value)
,读取值使用 $(element).data('name')
。 - gen_Ericel['data-foo'] = 'value';
。 - meder omuraliev$.data
,在IE中使用getAttribute
和setAttribute
存在错误/不一致性,请在属性前加上data-
前缀。 - meder omuralievfor...in
循环会如何中断? - Hugh GuineysetAttribute
来添加属性。var el = document.getElementById('myelement');
el.setAttribute('custom', 'value');
var el = document.getElementById('myelement');
el.myProperty = 'myValue';
如果有人在2015年想知道,是的,你可以这样做 - 并且 jQuery正在data中采取这种做法。只需要选择符合未来标准的名称,例如供应商前缀或基于时间的随机后缀(jQuery)即可。
如果必须使用,请不要使用标准HTML属性。这里有一个关于使用自定义属性的教程:
http://www.javascriptkit.com/dhtmltutors/customattributes.shtml
虽然是HTML5,但它向后兼容。
dataset
属性在domElements
上设置属性,它可以在HTMLOrForeignElement
上使用(这是几个特性的混合体,常见于HTMLElement
、SVGElement
和MathMLElement
接口)。
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的支持和性能表示担忧,但您可以在这里检查:此处。
[object Object]
。 - Julian Knight
wm
引用?似乎有点限制。 - Julian Knight