这种问题的解决方案是什么?

时间:2010-05-28 10:06:27

标签: php javascript html

<a onclick="run(&#039;Hi, Tim!  I&amp;#039;ve got two&#039;, &#039;">test</a>

onclick事件根本没有运行。

上述内容是由以下内容生成的:

<a onclick="run(<?php echo htmlentities($str) ?>)">test</a>

如何解决?

2 个答案:

答案 0 :(得分:2)

您正在输出字符串的内容而不引用它

将echo语句放在''

<a onclick="run('<?php echo htmlentities($str) ?>')">test</a> 

顺便说一句,&#039; ='

答案 1 :(得分:2)

在进行实体编码之前,

$str是:

'Hi, Tim!  I&#039;ve got two', '

显然不是有效的JavaScript字符串文字。撇号是HTML编码的,它不应该是,并且有一些尾随的废话。

您应该使用json_encode函数创建JavaScript字符串(和其他)文字。如果你有$ rawstr as:

Hi, Tim!  I've got two

然后json_encode将为您提供正确的JavaScript字符串:

'Hi, Tim!  I\'ve got two'

因此您可以将其插入到HTML事件处理程序属性中:

<a onclick="run(<?php echo htmlspecialchars(json_encode($rawstr)) ?>); return false;">test</a>

注意htmlspecialchars(),它优于htmlentities(),因为后者通常会不必要地HTML转义所有非ASCII字符,如果你没有指定正确的字符集,它们就会搞乱它们

从PHP 5.3开始,您可以使用JSON_HEX_标志来确保HTML特殊字符永远不会出现在json_encode的输出中,从而为您节省编码步骤:

<a onclick="run(<?php echo json_encode($rawstr, JSON_HEX_TAG|JSON_HEX_AMP|JSON_HEX_QUOT) ?>); return false;">test</a>

为了让您的生活更轻松,请将这些常见的输出转义方法封装到更简单命名的函数中:

function h($s) {
    echo htmlspecialchars($s, ENT_QUOTES);
}
function j($s) {
    echo json_encode($s, JSON_HEX_TAG|JSON_HEX_AMP|JSON_HEX_QUOT|JSON_HEX_APOS);
}
function u($s) {
    echo urlencode($s);
}

<a onclick="run(<?php j($rawstr); ?>); return false;">test</a>

更好的是,通过脚本绑定来避免使用内联事件处理程序属性:

<a id="test">test</a>
...
<script type="text/javascript">
    document.getElementById('test').onclick= function() {
        run(<?php j($rawstr); ?>);
        return false;
    };
</script>