- ;(function(){
- varformatParams=function(data){//格式化参数
- vararr=[];
- for(varnameindata){
- arr.push(encodeURIComponent(name)+'='+encodeURIComponent(data[name]));
- }
- returnarr.join('&');
- }
- varjsonp=function(options){
- options=options||{};
- if(!options.url||!options.callback){
- thrownewError("参数不合法");
- }
- //创建script标签并加入到页面中
- varcallbackName=('jsonp_'+Math.random()).replace(".","");
- varoHead=document.getElementsByTagName('head')[0];
- varparams="";
- if(options.data){
- options.data[options.callback]=callbackName;
- params+=formatParams(options.data);
- }else{
- params+=options.callback+"="+callbackName;
- }
- varoS=document.createElement('script');
- oHead.appendChild(oS);
- //创建jsonp回调函数
- window[callbackName]=function(json){
- oHead.removeChild(oS);
- clearTimeout(oS.timer);
- window[callbackName]=null;
- options.success&&options.success(json);
- };
- //发送请求
- oS.src=options.url+'?'+params;
- //超时处理
- if(options.time){
- oS.timer=setTimeout(function(){
- window[callbackName]=null;
- oHead.removeChild(oS);
- options.fail&&options.fail({message:"超时"});
- },options.time);
- }
- };
- window.jsonp=jsonp;
- })();
- //调用方法
- /*jsonp({
- url:"http://www.baidu.com",callback:"callback",//跟后台协商的接收回调名
- data:{id:"1000120"},success:function(json){
- alert("jsonp_ok");
- },fail:function(){
- alert("fail");
- },time:10000
- })*/
原文链接:http://www.html-js.com/article/JavaScript-based-implementation-of-AJAX-JSONP-and-native-JS-DOM-finishes-loading-events