我在研究settimeout时遇到了这段代码。 settimeout在单击按钮5秒后执行警报。
<input type="button" name="clickMe" value="Click me and wait!"
onclick="setTimeout('alert(\'Surprise!\')', 1000)">
然而,我看到里面的警报字符串有一种前所未见的格式。 \'发生在'惊喜之前! \”。有什么用?
答案 0 :(得分:3)
这是缩进的命令:alert('Surprise!')
。它包含两个引号
在这种情况下,命令将作为字符串传递给setTimeout
此字符串由引号分隔:'string'
这看起来像'alert('Surprise!')'
,这是无效的语法,因为它的解析如下:
'alert(' // string
Surprise! // nonsense
')' // another string
因此字符串中的引号是转义以表示“这不是字符串的结尾”。
这是关于尽可能最糟糕的方法。更好的方法是交替使用两种可用的报价类型:
'alert("Surprise!")'
在这种情况下,这会搞乱,因为它会混淆HTML解析器。
更好的方法是传递匿名函数而不是字符串:
setTimeout(function () { alert('Surprise!'); }, 1000)
更好的方法是不引人注目的Javascript,其中您没有使用HTML onclick
属性,而是以编程方式将Javascript附加到DOM元素:
<input type="button" name="clickMe" value="Click me and wait!" id="clicker">
<script type="text/javascript" charset="utf-8">
document.getElementById('clicker').onclick = function () {
setTimeout(function () { alert('Surprise!'); }, 1000);
};
</script>
答案 1 :(得分:2)
这是escape character。反斜杠意味着引号不是字符串的结尾,而是它的一部分。反斜杠不存在,会出现语法错误。
当您的Javascript内联为HTML属性时,处理转义字符会变得棘手。我建议阅读Unobtrusive Javascript以了解避免处理此问题的方法。
答案 2 :(得分:1)
那些反斜杠是为了逃避引号内的引号。通常可以写
alert('Surprise!');
但在这种情况下,整个语句将作为字符串传递。这将是语法错误
'alert('Surprise!');'
因为我们希望第二个和第三个引号作为字符串的一部分。所以我们逃避它。
'alert(\'Surprise!\');'
答案 3 :(得分:0)
这用于从消息中获取摘要。否则它将把它作为两个字符串
one ='alert('
second =')'
惊喜!将放在这两个字符串之间。
答案 4 :(得分:0)
这是一个转义字符串。如果要删除反斜杠,则会显示:
..."setTimeout('alert('Surprise!')',1000)">
在第二个'之后,字符串将完成,您的语句现在将是一个错误,因为它超出了引号。