从ajax帖子到javascript函数传递变量时,PHP,javascript,IE的单引号问题

时间:2010-03-12 16:38:00

标签: php javascript escaping

我一直试图让它工作一段时间,我怀疑有一个简单的解决方案,我找不到。我的头像果冻一样,我真的很感激任何帮助。

我的主要page.php为backend.php创建了一个.post()并以下列形式提取了一个与之相呼应的城市列表:

<li onclick="script('$data');">$data</li>

通过.html()获取列表并将其放到页面上。

当$ data中包含单引号时,我的问题就出现了。 backend.php将变量传递给page.php,但是当我运行html()时会抛出一个javascript错误(在IE中,显然不是FF);

')'预计

IE解析单引号并搞砸脚本() - 调用。我一直在尝试以不同的方式重建回显的字符串,在php端和/或javascript端转义,但是徒劳无功。我是否必须查看该脚本?

page.php文件

$.post("backend.php", {q: ""+str+""}, function(data) {
    if(data.length >0) {
         $('#results').html(data);
    }

backend.php

while ($row = $q->fetch()) {
    $city = $row['City'];
//  $city = addslashes($row['City']);
//  $city = str_replace("'","&#39;",$row['City']);
    echo "<li onclick=\"script('$city');\">".$city."</li>";
}

5 个答案:

答案 0 :(得分:2)

您需要两种编码:一种用于JavaScript上下文,另一种用于HTML上下文:

所以试试这个:

echo '<li onclick="script(' . htmlspecialchars(json_encode($row['City'])) . ')">' . htmlspecialchars($row['City']) . '</li>';

答案 1 :(得分:2)

您可以拨打script(),然后引用this.innerhtml

<li onclick="script();">$data</li>

然后在你的javascript中:

function script() {
    data = this.innerHTML;
    // do stuff
}

答案 2 :(得分:1)

反斜杠逃避它怎么样?:

$city = str_replace("'","\'",$row['City']);

答案 3 :(得分:1)

为了让您的生活更轻松,如果可以,请尽量使用onclick并在页面的<head>中包含脚本,并根据ID / class注册点击处理程序。更好的是,使用jQuery来做到这一点,但如果你身处S.O.,你可能已经知道了jQuery。够了。

单人/双人/三人逃脱一直是不值得的。

答案 4 :(得分:1)

我对会议的贡献,以最小的改变使用你现有的功能。

<li onclick="script(this.innerHTML);">$data</li>