繁体   English   中英

为什么 `innerHTML` 属性属于 JavaScript `Element` class 而不是 `HTMLElement`?

[英]Why is the `innerHTML` property owned by the JavaScript `Element` class rather than `HTMLElement`?

我正在研究在 JavaScript 中实现的文档 object model,我理解(根据 MDN) Element类/原型用于表示任意文档的元素,例如 HTML、XML,甚至 88251448642 文档相反, HTMLElement子类旨在表示具体 HTML 文档的元素。 然而,这似乎并没有完全被两个阶级之间的实际财产所有权所证实。

特别是,为什么属性innerHTML似乎特定于 HTML 文档,由Element原型拥有?

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 草案中的注释,或有关相关 DOM 问题的评论。)
但是为 MathML 甚至 SVG 元素保留它仍然有意义,因此他们保留了供应商设计的它。


对于 Document 案例......那是一个更大的混乱。
似乎自 DOM 1 以来, body属性不在Document上,而仅在HTMLDocument上,而head根本不存在。
在 DOM 3 中, HTMLDocument接口不再是 DOM 规范的一部分,并且仍然不在DOM LS中。 它现在由 HTML 指定,但这只是Document接口的别名。
HTML 规范中, bodyhead也被定义为对Document接口的扩展。

这是在尝试将所有[XXX]Document接口合并到Document之后,而有些人决定永远不这样做,有些人则撤消……好吧,正如我所说的那样,这是一团糟。 我想最新的讨论在这里 对于一些历史,您可以查看这个错误这个错误以及那里链接的所有内容。

事实上,似乎每个现代浏览器现在都确实将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实现的)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM