我已经找到了解决办法得到一个错误回调与跨域请求空的响应。
在这个例子中,我使用Zepto,一个轻量级的jQuery,但我认为这在jQuery中也能正常工作。
首先,您必须使用这些参数做一个跨域请求:
$.ajax({
url: url,
type: 'GET',
dataType: 'jsonp',
contentType: 'application/x-javascript',
crossDomain: true,
success: function (data, status) { /* ... */ }
error: function() { /* ... */ }
// ...
现在,国内的$就功能使用$ .ajaxJSONP的跨域请求。这是原来的Zepto $ .ajaxJSONP功能:
$.ajaxJSONP = function(options){
var callbackName = 'jsonp' + (++jsonpID),
script = document.createElement('script'),
abort = function(){
$(script).remove()
if (callbackName in window) window[callbackName] = empty
ajaxComplete('abort', xhr, options)
},
xhr = { abort: abort }, abortTimeout
if (options.error) script.onerror = function() {
xhr.abort()
options.error()
}
window[callbackName] = function(data){
clearTimeout(abortTimeout)
$(script).remove()
delete window[callbackName]
ajaxSuccess(data, xhr, options)
}
serializeData(options)
script.src = options.url.replace(/=\?/, '=' + callbackName)
$('head').append(script)
if (options.timeout > 0) abortTimeout = setTimeout(function(){
xhr.abort()
ajaxComplete('timeout', xhr, options)
}, options.timeout)
return xhr
}
我的解决方法是非常简单,包括在某个区间呼吁script.onload事件处理程序几次,以验证回调函数被调用。
这是我的版本的$ .ajaxJSONP功能:
$.ajaxJSONP = function(options){
var called = false, // Flag to check that callback was called
callbackName = 'jsonp' + (++jsonpID),
script = document.createElement('script'),
abort = function(){
$(script).remove()
if (callbackName in window) window[callbackName] = empty
ajaxComplete('abort', xhr, options)
},
xhr = { abort: abort }, abortTimeout
if (options.error) {
script.onerror = function() {
xhr.abort()
options.error()
};
// IMPORTANT!!!
script.onload = function() {
var times = 0;
var interval = setInterval(function() {
// After 5 intervals, if the callback wasn't called, returns an error
if (times++ == 5) {
clearInterval(interval);
if (!called) {
options.error();
}
} else if (called) {
clearInterval(interval);
}
}, 100);
};
}
window[callbackName] = function(data){
// Setting the "called" flag to true
called = true;
clearTimeout(abortTimeout)
$(script).remove()
delete window[callbackName]
ajaxSuccess(data, xhr, options)
}
serializeData(options)
script.src = options.url.replace(/=\?/, '=' + callbackName)
$('head').append(script)
if (options.timeout > 0) abortTimeout = setTimeout(function(){
xhr.abort()
ajaxComplete('timeout', xhr, options)
}, options.timeout)
return xhr
}
注意:如果你有兴趣在服务器端的行为,请参阅本教程的开头:http://phonegap.com/2011/07/20/making-jsonp-calls-with-zepto-on-android-device/
可以不要确定OP正在进行跨域呼叫。而且跨域调用通常会引发异常。 – anirvan 2010-11-28 17:46:17