为什么在注释中添加</ script>会破坏parsing器?

为什么在注释中添加</script>破坏parsing器? 这是一个错误还是在我忽略的文件中有东西?

我已经在Chrome,Firefox,Opera,Internet Explorer中testing过了,它们都产生了相同的结果。

单行评论:

 function Foo(){ // </script> alert("bar"); }; Foo(); 

多行评论:

 function Foo(){ /* </script> */ alert("bar"); }; Foo(); 

发生这种情况是因为W3C定义的HTMLparsing器完全与JavaScriptparsing器分离。 在<script>标签之后,它会查找结束的</script> ,而不pipe它在注释或string中,因为它将JS代码视为普通文本。

HTMLparsing器不parsingJavaScript。 它只parsingHTML元素,由<tag></tag>标签</tag> 。 它不知道有什么是JavaScript评论。 当它看到</script>结束标记时,它假定脚本元素正在closures。 在string</script>出现的任何上下文中都会发生同样的情况。 例如, console.log("</script>")会产生相同的行为。

这不是在HTML中embedded脚本的一个很好的理由,而是在外部包含它们。

您可以使用HTML转义embedded式JavaScript代码

 <script type="text/javascript"> <!-- function Foo(){ // </script> alert("bar"); }; Foo(); //--> </script> 

因此,整个JavaScript代码被HTMLparsing器视为HTML注释,HTML解释器忽略HTML注释行。

一个更简单的解决方法是embedded评论:

 function Foo(){ //<!-- </script> --> alert("bar"); }; Foo(); 

它将评论线的JavaScript和HTML。