zoukankan      html  css  js  c++  java
  • 跨站请求数据jsonp手写原生js代码实现

    JSONP

     --来自百度百科

    JSONP(JSON with Padding)是JSON的一种“使用模式”,可用于解决主流浏览器的跨域数据访问的问题。由于同源策略,一般来说位于 server1.example.com 的网页无法与不是 server1.example.com的服务器沟通,而 HTML 的<script> 元素是一个例外。利用 <script> 元素的这个开放策略,网页可以得到从其他来源动态产生的 JSON 资料,而这种使用模式就是所谓的 JSONP。用 JSONP 抓到的资料并不是 JSON,而是任意的JavaScript,用 JavaScript 直译器执行而不是用 JSON 解析器解析。

    关于HTML几种标签能否获取数据的说明:

    <!-- 早期用于统计链接,支持跨域但是无法实现获取服务端返回的数据 -->
    <img src="http://www.baidu.com?id=xxx">
    <!-- 支持,可以接受服务端数据,但过程复杂 -->
    <iframe src="http://www.baidu.com?id=xxx" frameborder="0"></iframe>
    <!-- 会在css处理阶段报错 -->
    <link rel="stylesheet" href="http://www.baidu.com?id=xxx">
    <!-- script可以接受数据并处理 -->
    <script src="http://www.baidu.com?id=xxx"></script>
    <!-- callback({}) -->

    原生js实现jsonp跨站获取数据:

    var jsonp = function(url,data,callback){
    // 回调函数+时间戳
    var cbName = 'callback_' + new Date().getTime();
    // 暴露全局函数给window
    // 判读查询字符串最后一位是否为?或者是&
    var queryString = url.indexOf('?') == -1 ? '?' : '&';
    // 遍历传进来的data实参赋值给查询字符串
    for(var k in data){
    queryString += k + '=' + data[k] + '&';
    }
    // 查询字符串加上回调函数
    queryString += 'callback=' + cbName;
    // 创建script标签
    var ele = document[0].createElement('script');
    // 给script标签添加src属性值
    ele.src = url + queryString;
    window[cbName] = function(data){
    callback(data);
    document[0].body.removeChild(ele);
    };
    // 添加到body尾部
    document[0].body.appendChild(ele);
    }

    使用方法:

    $jsonp('http://api.douban.com/v2/movie/in_theaters',{
    	'count':1
    },function(data){
    	document.getElementsByTagName('body')[0].innerHTML = JSON.stringify(data);
    })
    html结构:
    <div id="result"></div>

    完整代码:

    <!DOCTYPE html>
    <html lang="en">
    <head>
    	<meta charset="UTF-8">
    	<title>jsonp</title>
    </head>
    <body>
    	<div id="result"></div>
    <script>
    (function(window,document,undefined){
    var jsonp = function(url,data,callback){
    // 回调函数+时间戳
    var cbName = 'callback_' + new Date().getTime();
    // 暴露全局函数给window
    // 判读查询字符串最后一位是否为?或者是&
    var queryString = url.indexOf('?') == -1 ? '?' : '&';
    // 遍历传进来的data实参赋值给查询字符串
    for(var k in data){
    queryString += k + '=' + data[k] + '&';
    }
    // 查询字符串加上回调函数
    queryString += 'callback=' + cbName;
    // 创建script标签
    var ele = document[0].createElement('script');
    // 给script标签添加src属性值
    ele.src = url + queryString;
    window[cbName] = function(data){
    callback(data);
    document[0].body.removeChild(ele);
    };
    // 添加到body尾部
    document[0].body.appendChild(ele);
    }
    //jsonp函数暴露给window
    window.$jsonp = jsonp;
    })(window,document,undefined);
    </script>
    <script>
    $jsonp('http://api.douban.com/v2/movie/in_theaters',{
    	'count':1
    },function(data){
    	document.getElementsByTagName('body')[0].innerHTML = JSON.stringify(data);
    })
    </script>
    </body>
    </html>
    欢迎大家提意见
  • 相关阅读:
    Javascript Promise对象学习
    JavaScript 判断一个对象的数据类型。
    Angular SEO方案
    【GOF23设计模式】迭代器模式
    【GOF23设计模式】责任链模式
    【GOF23设计模式】享元模式
    【GOF23设计模式】外观模式
    【GOF23设计模式】装饰模式
    【GOF23设计模式】组合模式
    【GOF23设计模式】桥接模式
  • 原文地址:https://www.cnblogs.com/zj1024/p/8831146.html
Copyright © 2011-2022 走看看