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 相关文章推荐
推荐三款日期选择插件(My97DatePicker、jquery.datepicker、Mobiscroll)
Apr 21 jQuery
jQuery表单验证之密码确认
May 22 jQuery
jQuery用户头像裁剪插件cropbox.js使用详解
Jun 07 jQuery
jQuery实现简单的手风琴效果
Apr 17 jQuery
JQuery 获取多个select标签option的text内容(实例)
Sep 07 jQuery
通过jquery toggleClass()属性制作文章段落更改背景颜色
May 21 jQuery
JQuery判断radio单选框是否选中并获取值的方法
Jan 17 jQuery
jQuery实现为table表格动态添加或删除tr功能示例
Feb 19 jQuery
jQuery Migrate 插件用法实例详解
May 22 jQuery
jQuery实现聊天对话框
Feb 08 jQuery
jQuery 选择方法及$(this)用法实例分析
May 19 jQuery
jQuery实现图片切换效果
Oct 19 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 Class SoapClient not found解决方法
2018/01/20 PHP
详细解读php的命名空间(一)
2018/02/21 PHP
php设计模式之观察者模式实例详解【星际争霸游戏案例】
2020/03/30 PHP
js防止表单重复提交实现代码
2012/09/05 Javascript
jquery检测input checked 控件是否被选中的方法
2014/03/26 Javascript
js使用html()或text()方法获取设置p标签的显示的值
2014/08/01 Javascript
JS实现带提示的星级评分效果完整实例
2015/10/30 Javascript
快速解决js中window.location.href不工作的问题
2016/11/02 Javascript
详解JavaScript常量定义
2017/01/03 Javascript
微信小程序异步处理详解
2017/11/10 Javascript
webpack external模块的具体使用
2018/03/10 Javascript
Vue进度条progressbar组件功能
2018/04/17 Javascript
小程序关于请求同步的总结
2019/05/05 Javascript
JS面向对象编程基础篇(二) 封装操作实例详解
2020/03/03 Javascript
Vue与React的区别和优势对比
2020/12/18 Vue.js
Webpack3+React16代码分割的实现
2021/03/03 Javascript
[00:36]DOTA2上海特级锦标赛 Alliance战队宣传片
2016/03/04 DOTA
Scrapy爬虫实例讲解_校花网
2017/10/23 Python
Python+matplotlib实现计算两个信号的交叉谱密度实例
2018/01/08 Python
python安装virtualenv虚拟环境步骤图文详解
2019/09/18 Python
canvas生成带二维码海报的踩坑记录
2019/09/11 HTML / CSS
美国在线艺术商店:HandmadePiece
2020/11/06 全球购物
应聘美工求职信
2013/11/07 职场文书
新闻专业个人求职信
2013/12/19 职场文书
总经理任命书
2014/03/29 职场文书
员工试用期考核自我鉴定
2014/04/13 职场文书
党支部换届选举方案
2014/05/08 职场文书
生物学专业求职信
2014/07/23 职场文书
2014年世界艾滋病日宣传活动总结
2014/11/18 职场文书
2014年实习生工作总结
2014/11/27 职场文书
房屋产权证明书
2015/06/19 职场文书
2019年度行政文员工作计划范本!
2019/07/04 职场文书
pytorch Dropout过拟合的操作
2021/05/27 Python
一篇带你入门Java垃圾回收器
2021/06/16 Java/Android
css3 选择器
2022/05/11 HTML / CSS
win sever 2022如何占用操作主机角色
2022/06/25 Servers