2015-05-14 67 views
2

在下面的代码片段中,<按照预期在Firefox 37.0.2中呈现,我在许多其他现代浏览器中也看到了相同的效果。这个textarea规范是否有效的HTML5?理想情况下它不应该是&amplt;由转义“<”浏览器如何处理HTML中的“<”?

<html> 
<textarea> 
Hello World < 
</textarea> 
</html> 

怎样的HTML解析器一个标记区分打开和“<”?大多数浏览器都会通过猜测自动处理错误,这是这种情况吗?

我对此感兴趣的原因是因为当我们在Web Apps中使用所见即所得的编辑器时,我们主要是从编辑器源代码保存HTML。当我们为前端进行模板化时,这种行为使得它不是强制HTML后端的东西。它在没有HTML引用的情况下工作,但它可能会导致非期望的效果,如TinyMCE编辑器的3.5.8版本中至少有冻结/无限循环。

+5

这是不正确的HTML,不,因为[验证器](http://validator.w3.org/#validate_by_input)会告诉你。至于浏览器如何处理它,这很容易通过尝试找出 - 这不会是一个规则。你的具体情况是什么,你为什么问这个? –

+0

我做过了,它在Firefox 37.0.2中的工作如上所述。但它有效吗?我问的原因是我们遇到了TinyMCE编辑器的问题。事实证明,这可以使开发人员避免使用适当的HTML引用来保存编辑器中保存的内容。 – Nishant

+1

http://validator.w3.org/#validate_by_input –

回答

4

这确实只是猜测。在HTML中使用文字<的正确方法是使用&lt;(并且&gt;用于>)。

也就是说,textarea是有点特定的,因为它永远不能包含任何其他的HTML元素 - 所以解析器可以肯定你的意思是文字<而不是起始标签。当然,它打破了为</textarea> :)

从HTML 4规格:

第5.3.2节:

希望把

作者在文中的 “<” 字应该用 “<” (ASCII十进制60),以避免可能与标签开始混淆(开始标签打开定界符)。同样,作者应该在文本中使用“>”(ASCII十进制62)而不是“>”,以避免旧版用户代理错误地将其视为引用属性值中出现的标签末尾(标记关闭分隔符)时出现问题。

所以它不是必要和HTML 4,但它仍然是很好的做法。当然,XHTML和/或HTML 5可能会更严格一些。在许多事情中,HTML规范实际上是非常不具体的,这对于确保浏览器与(或多或少)微妙的方式是不兼容的有很长的路要走。最好的办法不是依赖HTML 允许的所有内容,而只限于那些非常明确和具体的内容。原因很简单 - 两个浏览器可以100%完全符合HTML规范,并且仍然以完全无用的方式处理相同的HTML。

+0

那是对的,我们不应该依赖HTML允许的东西。但很难在开发人员中实现这一点,他们很乐意通过包括你在内的任何方式使其工作.-) – Nishant

2

在实际代码中很难说没有洞察力,但常见的HTML解析器在遇到开始标签时试图找到结束标签。

所有与元素不相似的字符都会被打印出来,就好像它们已经被转义了一样如果您幸运的话!对于仅允许文本的元素(例如示例中的<textarea>),这当然是正确的。

这是无效的HTML,应该明显地避免。

2

Mozilla的HTML解析器将忽略任何'小于'尖括号,而不是立即由有效的标记类型继承。 任何空格字符(空格,制表符,换行符等)都会使括号“不是标记”。 另外textarea中的任何东西都只能是文本。

1

无论有效性如何,HTML5规范都完全定义了精确的分析规则。

当树构造规则遇到<textarea>标签,该tokeniser被切换到RCDATA state

在该状态下,如果tokeniser遇到它切换到RCDATA less-than sign state

在这种状态下<字符,除非下一个字符是/,它将<简写为<并继续。否则,表示器切换到RCDATA end tag open state

等等,目的是允许解析器检测</textarea>标记,但将其他所有内容作为文本传递。

没有涉及“猜测”,所有现代浏览器,包括自IE10以来的IE遵循这些规则。

相关问题