![](/img/trans.png)
[英]JavaScript Appending Rather Than Overwriting Using InnerHTML Property
[英]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
同样,我观察到body
和head
属性属于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 规范中, body
和head
也被定义为对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.