Chrome返回"SyntaxError: Unexpected token"。

4

好的,这个问题已经被问得非常频繁并且有很多变化,但是我仍然没有找到任何能够使我摆脱这种折磨的答案。

我的代码在Safari、Internet Explorer v.8上运行良好。然而,在Chrome浏览器中,只有特定的组合(涉及链式's)才会抛出"SyntaxError:Unexpected token"消息。

以下是我从一个ASP(经典)页面返回的JSON。它适用于99%的输入,但对于以下JSON文本,它会抛出错误:

{"queryStatus":"Not_Empty", "printID":["50674","54648","50437","37564","37566","37565","49124","null"], "printName":["BBB-12312313","BBB-1558","BBB-2-065 + 2-066","BBB-2-217","BBB-2-217b","BBB-2-226/2-217b ","BBB-2-5961b","null"]}

现在,我的JS代码如下:
$.ajax({
                    type: "GET",
                    url: "callbacks/xmlHTTPRequestGetPrintItems.asp?LabelID=" + $("#LicenseLabel").val() + "&RequestType=0",
                    data: "",
                    contentType: "application/json; charset=utf-8",
                    dataType: "json",
                    async: false,
                    success: function (data, textStatus, jqXHR) {
                        if (data.queryStatus == "Not_Empty") {
                            for (i = 0; i < data.printID.length - 1; i++) {
                                $('#ApprovalItem').append($('<option>', { value: data.printID[i] }).text(data.printName[i]));
                            }
                        }
                    },
                    error: function (xhr, ajaxOptions, thrownError) { alert(thrownError); }
});

结果:"语法错误:未预期的标记"
以下是我的尝试:
1.更改“contentType”/删除它,包括$.ajax选项和服务器端页面的响应; 2.寻找特殊字符-没有发现; 3.取出对象末尾的“null”字符串;
我已经了解到可能是从数据库中检索到的零宽度间隔(Unicode-200B),但是我还没有成功解决它。
再次强调-它在Chrome上对99%的输入有效,在IE 8上对100%的输入有效。非常感谢您的帮助。

1
错误是在控制台还是弹出的警告框中显示的? - Reinstate Monica Cellio
1
错误已经被警报。ASP文件返回了提到的JSON文本,这对于除此之外的所有情况都是如此。 - Yuval Herziger
1
这很奇怪,不是吗?我的意思是,在父级<select>中选择的每个其他值在Chrome上都可以正常工作。只有一个特定的父级选择值,返回所提到的JSON会导致此错误。 - Yuval Herziger
1
您发布的返回值是否是导致错误的调用实际返回的内容? - Reinstate Monica Cellio
2
使用低级嗅探工具(如WireShark)查看原始字节级响应可能会有所裨益。这可以更容易地检测到任何可疑的不寻常字符。 - Jacob
显示剩余2条评论
1个回答

2
这可能会或可能不会起作用。根据上述信息,我无法重现问题,显然这使得帮助你变得困难,但这将是我的第一个建议...
$.ajax({
    type: "GET",
    url: "callbacks/xmlHTTPRequestGetPrintItems.asp?LabelID=" + $("#LicenseLabel").val() + "&RequestType=0",
    data: "",
    contentType: "application/json; charset=utf-8",
    dataType: "text",
    async: false,
    success: function (data, textStatus, jqXHR) {
        data = JSON.parse(data);
        if (data.queryStatus == "Not_Empty") {
            for (i = 0; i < data.printID.length - 1; i++) {
                $('#ApprovalItem').append($('<option>', { value: data.printID[i] }).text(data.printName[i]));
            }
        }
    },
    error: function (xhr, ajaxOptions, thrownError) { alert(thrownError); }
});

我所做的只是将dataType指定为text而不是JSON,然后在返回时使用JSON.parse()。这至少可以确定错误是调用还是响应(但我认为我们已经知道了)。


1
谢谢Archer - 非常有帮助。现在它确实访问了“success”方法,但是在使用Chrome进行调试时仍然出现相同的错误并被发现。我将尝试更深入地查看数据库输出,看看是否有什么问题。 - Yuval Herziger
1
@pushplaybang - 是的,抱歉让你等了。我们通过将ajax调用中的"dataType"选项更改与在回调服务器页面上使用替换()方法(相当于您的服务器端语言replace()方法)将TAB替换为SPACES来实现分辨率。 - Yuval Herziger
谢谢,看起来只有在服务器端验证失败时才会出现这种情况,所以失败时返回值可能存在问题。 - bigmadwolf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接