手动实现jsonp

一、jsonp跨域原理

利用script标签的异步加载特性实现给服务端传一个回调函数,服务器返回一个传递过去的回调函数名称的JS代码。即:利用script标签的src属性,通过动态创建一个script标签,指定src属性为跨域的api,那么html会把返回的字符创当作javascript代码来进行解析,如果我们在返回的字符串中使用自定义函数形式包装起来,然后在html中调用自定义函数,即可拿到返回的字符串。

二、优点

能够直接访问响应文本,可用于浏览器与服务器间的双向通信。

三、缺点

JSONP从其他域中加载代码执行,其他域可能不安全;难以确定JSONP请求是否失败。

四、手动实现jsonp
1、 挂载回调函数

2、 将data转化成url字符串的形式

3、 处理url地址中的回调参数

4、 创建一个script的标签

5、 将script标签放到页面中
    // 手动实现jsonp跨域
    ;(function(window, name){
        var jsonp = function(url, param, callback){
            var callbackSuffix = Math.random().toString().replace('.', '');
            // console.log(callbackSuffix);  // 07626840955849186
            var callbackName = "callback_function" + callbackSuffix;
            // console.log(callbackName); // callback_function07626840955849186
            window[callbackName] = callback;
            var queryString = url.indexOf('?') == -1 ? "?" : '&';
            // console.log(queryString); // ?
            for(var key in param){
                queryString += key + '=' + param[key] + '&';
            }
            // console.log(queryString); // ?count=10&start=15&
            queryString += 'callback=' + callbackName;
            // console.log(queryString); // ?count=10&start=15&callback=callback_function07626840955849186
            var scriptElement = document.createElement('script');
            scriptElement.src = url + queryString;
            document.body.appendChild(scriptElement);
        };
        window.$jsonp = jsonp; 
    })(window, document);

测试例子:

    <div id="result"></div>

    // 使用
    (function(){
        $jsonp('http://api.douban.com/v2/movie/in_theaters', {count:10, start:15}, function(data){
            document.getElementById('result').innerHTML = JSON.stringify(data);
        });
    })();
五、使用:jquery+ajax+jsonp
$.ajax({
      type : "get",
      async: false,
      url : "ajax.ashx",
      dataType : "jsonp", // 预期服务器返回的数据类型。如果不指定,jQuery 将自动根据 HTTP 包 MIME 信息来智能判断
      jsonp: "callbackparam",  //传递给请求处理程序或页面的,用以获得jsonp回调函数名的参数名(默认为:callback)
      jsonpCallback:"success_jsonpCallback",  //自定义的jsonp回调函数名称,默认为jQuery自动生成的随机函数名
      success : function(json){
          alert(json);
          alert(json[0].name);
      },
      error:function(){
           alert('fail');
      }
 });
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

英子的搬砖日志

您的鼓励是我创作的动力~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值