jQuery中getJSON跨域原理详解

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(); 
})(); 

特别说明:尊重作者的劳动成果,转载请注明出处哦~~~

http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp28

时间: 2016-05-19

jQuery中getJSON跨域原理详解的相关文章

jQuery中ajax - post() 方法实例详解_AJAX相关

在jquery中的ajax有二个数据发送模式,一种是get,另一种是post(). jQuery Ajax 参考手册 实例 请求 test.php 网页,忽略返回值: $.post("test.php"); TIY 实例 通过 AJAX POST 请求改变 div 元素的文本: $("input").keyup(function(){ txt=$("input").val(); $.post("demo_ajax_gethint.asp

jquery中ajax跨域方法实例分析_jquery

本文实例分析了jquery中ajax跨域.分享给大家供大家参考,具体如下: JSONP是一个非官方的协议,它允许在服务器端集成Script tags返回至客户端,通过javascript callback的形式实现跨域访问 方法一: jsonp之 getJSON js var url = "http://localhost/mytest/jsonp_php.php?callback=?"; $.getJSON(url, { "age": 21, "name

jQuery中ajax - post() 方法实例详解

在jquery中的ajax有二个数据发送模式,一种是get,另一种是post(). jQuery Ajax 参考手册 实例 请求 test.php 网页,忽略返回值: $.post("test.php"); TIY 实例 通过 AJAX POST 请求改变 div 元素的文本: $("input").keyup(function(){ txt=$("input").val(); $.post("demo_ajax_gethint.asp

jQuery中ajax - get() 方法实例详解_AJAX相关

在jquery中使用get,post和ajax方法给服务器端传递数据,在上篇文章给大家分享了jquery中ajax-post()方法实例,下面通过本文继续学习jQuery中ajax - get() 方法,具体介绍请看下文. jQuery Ajax 参考手册 实例 使用 AJAX 的 GET 请求来改变 div 元素的文本: $("button").click(function(){ $.get("demo_ajax_load.txt", function(resul

jQuery中ajax - get() 方法实例详解

在jquery中使用get,post和ajax方法给服务器端传递数据,在上篇文章给大家分享了jquery中ajax-post()方法实例,下面通过本文继续学习jQuery中ajax - get() 方法,具体介绍请看下文. jQuery Ajax 参考手册 实例 使用 AJAX 的 GET 请求来改变 div 元素的文本: $("button").click(function(){ $.get("demo_ajax_load.txt", function(resul

jQuery中deferred对象使用方法详解_javascript技巧

在jquery1.5之后的版本中,加入了一个deferred对象,也就是延迟对象,用来处理未来某一时间点发生的回调函数.同时,还改写了ajax方法,现在的ajax方法返回的是一个deferred对象. 那就来看看deferred对象的用法.1.ajax的链式回调  // ajax方法返回的是一个deferred对象,可以直接使用链式写法 $.ajax('test.json').done(function(resp){ // done 相当于success回调,其中默认的参数为success回调的

jquery ajax跨域请求详解

ajax要在各种浏览器下都实现完美的跨域需要借助于jsonp技术,jsonp实质是请求一个js脚本文件,在js文件载入完毕时执行某个函数,这样就可以完美的规则跨域问题了. 什么是jsonp格式呢?API原文:如果获取的数据文件存放在远程服务器上(域名不同,也就是跨域获取数据),则需要使用jsonp类型.使用这种类型的话,会创建一个查询字符串参数 callback=? ,这个参数会加在请求的URL后面.服务器端应当在JSON数据前加上回调函数名,以便完成一个有效的JSONP请求.意思就是远程服务端

javascript ajax脚本跨域调用详解

今天终于有点时间研究了一下javsscript ajax 脚本跨域调用的问题,先在网上随便搜了一下找到一些解 决的办法,但是都比较复杂.由是转到jquery.chm用户手册当中找到一些代码片段关于ajax跨域调用的问题. 代码片段如下: crossDomain   mapV1.5 默认: 同域请求为false 跨域请求为true如果你想强制跨域请 求(如JSONP形式)同一域,设置crossDomain为true.这使得例如,服务器端重定向到另一个域. 这 里强调如是ajax的跨域调用,data

ajax请求总是不成功?浏览器的同源策略和跨域问题详解

场景 码农小明要做一个展示业务数据的大屏给老板看,里面包含了来自自己网站的数据和来自隔壁老王的数据. 那么自己网站的数据提供了 http://xiaoming.com/whoami 这样的数据接口 隔壁老王提供了 http://oldwang.com/isdad 这样的数据接口 单独点开都是没有问题的.但是一使用 js 的 ajax 请求就无法收到来自 oldwang.com 的数据了. 点开浏览器控制台一看,红字标出(Chrome): XMLHttpRequest cannot load ht