好的,使用 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”是否在“hammer”之后返回并不重要,我们只想进行调用(我确实在实际代码中处理了这个)。我的问题是……有时,尤其是在频繁按键的情况下,我没有得到 UI 更新,我收到一个错误,该错误被记录到我的控制台,看起来像这样:
handleJSONPResponse({"JSON" : "Some Data"})
因此,如您所见,jQuery 的响应文本很好,但它仍然会导致解析器错误。我还验证了 JSON 内容是否正常。让我强调一下,有时用于“锤子”的 JSONP 有效,有时用于“锤子”的 JSONP 会失败。它不是后端错误;我总是在我的 xhr.responseText 中得到看起来像有效的 JSONP 响应。
我已经尝试将 JSONP 回调处理程序传递给 Ajax 请求的“成功”参数,但这不会改变操作。我唯一能防止此错误的方法是删除指定的 JSONP 回调名称并让 jQuery 生成随机名称,但我的缓存层要求我必须保持 URL 静态,因此是静态回调名称.
我可以做些什么来确保我不会从 jQuery 中随机获取 parsererror 失败?
你可以在这里看到一个例子:
JSFiddle“Echo”JSONP 产生错误的频率远低于我的本地服务,但如果你认真对待它,你会看到一些“handleJSONPResponse not defined”错误通过你的控制台......
澄清: 跨域是必需的,所以任何不是跨域的都不起作用。抱歉,除了使用 JSONP 作为标准而不是普通的 Ajax 请求之外,我在第一个示例中没有更清楚地说明这一点。