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 相关文章推荐
原生Aajax 和jQuery Ajax 写法个人总结
Mar 24 jQuery
jquery.form.js异步提交表单详解
Apr 25 jQuery
jQuery实现多张图片上传预览(不经过后端处理)
Apr 29 jQuery
jQuery回调方法使用示例
Jun 26 jQuery
基于jQuery封装的分页组件
Jun 26 jQuery
jQuery响应滚动条事件功能示例
Oct 14 jQuery
jquery学习笔记之无new构建详解
Dec 07 jQuery
jQuery实现判断上传图片类型和大小的方法示例
Apr 11 jQuery
jquery实现动态创建form并提交的方法示例
May 27 jQuery
layui+jquery支持IE8的表格分页方法
Sep 28 jQuery
jquery 键盘事件 keypress() keydown() keyup()用法总结
Oct 23 jQuery
如何使用jQuery操作Cookies方法解析
Sep 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
让这部DC动画新作刷新你的认知
2020/03/03 欧美动漫
网友原创的PHP模板类代码
2008/09/07 PHP
PHP中冒号、endif、endwhile、endfor使用介绍
2010/04/28 PHP
PHP中删除变量时unset()和null的区别分析
2011/01/27 PHP
如何使用Linux的Crontab定时执行PHP脚本的方法
2011/12/19 PHP
php长字符串定义方法
2012/07/12 PHP
解析PHP无限级分类方法及代码
2013/06/21 PHP
php数组编码转换示例详解
2014/03/11 PHP
php打印一个边长为N的实心和空心菱型的方法
2015/03/02 PHP
浅谈PHP接收POST数据方式
2015/06/05 PHP
Laravel数据库读写分离配置的方法
2019/10/13 PHP
PHP接口类(interface)的定义、特点和应用示例
2020/05/18 PHP
在图片上显示左右箭头类似翻页的代码
2013/03/04 Javascript
兼容IE和FF的图片上传前预览js代码
2013/05/28 Javascript
利用js(jquery)操作Cookie的方法说明
2013/12/19 Javascript
Jquery的Tabs内容轮换效果实现代码,几行搞定
2014/02/12 Javascript
JS实现判断碰撞的方法
2015/02/11 Javascript
简单实现js上传文件功能
2017/08/21 Javascript
微信小程使用swiper组件实现图片轮播切换显示功能【附源码下载】
2017/12/12 Javascript
JS+CSS实现滚动数字时钟效果
2017/12/25 Javascript
vant-ui AddressEdit地址编辑和van-area的用法说明
2020/11/03 Javascript
python处理json数据中的中文
2014/03/06 Python
Django中更新多个对象数据与删除对象的方法
2015/07/17 Python
详解在Python程序中解析并修改XML内容的方法
2015/11/16 Python
Python中 map()函数的用法详解
2018/07/10 Python
python画柱状图--不同颜色并显示数值的方法
2018/12/13 Python
Python逐行读取文件中内容的简单方法
2019/02/26 Python
python numpy实现文件存取的示例代码
2019/05/26 Python
Python文件读写w+和r+区别解析
2020/03/26 Python
Python filter过滤器原理及实例应用
2020/08/18 Python
美国知名运动产品零售商:Foot Locker
2016/07/23 全球购物
瑞士香水购物网站:Parfumcity.ch
2017/01/14 全球购物
2014年教学工作总结
2014/11/13 职场文书
2015年业务工作总结范文
2015/04/10 职场文书
《敬重卑微》读后感3篇
2019/11/26 职场文书
mongoDB数据库索引快速入门指南
2022/03/23 MongoDB