【问题标题】:Why do I need to escape the '/' character in JavaScript? [duplicate]为什么我需要转义 JavaScript 中的“/”字符? [复制]
【发布时间】:2011-01-11 08:28:34
【问题描述】:

在 javascript 字符串中究竟需要转义什么。或者,更具体地说,为什么

var snaphtml = '<script src="http://seadragon.com/embed/lxe.js?width=auto&height=400px"></script>';

给出语法错误?转义最后的 &lt;\/script&gt; 似乎可以修复语法错误,但这对我作为 javascript 初学者来说没有意义。

【问题讨论】:

标签: javascript


【解决方案1】:

问题可能是网络浏览器看到“&lt;/script&gt;”序列并认为这是脚本块的结尾。

除了像您一样使用转义序列之外,另一种解决问题的方法是将其分成 2 个串联的字符串:

"<" + "/script>" 

您看到的行为不是浏览器的错误。

浏览器不会“查看”脚本块,它们只是将内容传递给脚本引擎。 “&lt;/script&gt;”序列是他们如何知道他们已经到了块的末尾,并且由于浏览器不解释块的内容,它无法知道它是在文字的上下文中脚本代码中的字符串。

请记住,浏览器可以支持更多的脚本语言,而不仅仅是 Javascript,即使它并不常见。 Internet Explorer 支持 VBscript(我认为任何可以由 Windows 脚本主机运行的脚本语言,但我不确定)。而且,当浏览器早早将脚本块的功能引入时,没有人能确定 Javascript 最终会如此普遍。

【讨论】:

  • 我在 Google Analytics(分析)代码中看到了这一点。 +1
  • 确实,在同样的情况下,您也经常看到“”+“ipt>”。
  • @Alex The spec 调用浏览器在遇到&lt;/ 时中断。在这里,真实世界的结果显然很重要,但与 '&lt;/scr'+'ipt&gt;' 相比,'&lt;'+'/script&gt;' 总体上可能更安全。
  • @Adam 你说的是 HTML 4.01 规范。浏览器从未实现该特定部分,这就是它在 HTML5 中更改的原因。详细解释见mathiasbynens.be/notes/etago
  • 当然最优雅的解决方案是"&lt;\/script&gt;"。见mathiasbynens.be/notes/etago
【解决方案2】:

您实际上遇到了 html 转义问题:浏览器将您的字符串中的 &lt;/script&gt; 解释为嵌入您的 javascript 的 script 元素的关闭标记 - 所以对于浏览器,您的行看起来它缺少关闭的单引号:

var snaphtml = '<script src="http://seadragon.com/embed/lxe.js?width=auto&height=400px">

如您所见,要修复它,您只需将&lt;/script&gt; 更改为其他任何内容,例如&lt;\/script&gt;\074/script&gt; 等。

在 javascript 字符串中您通常需要担心的唯一字符是双引号(如果您使用双引号引用字符串)、单引号(如果您使用单引号引用字符串-引号)、反斜杠、回车(\r)或换行(\n)。

【讨论】:

    【解决方案3】:

    HTML 解析器会将字符串中标记标记的结尾(ETGO 分隔符 &lt;/)解释为当前脚本标记的结尾,从而为您提供未终止的字符串SyntaxError

    有几种解决方法,包括使用 CDATA 块,但最简单的方法是转义该字符,或进行字符串连接:

    var snaphtml = '<script src="...">\x3C/script>';
    
    var snaphtml = '<script src="..."><' + '/script>';
    

    当然,您也可以通过编程方式创建 script 元素并将其附加到头部:

    var newScript = document.createElement("script");
    newScript.src = "..."; 
    //...
    

    【讨论】:

    • HTML 解析器没有意识到我在一个字符串中?看起来很奇怪。
    【解决方案4】:

    请参阅 Everything you always wanted to know about &lt;/, aka. the end-tag open (ETAGO) delimiter 了解详细说明。 TL;DR 不需要像字符串连接或字符文字转义这样的疯狂黑客攻击——只需将其转义即可:

    var snaphtml = '<\/script>';
    

    另外,请注意,这仅对内联脚本是必需的。

    【讨论】:

      猜你喜欢
      • 2011-10-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-04
      • 2013-02-26
      • 2011-08-16
      • 2014-01-22
      • 2021-02-23
      相关资源
      最近更新 更多