首页 > Ajax/ JavaScript > 通过JSONP实现完美跨域

通过JSONP实现完美跨域

以前我经常在博客说JSONP,例如我的WordPress天气插件就是通过JSONP来调用的天气数据,今天就说说通过JSONP实现跨域的应用~

什么是JSONP

JSONP即JSON with Padding。由于同源策略的限制,XmlHttpRequest只允许请求当前源(域名、协议、端口)的资源。如果要进行跨域请求,我们可以通过使用 html的script标记来进行跨域请求,并在响应中返回要执行的script代码,其中可以直接使用JSON传递javascript对象。这种跨域的通讯方式称为JSONP。

对于上面的解释,我们可以简单这样理解:JSONP就是可以通过JavaScript文件进行跨域通讯的方式,例如:现在各大网站风靡的搜索提示,搜狗云输入法
注意:JSONP服务器端代码需要充分做好安全措施。

最简单的JSONP

var JSONP = document.createElement("script") ;
//FF:onload IE:onreadystatechange
JSONP.onload = JSONP.onreadystatechange = function(){
	//onreadystatechange,仅IE
	if (!this.readyState || this.readyState === "loaded" || this.readyState === "complete") {
		alert($("#demo").html());
		JSONP.onload = JSONP.onreadystatechange = null//请内存,防止IE memory leaks
	}
}
JSONP.type = "text/javascript";
JSONP.src = "http://a.pojaaimg.cn/2010/js/jquery.js";
//在head之后添加js文件
document.getElementsByTagName("head")[0].appendChild(JSONP);

简单解释:我们通过创建script,然后指定它的src等属性,然后插入到head执行
建议:onload、onreadystatechange 写在src赋值之前,防止载入js太快而没有给onload、onreadystatechange 赋值(Image对象在IE下具有此类现象

JSONP实例

我们可以首先定义一个函数来执行JSONP返回的数据,然后通过JSONP的src传此函数给后台,进行处理,返回可执行的函数。例如下面代码:

function jsonpHandle(a){
    alert(a);
}
var JSONP = document.createElement("script") ;
JSONP.type = "text/javascript";
JSONP.src = "http://js8.in/jsonp.php?callback=jsonpHandle";
//在head之后添加js文件
document.getElementsByTagName("head")[0].appendChild(JSONP);

后台jsonp.php的代码:

echo $_GET["callback"]."('hello,world')";

相关文章

"通过JSONP实现完美跨域"已有6条评论
    dgunzi

    永清!我喜欢看你的部落格,更新的比较勤!

    2010年06月12日 17:17 回复 引用

    lingfu

    可是这种方法和有什么区别呢?

    2010年06月13日 00:29 回复 引用

    sodarfish

    有个问题想请教博主,使用这种方法,如果要给其他域发送较多的数据怎么办呢?
    在src里传参的话不会有长度限制么?
    谢谢

    2011年03月19日 19:44 回复 引用

    断桥残雪

    有长度限制,而且不同的浏览器会有不同的限制,具体多少忘记了

    2011年03月20日 17:09 回复 引用

    歪歪歪

    @断桥残雪:url是有长度限制滴,就是传说中的get方式,貌似这种提交方法限制在2KB以内~~~这种方式传递出去的中文好像也要进行编码,有时候会在IE6(该死的IE6)下造成乱码~~~(如果用回传地址的话不会,跨域出去的时候貌似会,仅在IE6下发现),最近在研究跨域,来过几次你的博客,收获不小!

    2011年08月04日 22:55 回复 引用

    断桥残雪

    如果方便的话,跨域还是推荐用跨域文件的方法,通过代理文件实现get和post的双向跨域,现在很多项目都使用了这样的跨域方式

    2011年08月04日 22:59 回复 引用

文明发言,你好我也好
正在提交,请稍后...
返回顶部