首页 > JavaScript > 遇到 </script> 要小心再小心
2010二月24

遇到 </script> 要小心再小心

在页面中动态地引入外部 JavaScript 文件的方法有很多,其中之一就是使用 document.write 来直接输出。虽然用的人不多,但是偶尔应个急还是可以的。

但是在使用 document.write 输出的 script 块(</script>)时,一定要小心再小心。甚至只要在js里有用到</script>标签就要小心,小心什么?您且往下看:

演示地址1:http://www.xiaoxiaozi.com/code/js/script1.html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<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

<html>
    <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

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<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>标签。

那么,我们该如何解决这个问题呢?方法有两种:

  1. 将闭合标签进行转义,采用<\/script>这种写法
  2. 将闭合标签拆分开,例如写成”</scr”+”ipt>”这种写法

演示地址4:http://www.xiaoxiaozi.com/code/js/script4.html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<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 在我用上面错误写法时的截图如下:

Aptana 错误提示(点击看原图)

文章作者:simaopig
本文地址:http://www.xiaoxiaozi.com/2010/02/24/1708/
版权所有 © 转载时必须以链接形式注明作者和原始出处!

2 Responses to “遇到 </script> 要小心再小心”

  1. #1 diyidu 回复 | 引用 Post:2010-02-24 18:31

    抢沙发来了:)
    学习了。

    [回复]

  2. #2 simaopig 回复 | 引用 Post:2010-02-24 18:31

    @diyidu
    咦?你抢的还真是快。呵呵。。

    [回复]

发表评论

:wink: :twisted: :roll: :oops: :mrgreen: :lol: :idea: :evil: :cry: :arrow: :?: :-| :-x :-o :-P :-D :-? :) :( :!: 8-O 8)