jQuery中getJSON跨域原理的深入讲解


Posted in jQuery onSeptember 02, 2020

前几天我在开发一个工具的时候,其中有个功能就是获取本页面的短网址。

这个想法是好的,可是在我付诸于行动的时候,发现这个需要跨域。

起初我的想法就是,跨域的最简单的方法就是增加一个script标签,因为script标签是允许跨域的。

但是问题又来了,对方的API返回的是个json对象,用script标签只能执行,却不能获取到里面的东西,也就是说返回的东西是不可控的。

随后我就想到了jQuery中的getJSON的方法,学习了一下,没想到里面的文章这么大。

jQuery非常聪明,他也意识到只靠script请求是无法接受到返回的东西的,所以他就设计了一个全局的callback函数,发送请求的时候把这个callback函数也传进去。

服务器判断是否有这个callback函数,如果没有就返回一个对象,如果有就返回一个函数名(对象)。

我们可以通过下面这个地址来看一下

http://to.ly/api.php?json=1&longurl=http%3A%2F%2Fwww.skiyo.cn

大家可以打开一下,结果返回的是一个json对象。

如果我加上callback参数

http://to.ly/api.php?json=1&longurl=http%3A%2F%2Fwww.skiyo.cn&callback=somefunc

大家可以看到返回的是

somefunc({“shorturl”: “http:\/\/to.ly\/3XHP”, “ok”: true})

传入的也正好是函数名。

这个想法很不错,缺点就是对方服务器必须是可控的。

大方向是这个的,但是还有一些细节的小技巧,比如说如何在匿名函数中设置一个全局函数,如何将这个全局函数变为匿名函数!

本来想直接把jQuery中的getJSON拿来直接用的,可是看了才知道,jQuery的ajax方法都混合到一起了,想剥落下来也不是一件容易的事。

庆幸的是我还懂一点JavaScript,经过我的加工与修改,下面的例子已经可以正常使用。详细的可以查看注释。

以下是代码片段:

(function() {
 var cross = {
 //设置一个随机的callback函数..防止跟其他的全局函数重名
 callback : 'cross' + parseInt(Math.random()*1000),
 init : function() {
 this.getJSON('http://to.ly/api.php?json=1&longurl='+encodeURIComponent('http://www.skiyo.cn/'), function(data){
 alert(data.shorturl);
 });
 },
 getJSON : function(url, callback) {
 var c = this.callback;
 url = url + "&callback=" + c;
 // Handle JSONP-style loading
 //将函数名设置为window的一个方法,这样此方法就是全局的了.
 window[ c ] = window[ c ] || function( data ) {
 //调用匿名函数
 callback(data);
 // Garbage collect
 window[ c ] = undefined;
 try {
  delete window[ c ];
 } catch(e) {}
 if ( head ) {
  head.removeChild( script );
 }
 };
 var head = document.getElementsByTagName("head")[0] || document.documentElement;
 var script = document.createElement("script");
 script.src = url;
 // Handle Script loading
 var done = false;
 // Attach handlers for all browsers
 script.onload = script.onreadystatechange = function() {
 if ( !done && (!this.readyState 
  this.readyState === "loaded" || this.readyState === "complete") ) {
  done = true;
  // Handle memory leak in IE
  script.onload = script.onreadystatechange = null;
  if ( head && script.parentNode ) {
  head.removeChild( script );
  }
 }
 };
 head.insertBefore( script, head.firstChild );
 },
 };
 //go
 cross.init();
})();

总结

到此这篇关于jQuery中getJSON跨域原理的文章就介绍到这了,更多相关jQuery getJSON跨域原理内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

