利用jquery 的jsonp 进行跨域访问

来源:互联网 发布:微信js接口文档 编辑:程序博客网 时间:2024/06/10 00:56

  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
原创粉丝点击