闂鎻忚堪
銆銆鍦╦query鎴杬epto涓嬶紝寰幆璋冪敤鍚屼竴涓猨sonp
銆銆
for(var i = 0;i<5;i++){
$.ajax({
url:'https://m.suning.com/authStatus?callback=checkLogin1&_=1430100870770',
dataType:'jsonp',
jsonpCallback:'checkLogin1',
success:function(data){
console.info('success');
},
error:function(xhr,e){
console.error(e);
}
});
}
銆銆緇撴灉
銆銆鏈変簺鎴愬姛鏈変簺澶辮觸浜嗭紵榪欐槸涓轟綍錛?/p>
闂瑙i噴
銆銆瑙傚療jsonp鐨勬簮鐮?/p>
銆銆
/**
* jsonp璇鋒眰
* @param options
* @param deferred
* @returns {*}
*/ $.ajaxJSONP = function(options, deferred){
//鏈緗畉ype錛屽氨璧? ajax 璁╁弬鏁板垵濮嬪寲.
//濡傜洿鎺ヨ皟鐢╝jaxJSONP錛宼ype鏈緗?/span> if (!('type' in options)) return $.ajax(options)
var _callbackName = options.jsonpCallback, //鍥炶皟鍑芥暟鍚?/span> callbackName = ($.isFunction(_callbackName) ? _callbackName() : _callbackName) || ('jsonp' + (++jsonpID)), //娌℃湁鍥炶皟錛岃祴榛樿鍥炶皟 script = document.createElement('script'),
originalCallback = window[callbackName], //鍥炶皟鍑芥暟 responseData,
//涓柇璇鋒眰錛屾姏鍑篹rror浜嬩歡
//榪欓噷涓嶄竴瀹氳兘涓柇script鐨勫姞杞斤紝浣嗗湪涓嬮潰闃繪鍥炶皟鍑芥暟鐨勬墽琛?/span> abort = function(errorType) {
$(script).triggerHandler('error', errorType || 'abort')
},
xhr = { abort: abort }, abortTimeout
//xhr涓哄彧璇籨eferred if (deferred) deferred.promise(xhr)
//鐩戝惉鍔犺澆瀹岋紝鍔犺澆鍑洪敊浜嬩歡 $(script).on('load error', function(e, errorType){
//娓呴櫎瓚呮椂璁劇疆timeout clearTimeout(abortTimeout)
//鍒犻櫎鍔犺澆鐢ㄧ殑script銆傚洜涓哄凡鍔犺澆瀹屼簡 $(script).off().remove()
//閿欒璋冪敤error if (e.type == 'error' || !responseData) {
ajaxError(null, errorType || 'error', xhr, options, deferred)
} else {
//鎴愬姛璋冪敤success ajaxSuccess(responseData[0], xhr, options, deferred)
}
//鍥炶皟鍑芥暟 window[callbackName] = originalCallback
if (responseData && $.isFunction(originalCallback))
originalCallback(responseData[0])
//娓呯┖闂寘寮曠敤鐨勫彉閲忓鹼紝涓嶆竻絀猴紝闇闂寘閲婃斁錛岀埗鍑芥暟鎵嶈兘閲婃斁銆傛竻絀猴紝鐖跺嚱鏁板彲浠ョ洿鎺ラ噴鏀?/span> originalCallback = responseData = undefined
})
if (ajaxBeforeSend(xhr, options) === false) {
abort('abort')
return xhr
}
//鍥炶皟鍑芥暟璁劇疆錛岀粰鍚庡彴鎵ц window[callbackName] = function(){
/* console.info('callbackName arguments ');
console.info(arguments[0]);*/ responseData = arguments
/*console.info('responseData ');
console.info(responseData);*/ } //鍥炶皟鍑芥暟榪藉姞鍒拌姹傚湴鍧 script.src = options.url.replace(/\?(.+)=\?/, '?$1=' + callbackName)
document.head.appendChild(script)
//瓚呮椂澶勭悊錛岄氳繃setTimeout寤舵椂澶勭悊 if (options.timeout > 0) abortTimeout = setTimeout(function(){
abort('timeout')
}, options.timeout)
return xhr
}
銆銆闂鍑哄湪澶氱嚎紼嬪鐞嗐?nbsp;褰撶涓涓猨sonp鍒氭墽琛屽畬callback錛岃祴浜嗗兼椂錛屾鏃訛紝script鐨刲oad浜嬩歡榪樻湭瑙﹀彂銆傜浜屼釜JSONP寮濮嬪垵濮嬪寲銆傜劧鍚庣涓涓猻cript鐨刲oad寮濮嬫墽琛岋紝浣嗗畠鐨勬暟鎹凡琚竻鎺変簡
絎竴涓猨sonp鍒氭墽琛屽畬callback錛屽搷搴旀暟鎹祴緇欎簡 responseData
銆銆
//鍥炶皟鍑芥暟璁劇疆錛岀粰鍚庡彴鎵ц window[callbackName] = function(){
/* console.info('callbackName arguments ');
console.info(arguments[0]);*/ responseData = arguments
/*console.info('responseData ');
console.info(responseData);*/ }
絎簩涓狫SONP寮濮嬪垵濮嬪寲銆傛病閿?nbsp; responseData鍙堣璧嬩負(fù)undefine錛侊紒錛?/p>
銆銆
絎竴涓猻cript鐨刲oad寮濮嬫墽琛岋紝responseData榪欐椂鍒ゆ柇緇濆涓簎ndefined錛屼負(fù)姣涳紵鍥犱負(fù)榪欐槸闂寘錛屽紩鐢ㄦ渶鍚庝竴涓猺esponseData鐨勫箋傚彧鑳借繘鍏rror浜嗐?/p>
闂淇
銆銆絳栫暐錛?nbsp;
銆銆1錛?淇敼jsonp婧愮爜銆傚湪鎵цcallback鏃訛紝灝唕esponseData錛屼紶鍏ョ洃鍚嚱鏁般傝濡俧unction(data){ return function( ...onload... }(responseData)錛涜繖涓お楹葷儲錛岃屼笖榪樺緱娉ㄦ剰寮婧愬崗璁?/p>
銆銆2錛岃閬縥sonp鐨勫搷搴斻傛敼鎴愯繖鏍蜂竴縐嶅啓娉曘傚師鐞嗘槸錛屽彧鐢╦sonp鍙戣姹傦紝鐒跺悗鍚庡彴鎵цwindow.callback銆?/p>
window.checkLogin1 = function(data){
console.info('checkLogin1 success');
console.info(data);
}
for(var i = 0;i<5;i++){
$.ajax({
url:'https://m.suning.com/authStatus?callback=checkLogin1&_=1430100870770',
dataType:'jsonp' }); }
銆銆鍒囪涓嶈兘鍔?jsonpCallback錛?#8216;checkLogin1’.鍘熷洜鏄紝jsonp浼?xì)閲嶅啓window[checkLogin1].絎簩嬈¤姹傚皢鎵句笉鍒般?/p>