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

Bjø*_*sjå 72 html javascript

为什么添加</script>注释会破坏解析器?这是一个错误还是我忽略了文档中的某些内容?

我在Chrome,Firefox,Opera,Internet Explorer中测试了它们,它们都产生了相同的结果.

单行评论:

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

Foo();
Run Code Online (Sandbox Code Playgroud)

多行评论:

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

Foo();
Run Code Online (Sandbox Code Playgroud)

mck*_*k89 101

这是因为W3C定义的HTML解析器与JavaScript解析器完全分离.在之后<script>的标签,它看起来的是,关闭</script>,无论它的内部意见或字符串,因为它把JS代码作为普通的文本.

  • 要添加,如果它以任何其他方式工作将是非常糟糕的.不支持JavaScript的浏览器仍然需要能够在不知道语言的解析规则的情况下找到结束`</ script>`.虽然不支持JavaScript的浏览器可能并不常见(尽管它们确实存在,甚至是当前的浏览器),但*any*浏览器中***支持的*any*语言也可以使用相同的参数.如果页面包含一个仅适用于IE的脚本,Firefox是否需要知道VBScript解析规则? (33认同)

小智 33

HTML解析器不解析JavaScript.它只解析由元素<tag></tag>标记表示的HTML元素.它不知道某些东西是JavaScript评论.当它看到</script>结束标记时,它假定脚本元素正在关闭.在字符串</script>出现的任何上下文中都会出现相同的情况 例如,console.log("</script>")会产生相同的行为.

这是一个非常好的理由不嵌入脚本的HTML里面,而是他们在外部包括.

  • 请注意,如果您确实想在JavaScript代码中记录字符串文字`</ script>`,则可以编写`console.log("<\/script>")`. (2认同)

Sha*_*s M 9

您可以HTML转义嵌入式JavaScript代码

<script type="text/javascript">
<!--

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

Foo();

//-->
</script>
Run Code Online (Sandbox Code Playgroud)

因此,HTML解析器将整个JavaScript代码视为HTML注释,JavaScript解释器忽略HTML注释行.

  • 我不同意.在HTML解析器开始将`<script>`标签的内容视为CDATA的等价物之前,这是十年或两年前的良好实践.现在,它只是代码中的额外垃圾.这是唯一必要的情况是当你的脚本包含魔术字符序列`</ script>`,**或**你正在处理XHTML时,在这种情况下你最好将脚本包装在真正的CDATA中. (16认同)
  • 其历史原因实际上是一些早期的浏览器(Mosaic,Netscape 1等)根本不识别`<script>`标签,并且解析规则是忽略无法识别的标签并将其内容呈现为如果标签不在那里.您需要SGML注释以防止在没有的文本呈现中,但这是一个JavaScript语法错误,因此SGML必须编写为JavaScript注释.自1997年大约发布Lynx 2.7以来,它实际上并没有必要(Lynx是当时盲人选择的文本模式浏览器). (2认同)