微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么JavaScript元素类而不是HTMLElement拥有innerHTML属性?

如何解决为什么JavaScript元素类而不是HTMLElement拥有innerHTML属性?

我正在研究用JavaScript实现的文档对象模型,并且我了解(根据MDN)Element类/原型旨在表示任意文档的元素,例如HTML,XML甚至SVG文档。相反,HTMLElement子类用于表示特定HTML文档的元素。但是,这似乎并不能完全由两个类之间的实际所有权来证明。

尤其是为什么innerHTML原型拥有的属性Element似乎特定于HTML文档?

Object.getownPropertyNames(Element.prototype).includes('innerHTML')
>>> true
Object.getownPropertyNames(HTMLElement.prototype).includes('innerHTML')
>>> false

类似地,我观察到bodyhead属性Document.prototype而不是HTMLDocument.prototype所拥有。这似乎很奇怪,因为我不希望所有类型的文档都具有头部和身体。

这仅仅是JS兼容性/旧奇特吗? (如果是这样,我想知道是否有关于它是如何产生的故事的。)或者我缺少这种财产所有权结构的逻辑?

解决方法

对于innerHTML来说,它并不是在HTML5之前就符合规范的,这是IE发明,后来在规范问世之前,其他供应商就采用了它。
关于重命名甚至将其限制为HTMLElement接口,人们进行了积极的讨论。 (例如,请参见此HTML5 draftthis comment中有关相关DOM问题的注释。)
但是将其保留为MathML甚至SVG元素仍然有意义,因此他们将其保留为供应商设计的水平。


对于Document案例,情况更糟。
似乎从DOM 1开始,body属性不在Document上,而仅在HTMLDocument上,而head根本不存在。
在DOM 3中,HTMLDocument接口不再是DOM规范的一部分,并且仍然不在DOM LS中。现在它是specced by HTML,但仅是Document接口的别名。
HTML specs中,bodyhead被定义为Document接口的扩展。

这是在尝试将所有[XXX]Document接口合并到Document中之后,有的人决定从不这样做,有的则撤消并...好吧,正如我所说的那样,情况一团糟。我想最新的讨论是here。对于某些历史记录,您可以查看this bugthis one以及链接的所有内容。

事实上,现在似乎每个现代浏览器的确将HTMLDocument保留为Document的别名,没有添加任何属性:

const own_props = Object.getOwnPropertyDescriptors( HTMLDocument.prototype );
console.log( Object.keys( own_props ) ); // [ "constructor" ] => doesn't add anything to Document 

Ps :(请注意,DOM通常 不在JavaScript中实现)。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。