遇到 </script> 要小心再小心
在页面中动态地引入外部 JavaScript 文件的方法有很多,其中之一就是使用 document.write 来直接输出。虽然用的人不多,但是偶尔应个急还是可以的。
但是在使用 document.write 输出的 script 块(</script>)时,一定要小心再小心。甚至只要在js里有用到</script>标签就要小心,小心什么?您且往下看:
演示地址1:http://www.xiaoxiaozi.com/code/js/script1.html
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Script 闭合标签</title>
</head>
<body>
<script type="text/javascript">
document.write("<script type=\"text/javascript\">"+"alert('xxx');</script>");
</script>
</body>
</html>
当您这样写代码时,会发生什么事呢?我本意是想执行alert语句,可是事实上呢?这里发生了什么?没错,页面上只有一个 “); 这个这个类似于笑脸的东西,我想大家看着并不开心,因为我们的程序没有达到我们预先的效果!原因何在?
那就是,每当浏览器遇到</script>时,它都假定其中的代码块是完整的(即使它出现在JavaScript字符串中)。
其实不仅是document.write有问题,只要我们直接在 js 中有用到 </script> 标签,哪怕其在字符串中,浏览器也会把之认为其是 script 标签的结束符。请看下面两个例子:
演示地址2:http://www.xiaoxiaozi.com/code/js/script2.php
<head>
<title>script 闭合标签测试2</title>
</head>
<body>
<script type="text/javascript">
<?php
echo "</script>";
echo "alert('xxx');";
?>
</script>
</body>
</html>
演示地址3:http://www.xiaoxiaozi.com/code/js/script3.html
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Script 闭合标签</title>
</head>
<body>
<script type="text/javascript">
alert("</script>");
</script>
</body>
</html>
上面两个示例告诉我们,即使</script>是在字符串中,也同样会被浏览器误会。那么就最后一个例子来说,为何页面会显示”);该内容呢?
原因很简单,浏览器认为该段代码有误,首先,alert漏掉了闭合括号,其次有两个</script>标签。
那么,我们该如何解决这个问题呢?方法有两种:
- 将闭合标签进行转义,采用<\/script>这种写法
- 将闭合标签拆分开,例如写成”</scr”+”ipt>”这种写法
演示地址4:http://www.xiaoxiaozi.com/code/js/script4.html
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Script 闭合标签</title>
</head>
<body>
<script type="text/javascript">
alert("<\/script>");
alert("</scr"+"ipt>");
</script>
</body>
</html>
两种方法都可以解决问题,不管黑猫白猫,解决问题就是好锚。虽然个人比较欣赏第二种方法,呵呵。。
同时,写本文时也证明了这样一个道理,工欲善其事,必先利其器!有一个好的开发工具,往往可以达到事半功倍的效果。例如,Aptana 在我用上面错误写法时的截图如下:
文章作者:simaopig
本文地址:http://www.xiaoxiaozi.com/2010/02/24/1708/
版权所有 © 转载时必须以链接形式注明作者和原始出处!

抢沙发来了:)
学习了。
[回复]
@diyidu
咦?你抢的还真是快。呵呵。。
[回复]