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)它说'未定义。“
这是怎么回事?
你是在正确的道路上,但是正如其他人所说,好像你正在使用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>
更多选项和有关$.ajax
jQuery.ajax();
更多信息,使用信息有关$.post
jQuery.post();
谢谢 - 我会在回到我的电脑时尝试。 – 2012-08-07 23:41:37
这工作,谢谢! – 2012-08-08 21:46:01
不客气:)很高兴帮助! – 2012-08-08 21:54:58
听起来像你的/ testJSON /页面输出的不仅仅是你在公共函数中写的东西。如果您使用的是mvc或任何类型的框架,您必须立即退出或死于echo json_encode之后,否则页面的其他部分仍然可能会呈现。
我现在无法测试,但听起来没错。我正在使用蛋糕php。 – 2012-08-07 23:38:33
在尝试记录message.name之前,将消息变量解析为json。
data = $.parseJSON(message);
console.log(data.name);
还做在PHP脚本退出echo语句后,检查..
是所有在testJSON的代码? – 2012-08-07 22:26:50
您可能需要在设置ajax调用时设置“dataType:'json'”。我知道jQuery对这个类型有一个明智的猜测,但是谁知道,也许这是错误的。 – Gromer 2012-08-07 22:31:30
是的,就是这样 - 它只是我的蛋糕控制器中的一个函数php应用 – 2012-08-07 23:39:26