jQuery中getJSON跨域原理详解
来源:互联网 发布:玩游戏别人身份证知乎 编辑:程序博客网 时间:2024/05/16 04:47
详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp28
jQuery中getJSON跨域原理详解
前几天我再开发一个叫 河蟹工具条 的时候,其中有个功能就是获取本页面的短网址。
这个想法是好的,可是在我付诸于行动的时候,发现这个需要跨域。
起初我的想法就是,跨域的最简单的方法就是增加一个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跨域原理详解
前几天我再开发一个叫 河蟹工具条 的时候,其中有个功能就是获取本页面的短网址。
这个想法是好的,可是在我付诸于行动的时候,发现这个需要跨域。
起初我的想法就是,跨域的最简单的方法就是增加一个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();
})();
0 0
- jQuery中getJSON跨域原理详解
- jQuery中getJSON跨域原理详解
- jquery.getJSON跨域方案实现原理
- JSONP跨域原理和jQuery.getJSON用法
- JSONP跨域原理和jQuery.getJSON用法
- JSONP跨域原理和jQuery.getJSON用法
- JSONP跨域原理和jQuery.getJSON用法
- Jquery中getJson函数用法实例详解
- $.getJSON()跨域之原理
- jquery $.getJSON()跨域请求
- jQuery.getJSON() 函数详解
- jQuery.getJSON() 函数详解
- jquery中$.getJSON()
- jQuery中$.get、$.post、$.getJSON、$.ajax 方法详解
- jQuery中$.get、$.post、$.getJSON、$.ajax 方法详解
- jQuery中$.get $.post $.getJSON $.ajax方法详解
- jquery中$.get(),$.post(),$.ajax(),$.getJSON()区别详解以及aja
- jQuery中$.get、$.post、$.getJSON和$.ajax的用法详解
- EXCEL使用技巧--分类汇总
- android studio 如何修改包名
- 说说 DWRUtil
- 魅族手机中屏蔽ListView下拉悬停方法
- HTML转义字符串
- jQuery中getJSON跨域原理详解
- excel(2015)表格如何在滑动时固定标题栏
- 用JS控制CSS基本样式
- 详解session
- el表达式里面fn的用法
- Visual Studio 2013 VS2013各版本的秘钥
- Spring定时任务quartz表达式
- http://blog.csdn.net/a123demi/article/details/41021513?utm_source=tuicool&utm_medium=referral
- iOS开发网络数据之AFNetworking使用