如何通过JSONP实现跨域

一些JSONP的使用实例
服务器君一共花费了269.910 ms进行了5次数据库查询,努力地为您提供了这个页面<。
试试阅读模式?希望听取您的建议

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.jzjxzzjx.com/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.jzjxzzjx.com/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.jzjxzzjx.com/test.php这个链接为例,在url后面带上参数callback=AjaxListLoader.reload

<!DOCTYPE HTML>
<html>
<head>
    <meta charset="gbk"/>
    <title></title>
    <script type="text/javascript"
            src="http://www.jzjxzzjx.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.jzjxzzjx.com/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标签。将返回的数据填充到页面来展示<。

本文地址:http://www.jzjxzzjx.com/librarys/veda/detail/555<,欢迎访问原出处。

不打个分吗?

转载随意,但请带上本文地址:

http://www.jzjxzzjx.com/librarys/veda/detail/555

如果你认为这篇文章值得更多人阅读<<,欢迎使用下面的分享功能。
小提示:您可以按快捷键 Ctrl + D,或点此 加入收藏。

大家都在看

阅读一百本计算机著作吧,少年

很多人觉得自己技术进步很慢<,学习效率低<,我觉得一个重要原因是看的书少了。多少是多呢<?起码得看3、4<、5、6米吧<。给个具体的数量,那就100本书吧。很多人知识结构不好而且不系统<,因为在特定领域有一个足够量的知识量+足够良好的知识结构<,系统化以后就足以应对大量未曾遇到过的问题。

奉劝自学者:构建特定领域的知识结构体系的路径中再也没有比学习该专业的专业课程更好的了。如果我的知识结构体系足以囊括面试官的大部分甚至吞并他的知识结构体系的话,读到他言语中的一个词我们就已经知道他要表达什么,我们可以让他坐“上位”毕竟他是面试官,但是在知识结构体系以及心理上我们就居高临下。

所以,阅读一百本计算机著作吧<,少年<!

《软件随想录:程序员部落酋长Joel谈软件》 Joel Spolsky (作者), 阮一峰 (译者)

《软件随想录:程序员部落酋长Joel谈软件》是一部关于软件技术、人才<、创业和企业管理的随想文集,作者以诙谐幽默的笔触将自己在软件行业的亲身感悟娓娓道来,观点新颖独特,内容简洁实用。全书分为 36讲,每一讲都是一个独立的专题?!度砑嫦肼?程序员部落酋长Joel谈软件》从不同侧面满足了软件开发人员、设计人员<、管理人员及从事软件相关工作的人员的学习与工作需要。

更多计算机宝库...

ASP300源码下载 | 微信红包群 | 设计 | 厦门旅游景点 | 旅游中国新闻网 | 钛媒体 | 健康网hsdcba | 每天资讯 | 广西农业技术信息 | 农业种植技术 |