简明现代魔法 -> JavaScript -> 通过JSONP实现跨域

通过JSONP实现跨域

2010-06-26

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://www.nowamagic.net/js/jquery.js";
//在head之后添加js文件
document.getElementsByTagName("head")[0].appendChild(JSONP);

简单解释:我们通过创建script,然后指定它的src等属性,然后插入到head执行。

建议:onload、onreadystatechange 写在src赋值之前,防止载入js太快而没有给onload、onreadystatechange 赋值(Image对象在IE下具有此类现象)。

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

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

后台jsonp.php的代码:

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

普通的ajax请求只能进行同域的数据交互,但是一旦有跨域的情况就不行了。但是jsonp不同,他可以利用浏览器标签达到跨域的目的。 其实 jsonp 是个很简单的一个东西。主要是利用了 <script> 标签对 javascript 文档的动态解析。

Script 标签本身的功能就是异步加载js并且会以js的方式解析执行。一旦在script的标签里加入src的属性,浏览器执行到这个标签时就回去请求指定的地址,如果服务器返回的是js格式的代码,甚至可以是js的函数,只要是能被js解析的,都可以被执行,这也就是jsonp的原理。

简单使用jsonp的demo:

<!DOCTYPE HTML>
<html>
<head>
    <meta charset="gbk"/>
    <title></title>
</head>
<body>
<div id="content">
    
</div>

</body>
<script type="text/javascript">
    var load = function(message){
        document.getElementById("content").innerHTML=message;
    }
</script>
<script type="text/javascript" src="jsonpContent.html?callback=load"></script>
</html>

这是最基本的jsonp的原理。

以http://www.nowamagic.net/test.php这个链接为例,在url后面带上参数callback=AjaxListLoader.reload

<!DOCTYPE HTML>
<html>
<head>
    <meta charset="gbk"/>
    <title></title>
    <script type="text/javascript"
            src="http://ajax.googleapis.com/ajax/libs/yui/2.8.1/build/yuiloader-dom-event/yuiloader-dom-event.js"></script>
</head>
<body>
<div id="console"></div>
<script>
    var url = "http://www.nowamagic.net/test.php";

    var AjaxLoader = function() {
        var loader = function() {
            YAHOO.util.Get.script(url + '?callback=AjaxLoader.reload', {
                onSuccess: function() {
                },
                onFailure: function() {
                    YAHOO.util.Dom.get("console").innerHTML = '请求失败';
                },
                timeout: 10000,
                autopurge: true,
                charset: 'GBK'
            });
        };

        return{
            init: function () {
                loader();
                YAHOO.util.Dom.get("console").innerHTML = '开始请求';

            },
            
            reload:function() {
                YAHOO.util.Dom.get("console").innerHTML = '请求成功,调用成功';
            }
        };
    }();

    AjaxLoader.init();


</script>
</body>

</html>

通过yui的get.script()去触发url,代替了原本的script标签。将返回的数据填充到页面来展示。

随机文章推荐
网站分类


注:如需转载本文,请注明出处(原文链接),谢谢。更多精彩内容,请进入简明现代魔法首页。

进入新博客
喜欢本文,就分享它吧
给我留言
您的名字:
您的邮件:
您的网站:


 

copyright © 2009 简明现代魔法    学习、分享、进步

power by Gonn 感谢所有关心和支持本站的朋友们