jQuery" parseerror"使用静态JSONP回调函数

时间:2013-05-15 20:49:32

标签: jquery jsonp parse-error

好的,使用jQuery进行简单的JSONP设置,构建时要求我有超出搜索词的“静态”URL:

function handleJSONPResponse (data, status, request) {
    // update UI
}

$(function () {
$('#some-input').on('keyup', function () {
    $.ajax('http://www.example.com/service/', { 
        dataType : 'jsonp',
        jsonpCallback : 'handleJSONPResponse',
        data : {
            search : $('#some-input').val()
        },
        complete : function (xhr, status) {
            if (status === 'parsererror') {
                console.log(xhr.responseText)
            }
        }
    });
});

当用户按下键时,会触发他们的请求。出于这个问题的目的,“hamme”在“锤子”之后返回并不重要我们只想进行调用(我在实际代码中处理这个)。我的问题是这个...有时,特别是在频繁的按键操作下,我没有得到UI更新,我得到一个错误,记录到我的控制台看起来像这样:

handleJSONPResponse({"JSON" : "Some Data"})

因此,正如您所看到的,jQuery具有的响应文本很好,但它仍然会导致parsererror。我还验证了JSON内容没问题。 让我强调,有时候“锤子”的JSONP有效,有时“锤子”的JSONP失败。它不是后端错误;我总是在xhr.responseText中获得看似有效的JSONP响应。

我已经尝试将此JSONP回调处理程序传递给Ajax请求的“success”参数,但这不会改变操作。我能做的唯一可以防止此错误的是删除指定的JSONP回调名称并让jQuery随机生成,但是我的缓存层要求我必须保持URL静态,因此是一个静态回调名称

我可以做些什么来确保我不会从jQuery中随机获取parsererror失败?

你可以在这里看到一个例子:

http://jsfiddle.net/yVqpS/

JSFiddle“Echo”JSONP产生的错误远远少于我的本地服务,但是如果你坚持下去,你会看到一些“handleJSONPResponse not defined”错误来自你的控制台......

澄清: 跨域是必需的,因此任何非跨域的都不起作用。对不起,除了使用JSONP作为我的标准而不是普通的Ajax请求之外,我没有在第一个示例中更清楚。

1 个答案:

答案 0 :(得分:1)

在这种情况下使用$ .getScript可能更容易:

http://jsfiddle.net/yVqpS/1/(注意它是如何在正文中运行脚本,而不是dom load。头也会工作。必须在全局命名空间中定义函数。)

function handleJSONPResponse(data, status, request) {
    console.log('response', data);
}

$(function(){
    $('#some-input').on('keyup', function () {
        $.getScript('http://jsfiddle.net/echo/jsonp/?' + $.param({
            search: $('#some-input').val()
        }) + "&callback=handleJSONPResponse");
    });
});