究竟需要在javascript字符串中进行转义。或者,更具体地说,为什么
var snaphtml = '<script src="http://seadragon.com/embed/lxe.js?width=auto&height=400px"></script>';
给出语法错误?转义最终<\/script>
似乎修复了语法错误,但这对我作为javascript初学者没有意义。
答案 0 :(得分:11)
问题可能是网络浏览器看到“</script>
”序列并判定这是脚本块的结尾。
除了像你一样使用转义序列之外,解决问题的另一种方法是将它分成两个串联的字符串:
"<" + "/script>"
您所看到的行为不是浏览器中的错误。
浏览器不会“查看”脚本块,它们只是将内容传递给脚本引擎。 “</script>
”序列是他们知道他们已经到达块的末尾的方式,并且因为浏览器不解释块的内容,所以它无法知道它是在上下文中脚本代码中的文字字符串。
请记住,浏览器可以支持比Javascript更多的脚本语言,即使它不常见。 Internet Explorer支持VBscript(我认为任何脚本语言都可以由Windows脚本主机运行,但我不确定)。当具有脚本块的能力被放入浏览器的时候,没有人可以确定Javascript最终会如此普遍。
答案 1 :(得分:4)
您实际上遇到了一个html转义问题:浏览器将字符串中的</script>
解释为嵌入了javascript的script
元素的close标记 - 所以对于浏览器,你的行似乎缺少关闭单引号:
var snaphtml = '<script src="http://seadragon.com/embed/lxe.js?width=auto&height=400px">
要修复它,正如您所发现的那样,您只需将</script>
更改为其他任何内容,例如<\/script>
或\074/script>
等。
你通常需要在javascript字符串中担心的唯一字符是双引号(如果你引用带双引号的字符串),单引号(如果你用单引号引用字符串)引号),反斜杠,回车符(\ r)或换行符(\ n)。
答案 2 :(得分:2)
HTML解析器将解释字符串中标记令牌(ETAGO定界符</
)的结尾,作为当前脚本标记的末尾,为您提供未终止字符串 {{1 }}
有几种解决方法,包括使用SyntaxError
块,但最简单的方法是转义该字符,或者进行字符串连接:
CDATA
当然,您也可以通过编程方式创建var snaphtml = '<script src="...">\x3C/script>';
var snaphtml = '<script src="..."><' + '/script>';
元素并将其附加到头部:
script
答案 3 :(得分:1)
有关详细说明,请参阅 Everything you always wanted to know about </
, aka. the end-tag open (ETAGO) delimiter 。 TL; DR没有必要像字符串连接或char字面转义那样疯狂的黑客 - 只是逃避它:
var snaphtml = '<\/script>';
另请注意,这仅适用于内联脚本。