繁体   English   中英

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

[英]What's the solution for this kind of problem?

<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>

怎么解决?

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

将回声语句放入''

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

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

$str ,在进行实体编码之前,是:

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

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

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

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>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM