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用noConflict代替$的实现方法
Apr 12 jQuery
jquery dataTable 后台加载数据并分页实例代码
Jun 07 jQuery
jQuery复合事件用法示例
Jun 10 jQuery
jQuery实现 RadioButton做必选校验功能
Jun 15 jQuery
利用jquery去掉时光轴头尾部线条的方法实例
Jun 16 jQuery
jquery实现倒计时小应用
Sep 19 jQuery
jQuery ajax调用webservice注意事项
Oct 08 jQuery
jQuery实现的鼠标滚轮控制图片缩放功能实例
Oct 14 jQuery
jQuery niceScroll滚动条错位问题的解决方法
Feb 03 jQuery
jQuery使用bind动态绑定事件无效的处理方法
Dec 11 jQuery
Javascript和jquery在selenium的使用过程
Oct 31 jQuery
jQuery操作事件完整实例分析
Jan 10 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的Reflection反射机制
2014/08/05 PHP
谈谈 PHP7新增功能
2015/12/16 PHP
User Scripts: Video Download by User Scripts
2007/05/14 Javascript
JQuery 技巧和窍门整理(8个)
2010/04/22 Javascript
js Html结构转字符串形式显示代码
2011/11/15 Javascript
JS获取单击按钮单元格所在行的信息
2014/06/17 Javascript
javascript 使用for循环时该注意的问题-附问题总结
2015/08/19 Javascript
深入探讨前端框架react
2015/12/09 Javascript
基于javascript实现文字无缝滚动效果
2016/03/22 Javascript
jQuery动态增减行的实例代码解析(推荐)
2016/12/05 Javascript
Vue学习笔记进阶篇之vue-router安装及使用方法
2017/07/19 Javascript
浅谈Node.js ORM框架Sequlize之表间关系
2017/07/24 Javascript
javascript填充默认头像方法
2018/02/22 Javascript
bootstrap table实现合并单元格效果
2018/12/24 Javascript
javascript canvas API内容整理
2020/02/16 Javascript
JS实现手风琴特效
2020/11/08 Javascript
在vue中动态修改css其中一个属性值操作
2020/12/07 Vue.js
[48:51]完美世界DOTA2联赛PWL S2 Magma vs InkIce 第一场 11.28
2020/12/02 DOTA
python批量提取word内信息
2015/08/09 Python
详解python的ORM中Pony用法
2018/02/09 Python
详解Numpy中的广播原则/机制
2018/09/20 Python
使用python动态生成波形曲线的实现
2019/12/04 Python
Pytorch 搭建分类回归神经网络并用GPU进行加速的例子
2020/01/09 Python
Django 项目布局方法(值得推荐)
2020/03/22 Python
jupyter notebook清除输出方式
2020/04/10 Python
Dockers美国官方网站:卡其裤、男士服装、鞋及配件
2016/11/22 全球购物
戴森台湾线上商城:Dyson Taiwan
2018/05/21 全球购物
应届生人事助理求职信
2013/11/09 职场文书
保洁主管岗位职责
2013/11/20 职场文书
四年级评语大全
2014/04/21 职场文书
委托证明模板
2014/09/16 职场文书
办公室领导干部作风整顿个人整改措施
2014/09/17 职场文书
夫妻分居协议书范文
2014/11/26 职场文书
上市公司财务总监岗位职责
2015/04/03 职场文书
奠基仪式致辞
2015/07/30 职场文书
i7 6700处理器相当于i5几代
2022/04/19 数码科技