为什么在评论中添加</script>
会破坏解析器?这是一个错误还是我忽略的文档中有什么东西?
我在Chrome,Firefox,Opera,Internet Explorer中测试了它们,它们都产生了相同的结果。
单行注释:
function Foo(){
// </script>
alert("bar");
};
Foo();
多行评论
function Foo(){
/*
</script>
*/
alert("bar");
};
Foo();
答案 0 :(得分:101)
这是因为W3C定义的HTML解析器与JavaScript解析器完全分离。在<script>
标记之后,它会查找结束</script>
,无论它是在注释或字符串中,因为它将JS代码视为普通文本。
答案 1 :(得分:33)
HTML解析器不解析JavaScript。它仅解析由<tag>
和</tag>
标记表示的HTML元素。它不知道某些东西是JavaScript评论。当它看到</script>
结束标记时,它假定脚本元素正在关闭。在字符串</script>
出现的任何上下文中都会出现同样的情况;例如,console.log("</script>")
会产生相同的行为。
这是一个很好的理由,不在HTML中嵌入脚本,而是将它们包含在外部。
答案 2 :(得分:9)
您可以HTML转义嵌入式JavaScript代码
<script type="text/javascript">
<!--
function Foo(){
// </script>
alert("bar");
};
Foo();
//-->
</script>
因此,整个JavaScript代码被HTML解析器视为HTML注释,JavaScript解释器会忽略HTML注释行。
答案 3 :(得分:0)
更简单的解决方法是嵌入注释:
function Foo(){
//<!-- </script> -->
alert("bar");
};
Foo();
它将评论javascript和html的行。