未捕获的SyntaxError:意外的令牌{

时间:2013-12-18 08:31:37

标签: javascript php ajax

从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(),任何人都有类似的经验并有解决方案吗?

1 个答案:

答案 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");
    }
});