我想知道javascript方法是否自动转义引号,因为这段代码有效:
示例#1
<?php $foo ="hey a quote ' "; ?>
<input type="text" value="<?php echo $foo; ?>" id="foo" />
<script>
bar = document.getElementById('foo').value;
alert(bar+'there is a quote, will it work? ,');
</script>
它显示警报正常,但这一个:
例#2
<?php $foo ="hey a quote ' "; ?>
<button onclick="alert('<?php echo $foo; ?>');">test</button>
......没有。显然,这是因为报价没有使用\
进行转义。
但话说回来,第一个例子中也没有,为什么会这样呢?当javascript的方法从DOM中选择东西时,它是否会自动转义引用?
或者它只是value()
方法可能?
我什么也没找到,所以如果你的答案开头,我会很高兴的。
PHP在服务器上处理,生成HTML(在这种情况下包括嵌入式javascript)。这是在将HTML发送到浏览器进行解释之前发生的,包括任何JS。
您将看到是否检查生成的HTML源,您的第二个示例变为:
<button onclick="alert('hey a quote ' ');">test</button>
这是无效的JS语法。
您的第一个版本的工作原理基本上是因为您的PHP字符串插入的代码中没有无关的单引号。插入代替产生:
<input type="text" value="hey a quote ' " id="foo" />
这很好。然后将该值传递给JS中的alert
调用。
不同之处在于,在第一个代码示例中,引用出现在没有包装单引号的上下文中,因此没有歧义。如果你用单引号包装HTML属性值(也是有效的HTML),你就会遇到问题:
<?php $foo ="hey a quote ' "; ?>
<input type='text' value='<?php echo $foo; ?>' id='foo' />
在这种情况下,单引号应该作为HTML实体进行转义:'
:
<?php $foo ="hey a quote ' "; ?>
<input type='text' value='<?php echo $foo; ?>' id='foo' />
现在,在您提供的第二个代码示例中,单引号将出现在包装的单引号中(对于传递给alert
的字符串文字)。这是一个问题,因为单引号现在将结束字符串文字,其后面的字符将导致语法错误。
这里的引用出现在JavaScript字符串文字(alert
代码)中,而不是在第一个示例的HTML上下文中。在JavaScript字符串文字中,单引号可以使用反斜杠进行转义。
因此,在这两种情况下(HTML或JavaScript),您都需要一种转义形式。它们是不同的。
请注意,这些都与PHP无关。