从Chrome开发者控制台执行console.log($obj.longurl)
时提示错误
Uncaught SyntaxError: Unexpected token {
$.ajax.complete
L jquery.min.js:19
N
下面是我从HTML页面执行并提交表单以调用外部PHP文件的脚本。
从 http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js
调用Javascript$('#shortener').submit(function(e) {
e.preventDefault();
$('#status').text('');
$.ajax({
cache: false,
type: "POST",
dataType: "json",
data: $('#shortener').serialize(),
url: $('#shortener').attr('action'),
complete: function (XMLHttpRequest, textStatus) {
console.log(XMLHttpRequest);
$obj = JSON.parse(XMLHttpRequest.response);
if ($obj.loginResult == "Passed") {
($('#longurl').val() === "") ? console.log("Empty longurl") : console.log($obj.longurl);
} else {
$('#status').text("Login Failed");
};
}
});
return false;
});
PHP
echo json_encode(array('loginResult' =>'Passed'));
echo json_encode(array('longurl' => BASE_HREF . $shortened_url));
typeof $obj.longurl
是字符串,但不知道为什么它可以返回$('#shortener').val()
,任何人都有类似的经验并有解决方案吗?
答案 0 :(得分:4)
您的PHP代码产生无效的JSON。您基本上是在彼此之后回显两个JSON编码对象,这总体上导致无效的JSON。它看起来像:
{"loginResult": "Passed"} {"longurl": "<some URL>"}
第二个{
是语法错误。
它应该是一个对象数组(虽然这将是一个奇怪的结构)
[{"loginResult": "Passed"}, {"longurl": "<some URL>"}]
或一个对象
{"loginResult": "Passed", "longurl": "<some URL>"}
创建并编码一个数组:
echo json_encode(array(
'loginResult' => 'Passed',
'longurl' => BASE_HREF . $shortened_url
));
另一个问题可能是,至少在官方,传递给完整回调的jqXHR object没有.response
属性。由于您还已设置dataType: 'json'
选项,因此无需明确解析响应。
以下是代码的改进版本:
$.ajax({
cache: false,
type: "POST",
dataType: "json",
data: $('#shortener').serialize(),
url: $('#shortener').attr('action'),
}).done(function (data) {
if (data.loginResult == "Passed") {
($('#longurl').val() === "") ? console.log("Empty longurl") : console.log(data.longurl);
} else {
$('#status').text("Login Failed");
}
});