通过JavaScript扩展DOM元素仍然是个坏主意吗?

通过JavaScript扩展DOM元素仍然是个坏主意吗?,javascript,html,Javascript,Html,很明显,以前有人问过这个问题,但我需要一些关于这个话题的新信息。我发现了一些关于DOM元素扩展的文章和博客文章,最突出的论点是浏览器不兼容。IE11的表现出人意料地好。。这仍然是一个问题吗?有没有其他重大问题阻止我直接扩展DOM元素,而不是通过包装器 编辑:为了澄清,我说的是通过现有的JavaScript原型(最有可能是元素)向DOM元素添加方法。是和否 有了新的data-属性,现在有了一种相当标准化的方法来扩展DOM元素,这种方法既没有冲突,也不会造成内存泄漏 var el = documen

很明显,以前有人问过这个问题,但我需要一些关于这个话题的新信息。我发现了一些关于DOM元素扩展的文章和博客文章,最突出的论点是浏览器不兼容。IE11的表现出人意料地好。。这仍然是一个问题吗?有没有其他重大问题阻止我直接扩展DOM元素,而不是通过包装器

编辑:为了澄清,我说的是通过现有的JavaScript原型(最有可能是元素)向DOM元素添加方法。

是和否

有了新的
data-
属性,现在有了一种相当标准化的方法来扩展DOM元素,这种方法既没有冲突,也不会造成内存泄漏

var el = document.getElementById("my-gizmo");
el.setAttribute("data-notes", "Extra notes.");
var attr = el.getAttribute("data-notes");
el.removeAttribute("data-notes");
HTML5提供了一种新的
dataset
方法来访问这些属性,但它的实现有限,还没有准备好在黄金时段使用

应该注意的是,对于jQuery用户来说,第一次访问jQuery对象的
数据
方法时,它将读取
数据-*
属性,但不会拾取任何未来的更改

综上所述,通过expando属性访问Elemenet,例如

el.extraProperty = "Blazzah!"; 
仍然存在与之相关的问题

参考资料:

最突出的论点是浏览器不兼容

这可能是一个论点,但不是最有说服力的,见。总结(大致按重要性顺序):

  • 缺乏规范
  • 宿主对象没有规则
  • 碰撞机会
  • 性能开销
  • 多姆真是一团糟
  • 浏览器错误

  • 这篇文章已经有4年多的历史了(2010年4月),但变化不大。请注意,HTML5正在以稳定的速度向DOM对象添加属性和方法,因此它是一个移动的目标。与其自己动手,不如一起努力改进规范。

    从功能上讲,这并没有问题,因为HTML5预计会增长。今天不存在的元素可能存在于HTML6中。问题是对一个人有意义的元素对另一个人没有意义,对搜索引擎也没有意义,等等

    不鼓励创建自己的,因为这是对标准的“故意违反”。或者换言之,这是个坏主意,除非你有一个真正好的主意和这样做的理由

    1.5.2与其他规范的符合性

    本节是非规范性的

    本规范与各种各样的规范相互作用并依赖于这些规范 其他规格。不幸的是,在某些情况下, 相互冲突的需求导致本规范违反了 这些其他规范的要求。无论什么时候 一旦发生,违法行为都被称为“故意的” 违规”,并已注明违规原因


    让我为盲人添加一些支持,这取决于软件对元素的语义理解。

    我认为OP指的是
    Node.remove()
    或元素原型上的其他自定义实现。但就我所读到的,你的解释可能是正确的。啊,很好的捕获@SmokeyHP。是的,它的书写方式可以是任何一种。我看到了你要求澄清的请求,所以我们来看看是怎么回事。你指的是通过对象原型扩展属性或方法吗?如果以前有人问过这个问题,那么应该改进或添加现有问题的答案,而不是故意产生重复项。此外,这似乎主要是基于观点和/或太过宽泛,不适合SO格式。我认为缺乏规范没有确切的问题,因为所有主要浏览器都实现全局节点、元素等对象。“没有规则”的事情和由此产生的奇怪行为可能是一件事,但可能是可以避免的。碰撞也是如此。那篇文章中的性能开销是关于手动元素扩展的性能开销。据我所知,IE DOM一团糟不应该再应用于最新版本。文章中描述的浏览器错误也涉及旧浏览器。如果你要忽略IE10及更低版本,那么你只会损失大约35%的桌面浏览器和一些未知百分比的移动浏览器(请参阅)。缺乏规范意味着您实现的任何功能都可能与标准中出现的类似功能表现不同。我很想向节点添加迭代器,但它在足够多的浏览器中无法工作,希望它能由浏览器实现。