jQuery的阿贾克斯不会返回有用的数据

问题描述:

我在文件中有一个jquery脚本,这样说:jQuery的阿贾克斯不会返回有用的数据

<script type="text/javascript"> 
$(document).ready(function(e){ 
    $('#myButton').click(function(e){ 
     var formdata = {name: 'Alan', hobby: 'boxing'}; 
     var submiturl = 'http://localhost/cake/gronsters/testJSON/'; 
     $.ajax({ 
      type: "POST", 
      url: submiturl, 
      data: formdata, 
      success: function(message){ 
       console.log(message); 
      } 
     }); 
     e.preventDefault(); 
    }) 
}); 

然后我在testJSON有一个PHP脚本,这样说:

public function testJSON(){ 
    $name = $this->request->data['name'] . '-Sue'; 
    $hobby = $this->request->data['hobby'] . ' for donuts'; 
    $data = array( 'name' => $name, 'hobby' => $hobby); 
    echo json_encode($data); 
} 

console.log查找消息的地方给我{“name”:“Alan-Sue”,“hobby”:“对甜甜圈装箱”},这看起来是正确的,除非它紧接着是完整的html我的网页。如果我尝试console.log(message.name)它说'未定义。“

这是怎么回事?

+0

是所有在testJSON的代码? – 2012-08-07 22:26:50

+0

您可能需要在设置ajax调用时设置“dataType:'json'”。我知道jQuery对这个类型有一个明智的猜测,但是谁知道,也许这是错误的。 – Gromer 2012-08-07 22:31:30

+0

是的,就是这样 - 它只是我的蛋糕控制器中的一个函数php应用 – 2012-08-07 23:39:26

你是在正确的道路上,但是正如其他人所说,好像你正在使用MVC框架为您的网站,它是显示JSON字符串后,包括您的网页的内容。如果响应中有其他随机文本或字符,jQuery/JavaScript无法解析JSON。您将需要使用exit;die();的JSON后echo'ed如下例所示...

public function testJSON(){ 
    $name = $this->request->data['name'] . '-Sue'; 
    $hobby = $this->request->data['hobby'] . ' for donuts'; 
    $data = array( 'name' => $name, 'hobby' => $hobby); 
    // Will halt the script and echo the json-encoded data. 
    die(json_encode($data)); 
} 

而且,你会希望确保jQuery是解析响应为JSON。默认情况下,它会试图对返回哪种类型的数据进行智能猜测,但是你不能总是依赖它。你应该在下面的例子中dataType选项添加到AJAX调用像...

<script type="text/javascript"> 
$(document).ready(function(e){ 
    $('#myButton').click(function(e){ 
     // It is best practice to "preventDefault" before any code is executed. 
     // It will not cause the ajax call to halt. 
     e.preventDefault(); 
     var formdata = {name: 'Alan', hobby: 'boxing'}; 
     var submiturl = 'http://localhost/cake/gronsters/testJSON/'; 
     $.ajax({ 
      type: "POST", 
      url: submiturl, 
      data: formdata, 
      // This is the proper data type for JSON strings. 
      dataType: 'json', 
      success: function(message){ 
       // JSON is parsed into an object, so you cannot just output 
       // "message" as it will just show "[object Object]". 
       console.log(message.name); 
      } 
     }); 
    }); 
}); 
</script> 

我已经包含在代码,以帮助更好地解释一些意见。希望这会帮助你多一点。除非您计划使用错误处理程序或该函数中的其他更高级选项,否则您也不需要使用完整的$.ajax函数。或者,您可以通过使用$.post缩短代码,并使用较少的代码完成与原始示例相同的操作。

<script type="text/javascript"> 
$(document).ready(function() { 
    $('#myButton').click(function(e){ 
     e.preventDefault(); 
     var formdata = {name: 'Alan', hobby: 'boxing'}; 
     var submiturl = 'http://localhost/cake/gronsters/testJSON/'; 

     $.post(submiturl, formdata, function(message) { 
      console.log(message.name); 
     }); 

    }); 
}); 
</script> 

更多选项和有关$.ajaxjQuery.ajax();
更多信息,使用信息有关$.postjQuery.post();

+0

谢谢 - 我会在回到我的电脑时尝试。 – 2012-08-07 23:41:37

+0

这工作,谢谢! – 2012-08-08 21:46:01

+0

不客气:)很高兴帮助! – 2012-08-08 21:54:58

听起来像你的/ testJSON /页面输出的不仅仅是你在公共函数中写的东西。如果您使用的是mvc或任何类型的框架,您必须立即退出或死于echo json_encode之后,否则页面的其他部分仍然可能会呈现。

+0

我现在无法测试,但听起来没错。我正在使用蛋糕php。 – 2012-08-07 23:38:33

在尝试记录message.name之前,将消息变量解析为json。

data = $.parseJSON(message); 
console.log(data.name); 

还做在PHP脚本退出echo语句后,检查..