未捕获的语法错误:意外的标记 {

Kel*_*vin 1 javascript php ajax

console.log($obj.longurl)从 Chrome 开发者控制台执行时提示错误

Uncaught SyntaxError: Unexpected token { 
$.ajax.complete 
L jquery.min.js:19
N
Run Code Online (Sandbox Code Playgroud)

下面是我从 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;
});
Run Code Online (Sandbox Code Playgroud)

PHP

echo json_encode(array('loginResult' =>'Passed'));
echo json_encode(array('longurl' => BASE_HREF . $shortened_url));
Run Code Online (Sandbox Code Playgroud)

typeof$obj.longurl是字符串,但不知道为什么可以返回到$('#shortener').val(),有没有人有类似的经验并有解决方案?

Fel*_*ing 6

您的 PHP 代码生成了无效的 JSON。您基本上是在一个接一个地回显两个 JSON 编码的对象,这总体上导致无效的 JSON。它看起来像:

{"loginResult": "Passed"} {"longurl": "<some URL>"}
Run Code Online (Sandbox Code Playgroud)

{是语法错误。

它应该是一个对象数组(尽管这将是一个奇怪的结构)

[{"loginResult": "Passed"}, {"longurl": "<some URL>"}]
Run Code Online (Sandbox Code Playgroud)

或一个对象

{"loginResult": "Passed", "longurl": "<some URL>"}
Run Code Online (Sandbox Code Playgroud)

创建并编码一个数组:

echo json_encode(array(
    'loginResult' => 'Passed',
    'longurl' => BASE_HREF . $shortened_url
));
Run Code Online (Sandbox Code Playgroud)

另一个问题可能是,至少在官方上,传递给完整回调的jqXHR 对象没有.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");
    }
});
Run Code Online (Sandbox Code Playgroud)