【问题标题】:correct syntax for javascript "src" declarationjavascript“src”声明的正确语法
【发布时间】:2011-10-04 16:51:00
【问题描述】:

试图在我的嵌入式 js 声明中添加一个 math.random() 方法,以防止链接的 javascript 文件被缓存。

问题是我不断收到语法错误。我想我已经接近了,但我的调试工作被证明是徒劳的。代码如下:

<script type="text/javascript">
document.write("<script src='links7.js?'+Math.random()+></script>");
</script>

有什么建议吗?

【问题讨论】:

    标签: javascript


    【解决方案1】:

    问题 #1

    转义/编码

    当 HTML 解析器找到 &lt;script&gt; 时,它将开始解析内容,直到找到存在于以下位置的 &lt;/script&gt;

    document.write("<script src='links7.js?'+Math.random()+></script>
    

    因此,您需要更改源代码,使其不会被解析为脚本元素的结尾:

    document.write("<script src='links7.js?'+Math.random()+></scri" + "pt>");
    

    理想情况下,您应该让 HTML 转义所有内联 JavaScript 代码,这也可以缓解这个问题:

    document.write(&quot;&lt;script src='links7.js?'+Math.random()+&gt;&lt;/script&gt;&quot;);
    

    但老实说,这样做真的很烦人真的很快

    转义内联 JavaScript 中所有字符内容的更好方法是使用 CDATA(字符数据)元素:

    <script type="text/javascript">
      <![CDATA[
      document.write("<script src='links7.js?'+Math.random()+></script>");
      ]]>
    </script>
    

    当然,因为 CDATA 元素在 &lt;script&gt; 元素内,JS 解析器会尝试将其作为代码执行,并且不知道如何处理像 &lt; ! [ CDATA [ 这样的语法,所以绕过这个问题,你需要将CDATA元素包装在JS注释中:

    <script type="text/javascript">
      //<![CDATA[
      -or-
      /* <![CDATA[ */
    
      //]]>
      -or-
      /* ]]> */
    </script>
    

    我推荐第二种形式,使用多行 cmets,这样如果由于任何原因错误地解析出空格,您的代码就不会出现任何问题(我见过一些内容管理系统在其富文本编辑器中删除换行符)。

    还有一个关于CDATA 的警告,CDATA 元素,就像script 元素一样,在结束标记的第一个符号 (]]&gt;) 处停止包装其内容,所以要小心避免写一些东西喜欢:

    lorem = ipsum[dolor[sit]]>amet;
    

    因为它会杀死你的 CDATA 元素。

    为避免所有这些问题,请尽可能将您的 JavaScript 保存在它们所属的外部 .js 文件中。

    我知道对于简单的单行代码,最好避免使用外部文件,在这种情况下,您应该使用 &lt;![CDATA[ ]]&gt; 元素,甚至 HTML 转义您的 JavaScript。

    问题 #2

    报价

    你提供给document.write的字符串:

    document.write("<script src='links7.js?'+Math.random()+></script>");
    

    格式不正确,无法执行除定义 &lt;script src='link7.js?'Math.random()+&gt;&lt;/script&gt; 的静态字符串之外的任何操作。

    如果你想执行Math.random(),你需要在前面有一个字符串,在后面有一个字符串:

    '<script src="links7.js?' + Math.random() + '"></script>'
    

    您可能注意到我交换了'" 的用法。我通常喜欢看到在 HTML 属性中使用 ",并且 讨厌 不得不转义 \" 文字,所以我在 JS 中尽可能频繁地使用 ' 来表示字符串文字。

    此外,您应该注意src 属性的开始和结束引号。 DOM 可能能够很好地猜测属性何时何地结束,但不要推送它,以防它导致代码中的某些损坏。

    【讨论】:

    • 啊,我一直想知道为什么每个人都使用两部分字符串来表示&lt;/script&gt; 标签。
    • 但我不必将其包装在脚本标签中吗?
    • 另外,您的代码的 other 问题是您在使用document.write 构建的字符串上有一些不正确的引号。确保您使用的是具有语法高亮功能的优质文本编辑器,这样您就可以看到何时正确转义了字符串,何时未正确转义。
    • 我认为它必须是这样的,因为我得到其他建议的解析错误。
    • 这太棒了。消除了解析和语法错误。谢谢(你的)信息。非常感谢。
    【解决方案2】:

    一步一步:
    从您希望代码的外观开始:

    <script src="links7.js?89736459827345"></script>
    

    然后把它放在一个文字字符串中:

    '<script src="links7.js?89736459827345"></script>'
    

    将随机部分隔离在单独的字符串中:

    '<script src="links7.js?' + '89736459827345' + '"></script>'
    

    用随机表达式替换随机部分:

    '<script src="links7.js?' + Math.random() + '"></script>'
    

    在结束脚本标签中放一些东西,以防止它与将要进入的脚本标签混淆:

    '<script src="links7.js?' + Math.random() + '"></scr' + 'ipt>'
    

    将其放入document.write 调用中:

    document.write('<script src="links7.js?' + Math.random() + '"></scr' + 'ipt>');
    

    以及它周围的脚本标签:

    <script type="text/javascript">
    document.write('<script src="links7.js?' + Math.random() + '"></scr' + 'ipt>');
    </script>
    

    【讨论】:

      【解决方案3】:

      您遇到了打开/关闭引号的问题。试试:

      document.write("<script src='links7.js?" + Math.random() + "'></script>");
      

      【讨论】:

        【解决方案4】:
        <script type="text/javascript">
        document.write("<script src='links7.js?" + Math.random() + "'></script>");
        </script>
        

        建议:使用带代码高亮的IDE。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-12-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-03-17
          • 1970-01-01
          • 1970-01-01
          • 2017-04-04
          相关资源
          最近更新 更多