`

jQuery中getJSON跨域原理详解

阅读更多
详见: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跨域Json请求处理

    ### Jquery跨域Json请求处理详解 #### 一、跨域问题概述 在现代Web开发中,跨域问题是一个常见的技术挑战。简单来说,当一个网页尝试从不同的源(源可以理解为协议、域名或者端口号)加载资源时,就会遇到跨域限制...

    jquery跨域请求示例分享(jquery发送ajax请求)

    【jQuery.getJSON方法详解及其在跨域请求中的应用】 jQuery.getJSON是jQuery库中用于发起异步JSON数据请求的方法,它允许我们在不离开当前页面的情况下从远程服务器获取JSON格式的数据,进而更新页面内容。这个方法...

    js中几种实用的跨域方法原理详解

    在jQuery中,可以使用`$.getJSON`方法,它会自动处理JSONP请求,包括生成临时回调函数并删除。 2. 修改`document.domain`跨子域 当两个页面处于同一主域但不同子域时,可以通过设置`document.domain`来实现跨域...

    ajax格式的getJSON

    本篇将基于提供的文件信息——“ajax格式的getJSON”,深入探讨AJAX的基本原理、getJSON方法的使用以及示例代码中的关键概念。 #### 一、AJAX概述 AJAX是一种在无需重新加载整个页面的情况下,能够更新部分网页的...

    jQuery 跨域访问解决原理案例详解

    jQuery跨域访问是指在...总的来说,jQuery的跨域访问解决原理主要是通过JSONP实现的。开发者应当根据具体需求和安全考虑选择合适的跨域处理方法,并注意在实现跨域访问时,要保持对安全性的重视,防止潜在的安全风险。

    ajax跨域请求

    通过学习这两个文件,你可以深入理解这两种跨域技术的工作原理,并将它们应用到实际项目中。 总结,Ajax跨域请求是现代Web开发中解决不同源之间数据交互的重要手段。JSONP和CORS是两种主要的实现方式,前者适用于...

    浅谈js中几种实用的跨域方法原理详解

    在jQuery中,$.getJSON方法会自动判断是否跨域,并选择使用普通AJAX请求或JSONP方式。 2. CORS(跨源资源共享): CORS是一种官方推荐的跨域解决方案,它比JSONP更强大,能够处理各种类型的HTTP请求。它通过在HTTP...

    jQuery中异步交互技术详细指南

    **jQuery中的异步交互技术详解** 在Web开发中,异步交互是提升用户体验的关键技术之一。jQuery库提供了强大的异步交互API,使得开发者能够轻松地与服务器进行数据交换,而无需深入了解复杂的AJAX(Asynchronous ...

    jquery ajax跨域解决方法(json方式)

    文章中提到,一个有效的解决方式是使用jQuery的.getJSON()方法来处理跨域请求。这个方法从jQuery 1.2版本起支持跨域操作。 ### $.getJSON()方法详解 $.getJSON()方法提供了一种简化的AJAX方式,专门用于获取JSON...

    javascript跨域的4种方法和原理详解.docx

    ### JavaScript 跨域的四种方法及原理详解 #### 一、JSONP (JSON with Padding) JSONP 是一种常用的跨域解决方案,它利用了浏览器对 `<script>` 标签的特殊处理能力。通常情况下,浏览器出于安全考虑,不允许通过 ...

    js中跨域方法原理详解

    使用jQuery的$.getJSON方法进行JSONP操作时,jQuery会自动生成一个全局函数替换`callback=?`中的问号,获取数据后自动销毁这个函数,起到临时代理的作用,简化了JSONP的实现过程。 2. 修改`document.domain`跨子域...

    详解js跨域原理以及2种解决方案

    1. JSONP(JSON with Padding)是一种古老的跨域技术,其原理是利用`<script>`标签的src属性不受同源策略限制的特性。当`<script>`标签的src属性指向跨域的URL时,浏览器会发起请求到该URL获取数据,由于返回的数据...

    JQueryMobile与后台通信

    3. **$.getJSON()和$.get(),$.post()**:针对JSON数据的GET请求,可以使用$.getJSON();而$.get()和$.post()则是简化版的GET和POST请求。 **二、Page Events:处理页面生命周期** 1. **页面生命周期**:jQuery ...

    js解决跨域访问问题

    ### JS解决跨域访问问题详解 #### 一、引言 在现代Web开发中,跨域访问问题是开发者经常面临的一个挑战。特别是在使用JavaScript进行前后端交互时,由于浏览器的同源策略限制,开发者经常会遇到跨域问题。本文将...

    jquery经典代码

    $.getJSON('cross-domain-url?callback=?', function(data) { // 处理跨域返回的JSON数据 }); ``` ### 7. Promise API jQuery的AJAX函数返回一个Promise对象,可以配合`.done()`, `.fail()`, `.always()`等方法...

    ajax跨域问题!

    ### AJAX跨域问题详解 #### 一、引言 在Web开发中,由于浏览器的安全策略限制,同源策略(Same-origin policy)对于不同来源的数据访问进行了严格的限制,从而导致了跨域问题的发生。本篇文章将深入探讨AJAX跨域...

    jsonp跨域调用

    ### JSONP跨域调用详解 #### 一、JSONP定义及原理 **JSONP**(JSON with Padding)是一种被广泛采用的技术,用于绕过浏览器的同源策略限制,实现跨域数据请求。虽然JSONP并不是一种正式的标准或协议,但它在实际应用...

Global site tag (gtag.js) - Google Analytics