jQuery 相关文章推荐
简单实现jQuery弹幕效果
May 06 jQuery
jQuery滚动插件scrollable.js用法分析
May 25 jQuery
jQuery.Ajax()的data参数类型详解
Jul 23 jQuery
jquery使用iscorll实现上拉、下拉加载刷新
Oct 26 jQuery
浅谈ajax在jquery中的请求和servlet中的响应
Jan 22 jQuery
JS/jQuery实现DIV延时几秒后消失或显示的方法
Feb 12 jQuery
jQuery实现的响应鼠标移动方向插件用法示例【附源码下载】
Aug 28 jQuery
jQuery实现表格的增、删、改操作示例
Jan 27 jQuery
详解jQuery如何实现模糊搜索
May 10 jQuery
JavaScript实现的滚动公告特效【基于jQuery】
Jul 10 jQuery
jQuery - AJAX load() 实例用法详解
Aug 27 jQuery
jquery轻量级数字动画插件countUp.js使用详解
Oct 17 jQuery
Jquery $.map使用方法实例详解
Sep 01 #jQuery
JQuery基于FormData异步提交数据文件
Sep 01 #jQuery
JQuery使用数组遍历跳出each循环
Sep 01 #jQuery
JS JQuery获取data-*属性值方法解析
Sep 01 #jQuery
jQuery实现动态加载瀑布流
Sep 01 #jQuery
js和jquery判断数据类型的4种方法总结
Aug 28 #jQuery
jQuery编写QQ简易聊天框
Aug 27 #jQuery
You might like
php获取ajax的headers方法与内容实例
2017/12/27 PHP
深入分析PHP设计模式
2020/06/15 PHP
Google韩国首页图标动画效果
2007/08/26 Javascript
jQuery入门第一课 jQuery选择符
2010/03/14 Javascript
给jQuery方法添加回调函数一款插件的应用
2013/01/21 Javascript
用js的for循环获取radio选中的值
2013/10/21 Javascript
使图片旋转的3种解决方案
2013/11/21 Javascript
js加入收藏以及使用Jquery更改透明度
2014/01/26 Javascript
javaScript如何处理从java后台返回的list
2014/04/24 Javascript
基于jQuery实现复选框的全选 全不选 反选功能
2014/11/24 Javascript
再谈JavaScript线程
2015/07/10 Javascript
JSONP和批量操作功能的实现方法
2016/08/21 Javascript
Vue中img的src属性绑定与static文件夹实例
2017/05/18 Javascript
ExtJs整合Echarts的示例代码
2018/02/27 Javascript
详解React项目的服务端渲染改造(koa2+webpack3.11)
2018/03/19 Javascript
使用ECharts实现状态区间图
2018/10/25 Javascript
vue.js多页面开发环境搭建过程
2019/04/24 Javascript
Async/Await替代Promise的6个理由
2019/06/15 Javascript
JS数组扁平化、去重、排序操作实例详解
2020/02/24 Javascript
JavaScript之scrollTop、scrollHeight、offsetTop、offsetHeight等属性学习笔记
2020/07/15 Javascript
解决vue中axios设置超时(超过5分钟)没反应的问题
2020/09/04 Javascript
antd form表单数据回显操作
2020/11/02 Javascript
[03:11]不朽宝藏三外观展示
2020/09/18 DOTA
Flask Web开发入门之文件上传(八)
2018/08/17 Python
解决pandas.DataFrame.fillna 填充Nan失败的问题
2018/11/06 Python
Django密码存储策略分析
2020/01/09 Python
新手学python应该下哪个版本
2020/06/11 Python
公认8个效率最高的爬虫框架
2020/07/28 Python
python wsgiref源码解析
2021/02/06 Python
Html5实现用户注册自动校验功能实例代码
2016/05/24 HTML / CSS
市场营销专业大学生职业生涯规划文
2014/03/06 职场文书
竞选演讲稿范文大全
2014/05/12 职场文书
暑假安全教育广播稿
2014/09/10 职场文书
2019自荐信该如何写呢?
2019/07/05 职场文书
小学语文的各类谚语(70首)
2019/08/15 职场文书
幼师必备:幼儿园期末教师评语50条
2019/11/01 职场文书