完美解决javascript中jsonp跨域请求无法触发error 方法的触发的方案(兼容ie6+)

  1. 对于ie6-ie8和oprea是不支持onerror事件的,对于不支持这个事件的可以用另外方式解决这个问题。

  2. jsonp回调函数总是在script的onload事件之前被调用的。利用这个机制可以解决问题1的问题。


代码实现

function getJSONByScript(url,jsonpCallName,charset,success,error){
    var script = document.createElement('script');
    var head = document.head || document.getElementsByTagName('head')[0] || document.documentElement;
    
    script.src = url;
    
    script.async = true;
    
    script.charest = charest;
    
    // 回调执行的方法。
    this[jsonpCallName] = function(data){
        //
        script.jsonp = 'loaded';
        success && success(data);
    }
    
    script.onload = script.onreadystatechange = function(){
        if(/onload|complete|undefined/.test(script.readyState) || (window.opera || -[1,])){
            if(typeof script.jsonp === 'undefined'){
                error && error();
            }
            
            if(script.clearAttributes){
                script.clearAtrributes();
            }
             script.onload = script.onreadystatechange = null;
             
             if(script.parentNode){
                 script.parentNode.removeChild(script);
             }
            
            script = null;
            
            delete window[jsonpCallName];
        }
    
    }
    
    // 高级浏览器支持的方法。
    script.onerror = function(){
        if(script.clearAttributes){
                script.clearAtrributes();
          }
          
         script.onerror = script.onload = script.onreadystatechange = null;
                     
          if(script.parentNode){
                script.parentNode.removeChild(script);
           }
            
          script = null;
          
          error && error();
        
        delete window[jsonpCallName];
    }
}


ps: 对于 jquery 是没有实现 jsonp 请求的error方法的,angular 是实现了这个方法的实现,

代码如下:

152853_fzNK_1037170.png

152854_tGSr_1037170.png


转载于:https://my.oschina.net/bosscheng/blog/497150

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值