跨站请求数据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>欢迎大家提意见