问题 #1
转义/编码
当 HTML 解析器找到 <script> 时,它将开始解析内容,直到找到存在于以下位置的 </script>:
document.write("<script src='links7.js?'+Math.random()+></script>
因此,您需要更改源代码,使其不会被解析为脚本元素的结尾:
document.write("<script src='links7.js?'+Math.random()+></scri" + "pt>");
理想情况下,您应该让 HTML 转义所有内联 JavaScript 代码,这也可以缓解这个问题:
document.write("<script src='links7.js?'+Math.random()+></script>");
但老实说,这样做真的很烦人真的很快。
转义内联 JavaScript 中所有字符内容的更好方法是使用 CDATA(字符数据)元素:
<script type="text/javascript">
<![CDATA[
document.write("<script src='links7.js?'+Math.random()+></script>");
]]>
</script>
当然,因为 CDATA 元素在 <script> 元素内,JS 解析器会尝试将其作为代码执行,并且不知道如何处理像 < ! [ CDATA [ 这样的语法,所以绕过这个问题,你需要将CDATA元素包装在JS注释中:
<script type="text/javascript">
//<![CDATA[
-or-
/* <![CDATA[ */
//]]>
-or-
/* ]]> */
</script>
我推荐第二种形式,使用多行 cmets,这样如果由于任何原因错误地解析出空格,您的代码就不会出现任何问题(我见过一些内容管理系统在其富文本编辑器中删除换行符)。
还有一个关于CDATA 的警告,CDATA 元素,就像script 元素一样,在结束标记的第一个符号 (]]>) 处停止包装其内容,所以要小心避免写一些东西喜欢:
lorem = ipsum[dolor[sit]]>amet;
因为它会杀死你的 CDATA 元素。
为避免所有这些问题,请尽可能将您的 JavaScript 保存在它们所属的外部 .js 文件中。
我知道对于简单的单行代码,最好避免使用外部文件,在这种情况下,您应该使用 <![CDATA[ ]]> 元素,甚至 HTML 转义您的 JavaScript。
问题 #2
报价
你提供给document.write的字符串:
document.write("<script src='links7.js?'+Math.random()+></script>");
格式不正确,无法执行除定义 <script src='link7.js?'Math.random()+></script> 的静态字符串之外的任何操作。
如果你想执行Math.random(),你需要在前面有一个字符串,在后面有一个字符串:
'<script src="links7.js?' + Math.random() + '"></script>'
您可能注意到我交换了' 和" 的用法。我通常喜欢看到在 HTML 属性中使用 ",并且 讨厌 不得不转义 \" 文字,所以我在 JS 中尽可能频繁地使用 ' 来表示字符串文字。
此外,您应该注意src 属性的开始和结束引号。 DOM 可能能够很好地猜测属性何时何地结束,但不要推送它,以防它导致代码中的某些损坏。