跨域JSONP实质与JavaScript实现

跨域JSONP实质与JavaScript实现

实质

利用script标签的src属性(浏览器允许script标签跨域),通过动态创建一个script标签,指定src属性为跨域的api,那么html会把返回的字符创当作javascript代码来进行解析,如果我们在返回的字符串中使用自定义函数形式包装起来,然后在html中调用自定义函数,即可拿到返回的字符串。

jQuery 使用

jQuery.getJSON 官方文档

原生js实现

getJSONP

【实现】

var getJSONP = function(url, callback) {
  //动态生成回调函数名并定义回调函数
  var cbname = 'jsonp' + (new Date()).getTime();
  window[cbname] = function(response) {
    try {
      callback(response); //处理响应 
    } finally {//清理工作
      delete window[cbname];
      script.parentNode.removeChild(script);
    }
  }
  //动态添加script
  var script = document.createElement("script");
  script.src = url + cbname;
  document.body.appendChild(script);
  //请求成功
  script.onload = script.onreadystatechange = function() {
    if (!this.readyState || this.readyState === "loaded" || this.readyState === "complete") {
      alert('Loading successful');
      script.onload = script.onreadystatechange = null;
    }
  }
  //请求失败;IE 低版本不支持onerror,并且在加载失败时执行成功事件。
  script.onerror = function() {
    alert("Loading failed");
  }
}

【使用】

var url = "http://127.0.0.1:9999/jsonp";
getJSONP(url + "?callback=", function(data) {//这里需要跟服务端协调好名字 比如callback或者jsoncallback等等
  alert(data);
});

拓展

如果想全部浏览器兼容的话,在条件允许的情况下可以参考

How to trigger script.onerror in Internet Explorer?--stackoverflow

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容