2011-01-12 53 views
15

例如对于this.parentNode我想写this.p或代替 document.getElementById('someid')只是写document.g('someid')。当然,这只是简单的例子,我只想知道什么是正确的做法。如何将我自己的方法添加到HTMLElement对象?

(我知道我可以使用jQuery或原型,但我想了解它是如何真正做JS)

+1

upvote试图了解它是如何做到的。你和我一样是个大控制狂吗? – Mansiemans 2011-09-20 13:56:43

回答

25

虽然你可以原型在许多浏览器HTMLElement - 的Internet Explorer(6 ,7,8)是不是其中之一。 AFAIK,IE9支持这一点(尽管我还没有测试过)。

对于做处理它的浏览器,你可以这样做:

HTMLElement.prototype.doHello = function(thing){ 
    alert('Hello World from ' + thing); 
}; 
+3

@闪电雷 - 我表示在答案中...... IE6,7,8绝对不在'支持'表中。 – scunliffe 2014-11-21 12:23:58

+1

是的,但你可以简单地使用`Object`而不是`HTMLElement` – 2014-11-21 13:38:43

2

article from perfectionkills.com可能会给你一些洞察到它是如何做到的,以及为什么你不应该做到这一点。

(顺便说一句,jQuery的不扩展DOM元素他们使用DOM包装代替。)

10

我强烈建议不要试图做到这一点,有几个原因:

  • 浏览器兼容性。虽然可能在多个浏览器中,但在IE < = 8中是不可能的。
  • DOM元素是主机对象。主机对象(即由非本地JavaScript对象的环境提供的对象)没有义务按照与原生JavaScript对象相同的规则进行游戏,除了指定的DOM行为以外,它们基本上可以做他们喜欢的事情。因此,即使某些浏览器提供了HTMLElement原型,并允许您对其进行扩充,但不能保证它能按预期工作。
  • 与您网页中其他代码的兼容性。如果页面中的任何其他代码(例如Prototype)与HTMLElement原型混淆,则可能会导致命名冲突和难以检测到的错误。

相反,我会建议围绕DOM节点创建包装对象,如jQuery,YUI和其他库。

Kangax写了一个good article on this,涵盖所有这些要点和更多。

相关问题