jQuery 1.11.1+Backbone 1.3.3中JSONP回调未定义问题求助
解决JSONP回调未定义的ReferenceError问题
这个错误的原因很明确:你手动指定了jsonpCallback为inflchallcb,但全局作用域里根本没有定义这个函数,所以当服务器返回inflchallcb({...})时,浏览器找不到这个函数就会抛出引用错误。
最推荐的解决方案:让jQuery自动处理回调
jQuery的JSONP机制默认会自动生成一个临时的随机名称回调函数,处理完响应后自动销毁,既不会出现未定义问题,也能避免多个请求之间的回调冲突。你只需要删掉手动指定的jsonpCallback配置即可:
sync: function(method, model, options) { options.dataType = 'jsonp'; options.cache = true; options.jsonp = 'callback'; // 移除硬编码的回调名称 // options.jsonpCallback = "inflchallcb"; return Backbone.sync(method, model, options); }
特殊情况:服务器必须用固定回调名称
如果后端硬编码要求必须使用inflchallcb作为回调函数名,那你需要在全局作用域手动定义这个函数,并配合Backbone的回调逻辑来处理:
// 在全局作用域(比如页面的<script>标签里,或者你的入口文件最外层)定义回调函数 window.inflchallcb = function(response) { // 调用之前保存的success回调处理响应 if (window._inflchallcbSuccess) { window._inflchallcbSuccess(response); // 清理临时存储的回调,避免内存泄漏 delete window._inflchallcbSuccess; } }; // 修改你的Backbone sync方法 sync: function(method, model, options) { options.dataType = 'jsonp'; options.cache = true; options.jsonp = 'callback'; options.jsonpCallback = "inflchallcb"; // 把Backbone的success回调临时存到全局 window._inflchallcbSuccess = options.success; // 覆盖默认的success,防止jQuery重复处理 options.success = function() {}; return Backbone.sync(method, model, options); }
补充说明
你的jQuery 1.11.1和Backbone 1.3.3版本组合是完全兼容的,问题和版本无关,只是JSONP回调的配置逻辑错误导致的。优先使用第一种方案,除非后端有强制要求,否则不要手动指定回调名称。
内容的提问来源于stack exchange,提问作者SeeThruHead
相关产品推荐
相关产品推荐

