AJAX JSONP源码实现

关于JSONP以及跨域问题,请自行搜索。

本文重点给出AJAX JSONP的模拟实现代码,代码中JSONP的基本原理也一目了然。

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title>模拟实现AJAX JSONP源码</title>
    <script type="text/javascript">

    // 生成随机字符串
    function randomString(len) {
        len = len || 32;
        var chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefhijklmnoprstuvwxyz1234567890";
        var maxPos = chars.length;
        var pwd = ‘‘;
        for (i = 0; i < len; i++) {
            pwd += chars.charAt(Math.floor(Math.random() * maxPos));
        }
        return pwd;
    }

    function ajax_jsonp(data) {

        // 生成随机函数名并指向传入的回调函数
        var callbackfun = "jquery_" + randomString(32);
        eval( callbackfun+ " = data.success; "); 

        // 提供jsonp服务的url地址(不管是什么类型的地址,最终生成的返回值都是一段javascript代码)
        var url = data.url + "&callback="+callbackfun;
        // 创建script标签,设置其属性
        var script = document.createElement(‘script‘);
        script.setAttribute(‘src‘, url);
        // 把script标签加入head,此时调用开始
        document.getElementsByTagName(‘head‘)[0].appendChild(script); 

    }

    // 模拟调用
    ajax_jsonp({
        url: "http://sax.sina.com.cn/newimpress?adunitid=PDPS000000047325&rotate_count=36",
        success: function(data){
            alert(‘ID ‘ + data.ad[0].id );
        }
    });

    </script>
</head>
<body>

</body>
</html>

基本工作思路:

1. 创建一个随机字符串作为回调函数名

2. 把传入的回调函数赋值给随机函数。

3. 把该随机函数名作为callback参数补充到传入的URL(真正要访问的跨域的URL)中

4. 动态创建出script元素并触发URL的访问。浏览器获取返回的JS代码并执行,也就是执行了传入的回调函数。

(第三方URL返回的必须是一个合法的JS函数调用字符串,其中函数名是参数callback,参数是真正要返回的数据。)

参考文章

注意:此文章属博主原创,转载请注明原始链接,谢谢合作。

http://www.cnblogs.com/zhangfanwen/p/5486860.html

时间: 2024-10-21 14:31:17

AJAX JSONP源码实现的相关文章

前后端交互之封装Ajax+SpringMVC源码分析

为什么需要封装呢?因为用的多,我想将其封装成函数,当我想用它时,只需将那个函数对应的js文件引入即可,而不要重复写很多相同代码,利于开发效率的提高. 无论是$.ajax或$.post.$.get等,在开发中是经常用到的.再比如一些前端框架,例如easyui.ext.js等,ajax也是封装的. 编程的世界,封装无处不在. 具体js代码如下: /** * 增删改通用ajax请求 * @param type * @param url * @param datatype * @param conten

jQuery实现jsonp源码分析(京东2015面试)

// Bind script tag hack transportjQuery.ajaxTransport( "script", function(s) { // This transport only deals with cross domain requests if ( s.crossDomain ) { var script, head = document.head || jQuery("head")[0] || document.documentEle

ajax 底层源码解析

对象: XMLHttpRequest 属性:readyState请求状态,开始请求时值为0直到请求完成这个值增长到4 responseText目前为止接收到的响应体,readyState<3此属性为空字符串,=3为当前响应体,=4则为完整响应体 responseXML服务器端相应,解析为xml并作为Document对象返回 status服务器端返回的状态码,=200成功,=404表示"Not Found" statusText用名称表示的服务器端返回状态,对于"OK&q

关于jQuery的ajax的源码的dataType解读

$.ajax其实底层还是用的XMLHttpRequest,对于加载数据的格式datatype有:xml.text.html.json.jsonp.script. 其中xml.text不需要处理,直接使用原生的responseXML.responseText.对于html.json其实也是用responseText接收的,对于json格式,jquery拿到responseText后会预先用JSON.parse()去格式化一下json数据再传给回调函数. 对于jsonp和script的,其实不走xh

jQuery源码分析系列(31) : Ajax deferred实现 - Aaron.

AJAX的底层实现都是浏览器提供的,所以任何基于api上面的框架或者库,都只是说对于功能的灵活与兼容维护性做出最优的扩展 ajax请求的流程: 1.通过 new XMLHttpRequest 或其它的形式(指IE)生成ajax的对象xhr. 2.通过xhr.open(type, url, async, username, password)的形式建立一个连接. 3.通过setRequestHeader设定xhr的请求头部(request header). 4.通过send(data)请求服务器端

jQuery源码分析系列(31) : Ajax deferred实现

AJAX的底层实现都是浏览器提供的,所以任何基于api上面的框架或者库,都只是说对于功能的灵活与兼容维护性做出最优的扩展 ajax请求的流程: 1.通过 new XMLHttpRequest 或其它的形式(指IE)生成ajax的对象xhr. 2.通过xhr.open(type, url, async, username, password)的形式建立一个连接. 3.通过setRequestHeader设定xhr的请求头部(request header). 4.通过send(data)请求服务器端

AJax 源码思路

/* * Ajax的源码实践 * * 创建一个Ajax * 创建连接 * 请求 * 返回 * -----------美丽的分割线------------------------- * 1>>>>>>>>> * XMLHttpRequest 火狐下 * ActiveXObject('Microsoft.XMLHTTP') IE下 * * 2>>>>>>>>> * onreadystatechange

jQuery源码分析系列(34) : Ajax - 预处理jsonp

上一章大概讲了前置过滤器和请求分发器的作用,这一章主要是具体分析每种对应的处理方式 $.ajax()调用不同类型的响应,被传递到成功处理函数之前,会经过不同种类的预处理(prefilters). 预处理的类型取决于由更加接近默认的Content-Type响应,但可以明确使用dataType选项进行设置.如果提供了dataType选项, 响应的Content-Type头信息将被忽略. 有效的数据类型是text, html, xml, json,jsonp,和 script. dataType:预期

jQuery源码分析系列(35) : Ajax - jsonp的实现与原理

ajax的核心是通过XmlHttpRequest获取非本页内容,而jsonp的核心则是动态添加<script>标签来调用服务器提供的js脚本 json核心就是:允许用户传递一个callback参数给服务端,然后服务端返回数据时会将这个callback参数作为函数名来包裹住JSON数据,这样客户端就可以随意定制自己的函数来自动处理返回数据了. jquery ext dojo这类库的实现手段其实大同小异 在同源策略下,在某个服务器下的页面是无法获取到该服务器以外的数据的,但img.iframe.s