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中的deferred使用方法
Mar 27 jQuery
jQuery源码解读之extend()与工具方法、实例方法详解
Mar 30 jQuery
jQuery实现文章图片弹出放大效果
Apr 06 jQuery
jQuery插件FusionCharts绘制的2D条状图效果【附demo源码】
May 13 jQuery
jquery与js实现全选功能的区别
Jun 11 jQuery
jQuery Autocomplete简介_动力节点Java学院整理
Jul 17 jQuery
jquery 一键复制到剪切板的实例
Sep 20 jQuery
jQuery模拟12306城市选择框功能简单实现方法示例
Aug 13 jQuery
JQuery事件委托(适用于给动态生成的脚本元素添加事件)
Feb 01 jQuery
jQuery实现简单三级联动效果
Sep 05 jQuery
jQuery实现放大镜案例
Oct 19 jQuery
jQuery ajax - getScript() 方法和getJSON方法
May 14 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
Apache服务器无法使用的解决方法
2013/05/08 PHP
PHP+Mysql树型结构(无限分类)数据库设计的2种方式实例
2014/07/15 PHP
php mb_substr()函数截取中文字符串应用示例
2014/07/29 PHP
在Nginx上部署ThinkPHP项目教程
2015/02/02 PHP
php获取从百度、谷歌等搜索引擎进入网站关键词的方法
2015/07/08 PHP
php图像处理函数imagecopyresampled用法详解
2016/12/02 PHP
Javascript计算两个marker之间的距离(Google Map V3)
2013/04/26 Javascript
JS截取与分割字符串常用技巧总结
2015/11/10 Javascript
AngularJS入门教程之AngularJS 模板
2016/08/18 Javascript
canvas实现简易的圆环进度条效果
2017/02/28 Javascript
JavaScript数据结构之二叉树的计数算法示例
2017/04/13 Javascript
详解使用 Node.js 开发简单的脚手架工具
2018/06/08 Javascript
微信小程序实现消息框弹出动画
2020/04/18 Javascript
React生命周期原理与用法踩坑笔记
2020/04/28 Javascript
JavaScript中reduce()的5个基本用法示例
2020/07/19 Javascript
使用Typescript开发微信小程序的步骤详解
2021/01/12 Javascript
python实现哈希表
2014/02/07 Python
Python 转义字符详细介绍
2017/03/21 Python
浅谈pyhton学习中出现的各种问题(新手必看)
2017/05/17 Python
python替换字符串中的子串图文步骤
2019/06/19 Python
python实现微信打飞机游戏
2020/03/24 Python
如何使用pycharm连接Databricks的步骤详解
2020/09/23 Python
CSS3的新特性介绍
2008/10/31 HTML / CSS
意大利时尚精品店:Nugnes 1920
2020/02/10 全球购物
医院护士的求职信范文
2013/12/26 职场文书
秋季运动会加油稿200字
2014/01/11 职场文书
个人查摆剖析材料
2014/02/04 职场文书
岗位标兵事迹材料
2014/05/17 职场文书
工伤事故证明
2014/10/20 职场文书
庆祝教师节主持词
2015/07/06 职场文书
2016十一国庆节感言
2015/12/09 职场文书
高一英语教学反思
2016/03/03 职场文书
如何起草一份正确的合伙创业协议书?
2019/07/04 职场文书
导游词之开封禹王台风景区
2019/12/02 职场文书
MySQL8.0无法启动3534的解决方法
2021/06/03 MySQL
你真的会用Mysql的explain吗
2022/03/31 MySQL