【问题标题】:How to display json array as repeating region from query如何将json数组显示为查询中的重复区域
【发布时间】:2012-04-15 21:02:35
【问题描述】:

目前所有使用我的 jquery $.post 操作、成功连接、查询和 json_encode 都返回到我的页面。我无法做的(并且是 json 的新手)是如何将返回的值显示为实时提要?我当前的 jquery js 文件是'jquery-1.7.2.min.js',我的代码是

    $(document).ready(function(){
      setInterval(function(){
      $.post('query.php', function(pendingReq){
      $('#div_id').html(pendingReq);
      }), 'json' });
    }, 5000

);

pendingReq 是我从查询中返回的数据,当前输出如下所示: {"[0]":"FirstReq", "[1]":"SecondReq", ...."} 基于我对数组的 mysql 查询构建

$res = array("[0]"=>var['1']...);

我对使用 json 非常陌生,并且不会使用很多 javascript,但希望将返回的数据显示在表格中,谢谢。

我下面的代码有效,但只有一行 mysql 查询,如果存在两个条目,我会在 Firebug 中收到“Uncaught SyntaxError: Unexpected token {”错误??仍然像以前一样返回结果:

    $res = array("req_name"=>$ew_display['req_name'], "date"=>$ew_display['req_dt']);
echo json_encode($res);



$(document).ready(function(){
            var table_template = "<table border=1 cellspacing=0 id='results'><tr><th>JTAR #</th><th>JTAR @</th></tr></table>";
            $("#testd").html(table_template);
    setInterval(function(){
        $.post("query.php", {track : 2}, function(pendingReq){
            var json = JSON.parse(pendingReq);
            var template = "<tr><td>{{req_name}}</td><td>{{date}}</td></tr>";
            var new_row = Mustache.render(template, json); 
            $("#results").append(new_row).fadeIn("slow");
        }), "json"
}, 5000);

【问题讨论】:

  • @dbaseman 有什么想法吗?第一个问题是我的jquery语句,错了,现在我猜这是回调中的数组造成的?

标签: javascript html json


【解决方案1】:

-- 编辑--

因为你有一个区间,模板可以是常数:

var table_template = "<table border=1 cellspacing=0 id='results_table'><tr><th>col1</th><th>col2</th></tr></table>";
$("#div_id").html(table_template);
var template = "<tr><td>{{[0]}}</td><td>{{[1]}}</td></tr>";

现在对于间隔,您可以解析结果字符串并渲染每一行:

setInterval(function() {
    $.post("query.php", function(pendingReq) {
        var json = JSON.parse(pendingReq);
        var new_row = Mustache.render(template, json); 
        $("#results_table").append(new_row);
    });
});

-- 结束编辑--

我是 Mustache.js (https://github.com/janl/mustache.js) 的忠实粉丝,它允许您将数据 (JSON) 与演示文稿 (HTML 表格) 分开。我不喜欢从您的服务器返回预先格式化为 HTML 的 AJAX 数据。您可以使用这样的语法(仅作为示例):

var template = "<table>{{#item}}<tr><td>{{name}}</td><td>{{age}}</td><td>{{job}}</td></tr>{{/item}}</table>";
var html = Mustache.render(template, pendingReq);
$('#div_id').html(html);

【讨论】:

  • 不知道这个!无论如何,如果你没有 Mustache,直接返回 html 比通过 javascript 显示 json 更好,恕我直言。
  • 下载了小胡子,在我的页面上做了一个包含并使用了上面的例子,并用我的变量替换了姓名、年龄、工作,只是一个空白页面(也建立了我自己的 div_id)。我已将上面的示例代码作为我的函数“代码”的一部分 $(document).ready(function(){ setInterval(function(){ $.post("earf1.php", function(pendingReq){ var template = "
    {{req_name}} {{date}}
    "; var html = Mustache.render(template, pendingReq); $('#ew').html(html); }), "json" }); }, 5000);'code'
  • @dbaseman 仍在努力完全理解小胡子的方式,我相信我的查询返回是一个字符串而不是一个对象,因为它显示 {"0":"val1", "1": "val2"...},这样对吗?
  • @ChadW 我们需要确定它是字符串还是对象。如果它是一个字符串,你应该能够做 $("#ew").html(JSON.parse(pendingReq)["0"] 并看到 "val1"。如果它是一个对象, $("#ew") .html(pendingReq["0"]) 应该给你“val1”。
  • @dbaseman 我要感谢你,尽管我很想使用 mustache,但我做的事情是错误的,猜测我的脚本包含 mustache.js 是不对的?我觉得用起来会很棒
【解决方案2】:

jQuery 文档展示了如何在 ajax 回调函数中使用返回的 json:http://api.jquery.com/jQuery.getJSON/

但是,与其将查询结果返回为 json,不如返回 html(包含结果的表格代码),然后直接在 div 中显示该 html?

以下是执行类似操作的示例: Modifying the AJAX PHP database example

更新:如何将数据返回为 html 而不是 json:

好的,假设您的 php 脚本当前返回一个 json 编码的字符串:

$str_json = '{"0":"FirstReq", "1":"SecondReq", ...."}';

现在在 php 脚本中执行类似的操作 - 当然取决于您想要显示的内容:

$lst_data = json_decode($str_json);

$html = "<table>\n<tr>\n";
foreach ($lst_data as $i => $data) {
    $html .= "<th>" . $i . "</th>";
$html .= "</tr>\n<tr>\n";
foreach ($lst_data as $data) {
    $html .= "<td>" . $data . "</td>";
}
$html .= "</tr>\n</table>\n";

echo $html;

编辑:你可能有类似的东西:

$res = mysql_fetch_assoc($data);

// Remove this from your script:  echo json_encode($res);

// Add this:
$html = "<table>\n<tr>\n";
foreach ($res as $i => $r) {
    $html .= "<th>" . $i . "</th>";
$html .= "</tr>\n<tr>\n";
foreach ($res as $r) {
    $html .= "<td>" . $r . "</td>";
}
$html .= "</tr>\n</table>\n";

echo $html;

...记得将 jQuery $.post() 函数中的 dataType 设置为 html

【讨论】:

  • 如何从我的 sql 查询中将其作为 html 返回? htmlentities?
  • 只需创建一个包含您想要查看的普通 html 代码的 html 字符串,并在脚本末尾回显:$html = '&lt;table&gt;...(use php data from query)..&lt;/table&gt;'; echo $html;
  • 还将 .post() 函数中的 dataType 参数更改为“html”(或留空)。
  • 所以我不明白 $lst_data = json_decode($str_json) 来自哪里。我的 php 从单独页面上的 sql 查询中的 echo json_encode($res) 返回数组 {"0":"FirstReq"....}?
  • @Chad W: $str_json = json_encode($res);所以它看起来像$res = $lst_data。在这种情况下,您可以删除脚本中的 json_encode 和 json_decode 语句,并确保我的代码中的 $lst_data 与您的代码中的 $res 相同。
【解决方案3】:

乍得,请为您的数组“$res”使用 json_encode()

echo json_encode($res);

如果php返回一个字符串,那么你可以使用

var json = JSON.parse(pendingReq);

一旦你得到 json 对象,你就可以使用 .运算符来访问属性。

首先找出你的 json 包含什么... 做:

alert(JSON.stringify(json));

stringify 将 json 对象转换为可读字符串 您可以使用 JSON.parse 转换回来; 您可以通过执行 json.property 来访问属性。

现在您可以拥有一个不断更新所有数据的表。 考虑这样一个对象: var obj = {name:"Adam",age:35,job:"Programmer"}; 您可以通过以下方式将此信息添加到表中:

$("#table").html($("#table").html() + "<tr><td>" + obj.name + "</td><td>" + obj.age + "</td><td>" + obj.job + "</td></tr>");

【讨论】:

  • 当我注释掉 var json = JSON.parse(pendingReq);并使用 alert(JSON.stringify(pendingReq));我确实看到文本出现在警报窗口中,但是当我使用 var = json 尝试上述操作时,我有一个空白屏幕?
  • 又尝试了一件事,从 sql 中删除了我的 3 个表中的 2 个,并且输出正常工作,并且不断循环相同的输出,所以我现在的问题是,如何在循环后停止显示查询已停止?以及如何将 json 代码循环到下一个数组?也谢谢你的上述
猜你喜欢
  • 2020-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-19
  • 2021-08-27
  • 1970-01-01
  • 2017-05-07
  • 2016-03-27
相关资源
最近更新 更多