JavaScript中HTML实体长度的差异
为什么实体JavaScript中HTML实体长度的差异,html,unicode,innerhtml,html-entities,string-length,Html,Unicode,Innerhtml,Html Entities,String Length,为什么实体的长度为6,而实体&darr长度为1?这在规范中的某个地方吗?(在Firefox、Chrome和Safari中测试。) 我同意这是一种非常奇怪的行为,但至少它是特定的 HTML声明: 转义字符串(出于上述算法的目的)包括用字符串“&”替换任何出现的“&”字符,用字符串“替换任何出现的“替换任何出现的U+00A0不间断空格字符,如果在属性模式下调用算法,则替换任何出现的”字符串“”中的“字符” 我强调了这一点。如果我不得不猜测这是为了支持旧浏览器中的向后兼容性,并且在反序列化和序列化字符
的长度为6,而实体&darr代码>长度为1?这在规范中的某个地方吗?(在Firefox、Chrome和Safari中测试。)
我同意这是一种非常奇怪的行为,但至少它是特定的
HTML声明:
转义字符串(出于上述算法的目的)包括用字符串“&”替换任何出现的“&”字符,用字符串“替换任何出现的“替换任何出现的U+00A0不间断空格字符,如果在属性模式下调用算法,则替换任何出现的”字符串“”中的“字符”
我强调了这一点。如果我不得不猜测这是为了支持旧浏览器中的向后兼容性,并且在反序列化和序列化字符串时获得一致的行为。如果浏览器将
的DOM树结果序列化为
,则再次将其反序列化到DOM树将导致一个空格*这几乎是浏览器实现一致行为的唯一方法
另一方面,对↓
的替换是完全安全和合理的
如果您真的对使用.textContent
存储在文本中的字符串的长度感兴趣,您就会得到您感兴趣的结果
*嗯,不是真的,因为它仍然是
U+00A0
——但我可以理解为什么人们认为在早期的DOM时代它可能会令人困惑
<div>
<p>foo & bar 𝌆 baz</p>
</div>
富乐酒吧
让我们看看在上面的HTML文档的上下文中运行div.innerHTML
时会发生什么。啊,它遵从于,它说:
获取时,如果上下文对象的节点文档是HTML文档,则该属性必须返回在上下文对象上运行HTML片段序列化算法的结果;[…]
HTML片段序列化算法是。在记住div.innerHTML
示例的算法之后,很明显第一次它将下降到步骤3.2下的“if current node is aElement
”分支。这将
添加到输出中
然后,它在内的文本节点上再次调用该算法。这一次,我们将进入“if current node is atext
node”分支。它说:
[…]否则,追加当前节点的data
IDL属性的值,如下所述进行转义
data
IDL属性包含元素的文本内容。转义说明如下:
转义字符串(出于上述算法的目的)包括运行以下步骤:
将出现的&
字符替换为字符串&
用字符串
替换出现的任何U+00A0不间断空格字符
如果在属性模式下调用了算法,请将出现的“
字符替换为字符串”
如果未在属性模式下调用该算法,则将出现的
字符替换为字符串
在.innerHTML
的结果中,只有上述符号作为HTML实体转义–其他Unicode符号仅以其原始形式显示,而不管它们在HTML源代码中如何表示
因此,”&darr;“
中的HTML源代码转换为”↓“
通过innerHTML
读取时。但例如”&;“
或”&;“
变成”&;“
和”
或 ;
变成”
这可能是在SGML中指定的,让我看看如果我不得不猜测这是为了保持向后兼容性而故意犯的错误,嗯-请注意,.textContent
在这两种情况下都返回1。有趣的是的,对于textContent()感谢您查找此内容。但是我不明白您粗体显示的部分是如何解释此行为的。我还应该补充一点,
的行为方式与
@AmadeusDrZaius的行为方式相同。DOM规范中对它有明确的处理—它,以及&
,
,”
和<
是DOM规范中明确的特例。在我看来,至少对
而言,这是为了不让人们混淆与普通空格(U+0020)的区别,但这确实是一个奇怪的情况。对不起,我一开始误读了引用的部分。你的意思是浏览器首先转换所有的实体。。。然后将这些特殊字符转换回它们的实体形式?那么,我唯一的问题是为什么浏览器不按字面意思显示
?我想我需要看到内部表示才能让这一切有意义。是的,不间断的空格仍然是空格-“”