如何将我自己的方法添加到 HTMLElement 对象?

IT技术 javascript methods
2021-01-22 10:15:23

例如,this.parentNode我想只写this.p或而不是 document.getElementById('someid')只写document.g('someid')当然,这些都是简单的例子,我只想知道正确的做法是什么。

(我知道我可以使用 jQuery 或 Prototype,但我想了解它是如何在 JS 中真正完成的)

4个回答

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

对于处理它的浏览器,您可以执行以下操作:

HTMLElement.prototype.doHello = function(thing){
  console.log(this + ' says: ' + thing)
}

document.body.doHello('hello')

@Flash Thunder - 我在答案中表示...... IE6,7,8 绝对不在“支持”表中。
2021-03-22 10:15:23
是的,但您可以简单地使用Object代替HTMLElement
2021-04-04 10:15:23
但是 OP 想要在 HTML 元素本身上绑定方法 - 使用外部对象会破坏这个目的......此时像 jQuery 这样的东西会更好(因为他们已经解决了这个问题以及更多)
2021-04-09 10:15:23
HTMLElement.prototype.…你不能有针对性地与元素thisself(比如当例如String.prototype.…):(
2021-04-12 10:15:23

我强烈建议不要尝试这样做,原因如下:

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

相反,我建议像 jQuery、YUI 和其他库一样围绕 DOM 节点创建包装器对象。

Kangax在这方面写了一篇很好的文章,涵盖了所有这些要点以及更多内容。

@JojOatXGME:是的,在 的特定情况下data(),jQuery 确实在 DOM 元素上存储了“expando”属性(但不是方法)。我怀疑它也可能使用 expandos 来跟踪事件侦听器和其他可能的东西。但是,总体观点是:jQuery 的 API 通过包装器对象而不是通过扩展 DOM 本身来提供扩展的 DOM 功能。它对 DOM 所做的扩展仅在内部使用。
2021-03-23 10:15:23
你确定 jQuery 吗?据我了解,jQuery 在.data()使用时扩展了 DOM 元素和其他元素- github.com/jquery/jquery/blob/master/src/data/Data.js
2021-04-03 10:15:23

总之一句话,不要。最好不要修改您不拥有的对象

对于 尤其如此HTMLElement,您无法在某些浏览器中修改它。

从perfectionkills.com文章可能会给你一些洞察到它是如何做的,为什么你不应该这样做。

(顺便说一下,jQuery 不扩展 DOM 元素。它们使用 DOM 包装器代替。)