通过JSON返回HTML不起作用


Returning HTML through JSON doesn't work

我用PHP创建了一个包含大量HTML的表。创建后,我将其作为JSON字符串回显,如下所示:

echo json_encode($array['table']); 

然后我使用jQuery.parseJSON(returnString);并尝试将其附加到div。这仅在我返回字符串时有效。当我发送HTML时,它不起作用(在这种情况下根本没有返回任何东西)。

谁能告诉我出了什么问题?我需要使用一些功能来解析' / " '符号发送到jQuery之前?编辑:

我的$arr['table']看起来像这样:

$arr['table'] = "<tr class='"{$id}'">lalalal</tr>"

我的JSON是这样的:

'n't't't't't</div>'n't't't't'tfcds'n't't't't't</center>'

您不应该通过JSON发送HTML数据,而应该只是"数据",然后使用javascript创建新的HTML元素并使用这些新元素修改dom。

一个jQuery示例:

var json_doc = $.getJSON('http://yourservice.com/yo/');
var tr = $(document.createElement('tr'));
tr.attr('id', json_doc.responseText.id);
tr.html(json_doc.responseText.html);
$('table').append(tr);

你的http://yourservice.com/yo/的反应将是:

{id: 1, html: "lalalal"}

说明

正如@tkone指出的:你不应该通过JSON发送HTML数据,这不是它的目的。
这是可以做到的,但是不应该

输出所有HTML,并在服务器页面上进行所有处理,然后作为HTML返回
这样的

PHP (server_page.php)

//Connect
$link = mysql_connect($server, $user, $password);
//Select
mysql_select_db($db, $link);
//Query
$result = mysql_query($query);
$data = $_GET['some_data'];
//Loop
echo "<table id='$data'>";
while($row = mysql_fetch_array($result)){
    echo "<tr>";
    foreach($row as $key => $value){
        echo "<td>$value</td>";
    }
    echo "</tr>";
}
echo "</table>";
//Cleanup
mysql_free_result($result);
mysql_close($link);
Javascript

var data = {"some_data": "Foobar"};
$.get("server_page.php", data, function(response){
    $("#output").html(response);
});

或者,您将其输出为JSON信息,其中包含可以在Javascript中处理的数据
这样的

PHP (server_page.php)

//Connect
$link = mysql_connect($server, $user, $password);
//Select
mysql_select_db($db, $link);
//Query
$result = mysql_query($query);
$num_result = mysql_num_rows($result);    
$data = array(
    "mysql_data" => array(),
    "num_result" = $num_result
);
//Loop
while($row = mysql_fetch_array($result)){
        $data['mysql_data'][] = $row;
}
echo json_encode($data);
//Cleanup
mysql_free_result($result);
mysql_close($link);
Javascript

$.getJSON("server_page.php", function(data){
    alert("Number of rows returned from query: "+data.num_result);
});

但是你不应该把这两种不同的方法混在一起。你必须决定在哪里处理所有的逻辑,并在那里传递你需要的所有数据。


<标题> 解决方案

正如你自己指出的,

"<tr class='"{$id}'">lalalal</tr>" 

是错误的JSON。

应该是

"<tr class='{$id}'>lalalal</tr>"

所有JSON必须共享相同的引号,即,如果你使用" '' "' "" '

我建议你在服务器端做你所有的逻辑。您总是可以通过POST或GET发送来自Javascript的请求中的一些数据。这是双向的

我认为你只需要在发送给jq之前转义特殊字符。我通常使用这个库http://phpjs.org/functions/htmlspecialchars:426来编码特殊字符…

如果我可以这样称呼它,我发现了一个错误。在我把'"{$id}'"改成'{$id}'之后,它工作了。