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中map函数的两种方式
Apr 07 jQuery
jQuery实现的简单在线计算器功能
May 11 jQuery
jQuery实现 RadioButton做必选校验功能
Jun 15 jQuery
jQuery简介_动力节点Java学院整理
Jul 04 jQuery
jQuery制作input提示内容(兼容IE8以上)
Jul 05 jQuery
jQuery实现键盘回车搜索功能
Jul 25 jQuery
JQuery用$.ajax或$.getJSON跨域获取JSON数据的实现代码
Sep 23 jQuery
使用jQuery 操作table 完成单元格合并的实例
Dec 27 jQuery
JS文件中加载jquery.js的实例代码
May 05 jQuery
jQuery实现获取选中复选框的值实例详解
Jun 28 jQuery
jquery实现联想词搜索框和搜索结果分页的示例
Oct 10 jQuery
jQuery使用bind动态绑定事件无效的处理方法
Dec 11 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
模拟flock实现文件锁定
2007/02/14 PHP
php IP转换整形(ip2long)的详解
2013/06/06 PHP
php实现有趣的人品测试程序实例
2015/06/08 PHP
php中__toString()方法用法示例
2016/12/07 PHP
JavaScript 嵌套函数指向this对象错误的解决方法
2010/03/15 Javascript
JS获取鼠标坐标的实例方法
2013/07/18 Javascript
jquery form 隐藏的input 选择
2014/04/29 Javascript
jquery+html5烂漫爱心表白动画代码分享
2015/08/24 Javascript
AngularJs ng-route路由详解及实例代码
2016/09/14 Javascript
javascript入门之数组[新手必看]
2016/11/21 Javascript
canvas实现图像布局填充功能
2017/02/06 Javascript
BootStrap表单控件之复选框checkbox和单选择按钮radio
2017/05/23 Javascript
简单实现js进度条加载效果
2020/03/25 Javascript
Angular简单验证功能示例
2017/12/22 Javascript
微信小程序实现授权登录
2019/05/15 Javascript
antd vue table跨行合并单元格,并且自定义内容实例
2020/10/28 Javascript
[01:43]深扒TI7聊天轮盘语音出处4
2017/05/11 DOTA
[59:32]Liquid vs Fnatic 2019国际邀请赛淘汰赛败者组BO1 8.20.mp4
2020/07/19 DOTA
Python将xml和xsl转换为html的方法
2015/03/10 Python
python对Excel按条件进行内容补充(推荐)
2019/11/24 Python
Python pip配置国内源的方法
2020/02/14 Python
美国大尺码女装零售商:TORRID
2016/10/01 全球购物
美国现代家具网站:Design Within Reach
2018/07/19 全球购物
美工的岗位职责
2013/11/14 职场文书
英文求职信写作小建议
2014/02/16 职场文书
护士个人自我鉴定
2014/03/24 职场文书
白血病捐款倡议书
2014/05/14 职场文书
扶贫办主任查摆“四风”问题个人对照检查材料思想汇报
2014/10/02 职场文书
2014年保险公司工作总结
2014/11/22 职场文书
高校教师个人工作总结2014
2014/12/17 职场文书
2015年国际护士节演讲稿
2015/03/18 职场文书
安全教育的主题班会
2015/08/13 职场文书
python使用matplotlib绘制图片时x轴的刻度处理
2021/08/30 Python
php访问对象中的成员的实例方法
2021/11/17 PHP
php png失真的原因及解决办法
2021/11/17 PHP
MySQL transaction事务安全示例讲解
2022/06/21 MySQL