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 05 jQuery
jQuery Validate 无法验证 chosen-select元素的解决方法
May 17 jQuery
jquery仿京东商品放大浏览页面
Jun 06 jQuery
基于jquery实现五星好评
Nov 18 jQuery
jQuery中复合选择器简单用法示例
Mar 31 jQuery
jQuery实现遍历XML节点和属性的方法示例
Apr 29 jQuery
jQuery插件jsonview展示json数据
May 26 jQuery
jquery实现动态改变css样式的方法分析
May 27 jQuery
jquery+ajax实现上传图片并显示上传进度功能【附php后台接收】
Jun 06 jQuery
jquery实现下载图片功能
Jul 18 jQuery
Jquery异步上传文件代码实例
Nov 13 jQuery
jquery实现聊天机器人
Feb 08 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
Views rows style模板重写代码
2011/05/16 PHP
深入解析PHP中逗号与点号的区别
2013/08/05 PHP
php时区转换转换函数
2014/01/07 PHP
Codeigniter实现处理用户登录验证后的URL跳转
2014/06/12 PHP
ThinkPHP基于PHPExcel导入Excel文件的方法
2014/10/15 PHP
PHP写日志的实现方法
2014/11/05 PHP
php使用指定编码导出mysql数据到csv文件的方法
2015/03/31 PHP
Zend Framework教程之Application和Bootstrap用法详解
2016/03/10 PHP
javascript的函数
2007/01/31 Javascript
js操作二级联动实现代码
2010/07/27 Javascript
javascript学习基础笔记之DOM对象操作
2011/11/03 Javascript
flash调用js中的方法,让js传递变量给flash的办法及思路
2013/08/07 Javascript
Extjs3.0 checkboxGroup 动态添加item实现思路
2013/08/14 Javascript
jQuery调用RESTful WCF示例代码(GET方法/POST方法)
2014/01/26 Javascript
深入理解JavaScript系列(21):S.O.L.I.D五大原则之接口隔离原则ISP详解
2015/03/05 Javascript
javascript框架设计之类工厂
2015/06/23 Javascript
Vue2实现组件props双向绑定
2016/12/02 Javascript
使用jQuery ajaxupload插件实现无刷新上传文件
2017/04/23 jQuery
jQuery ajax读取本地json文件的实例
2017/10/31 jQuery
mongoose更新对象的两种方法示例比较
2017/12/19 Javascript
vue axios请求频繁时取消上一次请求的方法
2018/11/10 Javascript
JS实现省市县三级下拉联动
2020/04/10 Javascript
vue解决跨域问题(推荐)
2020/11/10 Javascript
[01:59]DOTA2首部纪录片《Free to play》预告片
2014/03/12 DOTA
python在命令行下使用google翻译(带语音)
2014/01/16 Python
Python中使用装饰器和元编程实现结构体类实例
2015/01/28 Python
Python Queue模块详细介绍及实例
2016/12/27 Python
解析Python中的eval()、exec()及其相关函数
2017/12/20 Python
解决pycharm无法识别本地site-packages的问题
2018/10/13 Python
python字典排序的方法
2019/10/12 Python
Python代码块及缓存机制原理详解
2019/12/13 Python
python爬虫学习笔记之pyquery模块基本用法详解
2020/04/09 Python
Pycharm plot独立窗口显示的操作
2020/12/11 Python
协会周年庆活动方案
2014/08/26 职场文书
推广普通话主题班会
2015/08/17 职场文书
mysql如何查询连续记录
2022/05/11 MySQL