利用jquery 的jsonp 进行跨域访问


  var ajaxTimeout = $.ajax({
 url:'http://*******',  //请求的URL
 timeout : 4000, //超时时间设置,单位毫秒
    contentType : 'text/html',
    //async: false,             //jsonp 不能同步
    type : 'get',  //请求方式,get或post

    data : 'aaaaa',  //请求所传参数,   

    cache: false,

    dataType : "jsonp",
    jsonp: "callbackparam",//传递给请求处理程序或页面的,用以获得jsonp回调函数名的参数名(默认为:callback)
    jsonpCallback:"jsonpCallback",//自定义的jsonp回调函数名称,默认为jQuery自动生成的随机函数名

 success:function(data){ //请求成功的回调函数
          dosomething
  },
    error:function (data, status, e){   
         dosomething
    },
 complete : function(XMLHttpRequest,status){ //请求完成后最终执行参数
    if(status=='timeout'){//超时,status还有success,error等值的情况
        ajaxTimeout .abort();
       alert("超时");
    }
 }

  });


服务器返回的数据必须是:  jsonpCallback([  {"isSuccess":"0"  ]);  这样的格式,

        这么理解这个呢, 其实就是如有一个 function jsonpCallback(data){.........}, 那么   jsonpCallback([  {"isSuccess":"0"  ]); 就是调用这个function!


说到原理, 就是利用script标签能跨域执行脚本的功能, 并且执行后返回的脚本是一个能执行的js 脚本, 你可以利用返回结果, 拼装自己需要的脚本!


这里说一下一些问题:

1. 最大的问题, 整个请问只能是异步的, 无法完成同步, 导致会出现一些 parsererror, 如果服务返回时间长, 这个问题就很频繁的, 这个目前无法解决!

    经过长时间的测试, 我发现即使出现pasererror 错误触发了error 方法, 但是最终服务返回后, 还是会执行success 方法的, 所以在服务结果满足需求的情况下, 可以把parsererror 错误忽略!

     所以error 方法可以处理成

      if(status!='parsererror'){  //parsererror 这种错误是因为异步造成的,但是最终还是能success 的,所以忽略次错误!
         dosomething
       }

2. 也可以自定义jsonpCallback 方法, 把结果返回到一个元素中,  然后用另外的方法定时去访问这个元素, 如果该元素存在数据, 证明访问完成!

    但是这样做的问题是, 如果存在服务失败和超时的话, 这些都无法被获取和处理!

3.  还有一种方法是用 

     setTimeout(function(){
        dosomething;   //所有后续操作都放到setTimeout 里面, 因为js 是单线程的, 没有sleep 和延迟功能, 最麻烦是没有exit 功能

        根据实际情况提交或退回; // 针对我的实际情况是表单提交

     }, 2000);

    return false;   // 针对我的实际情况是表单提交,






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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值