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 zTree树插件动态加载实例代码
May 11 jQuery
jQuery常用选择器详解
Jul 17 jQuery
jQuery实现拼图小游戏(实例讲解)
Jul 24 jQuery
使用jQuery实现购物车结算功能
Aug 15 jQuery
jquery-file-upload 文件上传带进度条效果
Nov 21 jQuery
基于jquery.page.js实现分页效果
Jan 01 jQuery
jQuery动态移除与增加onclick属性的方法详解
Jun 07 jQuery
jQuery实现购物车的总价计算和总价传值功能
Nov 28 jQuery
jQuery实现当拉动滚动条到底部加载数据的方法分析
Jan 24 jQuery
Jquery的autocomplete插件用法及参数讲解
Mar 12 jQuery
jQuery/JS监听input输入框值变化实例
Oct 17 jQuery
jquery实现有过渡效果的tab切换
Jul 17 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&java(三)
2006/10/09 PHP
php 向访客和爬虫显示不同的内容
2009/11/09 PHP
php 模拟get_headers函数的代码示例
2013/04/27 PHP
ThinkPHP模板IF标签用法详解
2014/07/01 PHP
php面向对象中static静态属性和静态方法的调用
2015/02/08 PHP
PHP MVC框架中类的自动加载机制实例分析
2019/09/18 PHP
小试JQuery的AutoComplete插件
2011/05/04 Javascript
jQuery Animation实现CSS3动画示例介绍
2013/08/14 Javascript
js 控制页面跳转的5种方法
2013/09/09 Javascript
jQuery队列操作方法实例
2014/06/11 Javascript
jquery 根据name名获取元素的value值
2015/02/27 Javascript
jquery仿百度经验滑动切换浏览效果
2015/04/14 Javascript
JavaScript实现跑马灯抽奖活动实例代码解析与优化(二)
2016/02/16 Javascript
文本框只能输入数字的实现方法(兼容IE火狐)
2016/06/25 Javascript
jQuery插件Flexslider实现图片轮播、图文结合滑动切换效果
2020/04/16 Javascript
浅谈AngularJs指令之scope属性详解
2016/10/24 Javascript
javascript基础知识讲解
2017/01/11 Javascript
实现jquery放大镜的两种方法
2018/02/22 jQuery
vue添加锚点,实现滚动页面时锚点添加相应的class操作
2020/08/10 Javascript
[45:14]Optic vs VP 2018国际邀请赛淘汰赛BO3 第二场 8.24
2018/08/25 DOTA
python操作mysql中文显示乱码的解决方法
2014/10/11 Python
Python实现k-means算法
2018/02/23 Python
Python中注释(多行注释和单行注释)的用法实例
2019/08/28 Python
使用pandas实现连续数据的离散化处理方式(分箱操作)
2019/11/22 Python
python绘图pyecharts+pandas的使用详解
2020/12/13 Python
html5/css3响应式页面开发总结
2018/10/16 HTML / CSS
Html5获取高德地图定位天气的方法
2019/12/26 HTML / CSS
俄罗斯苹果优质经销商商店:iPort
2020/05/27 全球购物
市场部专员岗位职责
2013/11/30 职场文书
户外用品商店创业计划书
2014/01/29 职场文书
英语老师推荐信
2014/02/26 职场文书
2015年世界环境日活动方案
2015/05/05 职场文书
2015年生活老师工作总结
2015/05/27 职场文书
怎样写家长意见
2015/06/04 职场文书
golang中字符串MD5生成方式总结
2021/07/04 Golang
JavaScript高级程序设计之基本引用类型
2021/11/17 Javascript