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插件FusionCharts实现的3D帕累托图效果示例【附demo源码】
Mar 25 jQuery
jQuery用noConflict代替$的实现方法
Apr 12 jQuery
jquery实现提示语淡入效果
May 05 jQuery
JQuery实现定时刷新功能代码
May 09 jQuery
jQuery获取table表中的td标签(实例讲解)
Jul 28 jQuery
jQuery实现广告条滚动效果
Aug 22 jQuery
JS和JQuery实现雪花飘落效果
Nov 30 jQuery
jQuery实现表单动态添加与删除数据操作示例
Jul 03 jQuery
使用jquery Ajax实现上传附件功能
Oct 23 jQuery
通过JQuery,JQueryUI和Jsplumb实现拖拽模块
Jun 18 jQuery
JS秒杀倒计时功能完整实例【使用jQuery3.1.1】
Sep 03 jQuery
jQuery实现form表单基于ajax无刷新提交方法实例代码
Nov 04 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
新安装的MySQL数据库需要注意的安全知识
2008/07/30 PHP
php 动态添加记录
2009/03/10 PHP
php查询mysql大量数据造成内存不足的解决方法
2015/03/04 PHP
php输出指定时间以前时间格式的方法
2015/03/21 PHP
PHP利用百度ai实现文本和图片审核
2019/05/08 PHP
PHP读取Excel内的图片(phpspreadsheet和PHPExcel扩展库)
2019/11/19 PHP
工作中常用到的JS表单验证代码(包括例子)
2010/11/11 Javascript
JavaScript/Js脚本处理html元素的自定义属性解析(亲测兼容Firefox与IE)
2013/11/25 Javascript
jquery实现的一个简单进度条效果实例
2014/05/12 Javascript
javascript强制点击广告的方法
2015/02/06 Javascript
JS实现5秒钟自动封锁div层的方法
2015/02/20 Javascript
JS+CSS实现自动改变切换方向图片幻灯切换效果的方法
2015/03/02 Javascript
微信QQ的二维码登录原理js代码解析
2016/06/23 Javascript
JS 调试中常见的报错问题解决方法
2017/05/20 Javascript
JS判断一个数是否是水仙花数
2017/06/11 Javascript
JS实现动态生成html table表格的方法分析
2018/07/11 Javascript
vue中filters 传入两个参数 / 使用两个filters的实现方法
2019/07/15 Javascript
vue+element树组件 实现树懒加载的过程详解
2019/10/21 Javascript
javascript设计模式 ? 状态模式原理与用法实例分析
2020/04/22 Javascript
Element PageHeader页头的使用方法
2020/07/26 Javascript
vant自定义二级菜单操作
2020/11/02 Javascript
详解Python操作RabbitMQ服务器消息队列的远程结果返回
2016/06/30 Python
python pexpect ssh 远程登录服务器的方法
2019/02/14 Python
pytorch中的embedding词向量的使用方法
2019/08/18 Python
python如何求数组连续最大和的示例代码
2020/02/04 Python
python图片指定区域替换img.paste函数的使用
2020/04/09 Python
Python爬虫新手入门之初学lxml库
2020/12/20 Python
FILA斐乐中国官方商城:意大利运动品牌
2017/01/25 全球购物
英国门销售网站:Green Tree Doors
2020/01/07 全球购物
毕业生的求职信范文分享
2013/12/04 职场文书
建议书标准格式
2014/03/12 职场文书
缅怀革命先烈演讲稿
2014/05/14 职场文书
酒店服务员岗位职责
2015/02/09 职场文书
六一儿童节致辞稿(3篇)
2019/07/11 职场文书
nginx处理http请求实现过程解析
2021/03/31 Servers
win10壁纸在哪个文件夹 win10桌面背景图片文件位置分享
2022/08/05 数码科技