2015-07-13 88 views
4

我从我的PHP文件就像一个JSON响应工作:jQuery的AJAX无法与JSON响应

[ 
    {"id":"1"}, 
    {"archiveitem":"<small>26.06.2015 12:25<\/small><br \/><span class=\"label label-default\">Bug<\/span> has been submitted by Admin"} 
] 

并尝试获取这种反应到被点击按钮后一个div,但Firebug是告诉我来自错误处理程序的消息。我无法弄清楚问题所在?

$('#loadarchive').click(function(){ 
    $.ajax({ 
     type: 'post', 
     url: '/src/php/LoadAdminDashboardArchive.php', 
     dataType: 'json', 
     data: { 
      action : 'getArchive' 
     }, 
     success: function(results) { 
      var archiveelements = JSON.parse(results); 
      console.log(results); 
      $.each(archiveelements, function(){ 
       $('#archivecontent').html('<div class="mark-read-container"><span class="btn-mark-unread" id="' + this.id + '">Unarchive</span></div><div class="bs-callout bs-callout-default">' + this.archiveitem + '</div>'); 
      }); 
     }, 
     error: function(){ 
      console.log('Cannot retrieve data.'); 
     } 
    }); 
}); 
+0

如果错误处理程序被击中,则意味着来自服务器的响应不是'200 OK'。这意味着你的'responseURL'位置有错误。事实上,如果'responseURL'是一个变量,你应该删除它周围的引号。 –

+0

此响应的HTTP状态码是什么? – kamituel

+0

哇,这很快:-)我对Firebug不是很熟悉,但它似乎没有给出任何响应... responseURL不是一个变量,它只是/src/php/LoadAdminDashboardArchive.php – Quhalix89

回答

0

我能得到它的工作,问题是很简单......

我忘了粘贴“按钮” - 源代码发起Ajax请求。这是一个类型为“submit”的输入,因此在成功检索响应之后默认重新加载页面...所以e.preventDefault();是要走的路。

感谢大家。

1

如果您再深入一点,可以从控制台获得更多信息。或登录这两个参数:

error: function(xhr, mssg) { 
    console.log(xhr, mssg); 
} 
+0

哦,我不知道......它给我:\t 对象{readyState = 0,status = 0,statusText =“error”,mehr ...}错误 – Quhalix89

2

我试图运行你的代码,我得到

SyntaxError: JSON.parse: unexpected character at line 1 column 2 of the JSON data 

通过定义dataType: 'json'您的结果已经被解析为一个数组。所以,你可以这样做:

success: function (results) { 
    if (results["head"]["foo"] != 0) { 
     // do something 
    } else if (results["head"]["bar"] == 1) { 
     // do something 
    } 
} 

这个作品在我的电脑上:

$.ajax({ 
    type: 'post', 
    url: '/src/php/LoadAdminDashboardArchive.php', 
    dataType: 'json', 
    data: { action : 'getArchive' }, 
    success: function(results) { 
     console.log(results); 
     $.each(results, function(){ 
      $('#archivecontent').html('<div class="mark-read-container"><span class="btn-mark-unread" id="' + this.id + '">Unarchive</span></div><div class="bs-callout bs-callout-default">' + this.archiveitem + '</div>'); 
     }); 
    }, 
    error: function(){ 
     console.log('Cannot retrieve data.'); 
    } 
}); 
+0

什么工具给你这个“语法错误“?我没有看到在萤火虫..即使使用您的代码,我得到:readyState \t 0 ResponseJSON undefined status 0 statusText“error” – Quhalix89

+0

我用Firebug 2.0.11调试,并得到这个消息在Firebug控制台 – Sergej

+0

可能在那里在你的'/src/php/LoadAdminDashboardArchive.php'文件中出现错误,你直接调用这个URL会得到什么回应? – Sergej

1

首先 你的反应是不正确的,正确的反应应该是这样的

[{ 
    "id":"1", 
    "archiveitem":"<small>26.06.2015 12:25<\/small> 
<br \/><span class=\"labellabel-default\">Bug<\/span> has been submitted by Admin" 
}, 
{ 
    ... 
}] 

你不必解析结果即。 JSON.parse不是必需的,因为dataType:'json'可能会照顾json。

最后你成功的方法应该是这样的:

success: function(results) { 
      $.each(results, function(ind,el){ 
       $('#archivecontent').html('<div class="mark-read-container"><span class="btn-mark-unread" id="' + el.id + '">Unarchive</span></div><div class="bs-callout bs-callout-default">' + el.archiveitem + '</div>'); 
      }); 
     }, 
+0

好吧,我同意json响应格式不正确,我改变了它,现在是: [{“id”:“1”,“archiveitem”:“ 26.06.2015 12:25 <\/small>
已经提交管理员“}] 我也改变了jquery部分,但错误仍然是一样的... – Quhalix89

+0

@ Quhalix89使用开发人员工具中的网络选项卡,并检查请求是否返回正确响应 – reverbnation

+0

在firefox开发人员工具中使用网络选项卡时,似乎单击此按钮只会发送一个请求到当前页面而不是我的php-json-response-file – Quhalix89

1

至于你说的从错误处理消息显示。

这意味着AJAX不会发送到服务器,因为不正确的URL或任何其他原因。

在Firefox中使用Firebug并查看控制台选项卡中的错误。

而且我看到你的代码

dataType: 'json', 
data: { action : 'getArchive' }, 
success: function(results) { 
    var archiveelements = JSON.parse(results); 
} 

不要使用JSON.parse(results),因为你已经写好dataType: 'json',和任何类型的响应被自动解析。