问题描述
是否可以通过向DOM元素添加新属性来扩展DOM元素来扩展普通的JavaScript对象? 例如,我们是否可以添加按钮或输入的新属性,例如表示用户最后一次单击该按钮的值?
1楼
Daniel Earwicker
2
2010-07-02 06:07:40
是。 有时您会发现它描述为错误的形式。 明显的缺点是,在更高版本的Web标准中,DOM元素可能添加了新属性,这将与您的自定义属性发生冲突,因此,如果您确实使用此技术,请选择一个不太可能发生冲突的名称,例如合并您的公司名称。
另一个潜在的问题是某些浏览器中的DOM对象未正确收集。 相反,它们被引用计数。 这意味着,如果通过自定义属性创建循环引用系统,则可能导致内存泄漏。
例如,这可能会导致内存泄漏,因为DOM和javascript对象之间存在循环引用:
var myJsObj = {};
var myDomElt = document.getElementById('myId');
myJsObj.domElt = myDomElt;
myDomElt.jsObj = myJsObj;
但是,添加仅包含原始值的属性是安全的:
myDomElt.fullTitle = "My DOM Element";
尽管警告DOM标准可能会更改仍然很重要;
如果HTML7在DOM元素上定义了fullTitle属性怎么办?
您的网站将具有不可预测的行为。
一种替代方法是使用的 :
$(myDomElt).data('fullTitle', 'My Dom Element');
var retrieved = $(myDomElt).data('fullTitle');
2楼
Tim Down
1
已采纳
2010-07-02 08:16:15
有可能,但不是一个好主意 。 Daniel Earwicker的答案提到了一个坏主意的一些原因。 我将添加这些:
- DOM节点是宿主对象,宿主对象可以完成自己喜欢的事情。 具体来说,ECMAScript规范中没有要求主机对象允许这种扩展,因此浏览器没有义务允许这种扩展。 特别是,新的浏览器可能选择不这样做,并且依赖它的现有代码将中断。
-
并非现有浏览器中的所有主机对象都允许。
例如,IE中的文本节点和所有ActiveX对象(例如,较旧的IE中的
XMLHttpRequest和用于解析XML的XMLDOM对象)都没有,并且故障行为从引发错误到静默故障都有所不同。 -
在IE中,可以使用行
document.expando = false;来关闭整个文档(包括文档中的所有节点)的添加属性的功能document.expando = false;。 因此,如果页面中的任何代码包含此行,则所有依赖向DOM节点添加属性的代码都将失败。