跨域请求之jsonp的实现方式

时间:2022-05-24 00:50:46

ajax请求受同源策略影响,不允许进行跨域请求,而script标签src属性中的链接却可以访问跨域的js脚本,利用这个特性,服务端不再返回JSON格式的数据,而是返回一段调用某个函数的js代码,在src中进行了调用,这样实现了跨域。

 (function(){
$jsonp(//地址
'http://api.douban.com/v2/movie/in_theaters',
//传递的参数
{
count:10,start:5
},
//回调函数
function(data){
document.getElementById('result').innerHTML=JSON.stringify(data);
}
);
})(); (function(window,document){
'use strict';
var jsonp=function(url,data,callback){
//1 挂载回调函数
var fnSuffix=Math.random().toString().replace('.','');
var cbFuncName='my_json_cb_'+fnSuffix;
//将函数挂载在全局环境的方式不推荐 使用cbs.my_json_cb_
window[cbFuncName]=callback;
//2 将data转化成url字符串的形式
// {id:1,name:'zhangsan'} =>id=1&name=zhangsan
var querystring=url.indexOf('?')==-1?'?':'&';
for(var key in data){
querystring+=key+'='+data[key]+'&';
// id= 1 &
}
//querystring=?id=1&name=zhangsan&
//3 处理url地址中的回调参数
//url+=callback=sdfsfdg
querystring+='callback='+cbFuncName;
//querystring=?id=1&name=zhangsan&cb=my_json_cb_0231241
//4 创建一个script的标签
var scriptElement=document.createElement('script');
scriptElement.src=url+querystring;
// 此时还不能将其append到页面上
//5 将script标签放到页面中
document.body.appendChild(scriptElement);
//append过后页面会自动对这个地址发送请求,请求完成以后自动执行脚本 };
/*把jsonp放到全局*/
window.$jsonp=jsonp;
})(window,document);

缺点:只能支持GET请求而不能支持POST等其他http请求方式;它只支持跨域HTTP请求这种情况,不能解决不同域的两个页面之间如何进行JavaScript调用的问题。

优点:支持跨域,兼容性好。。。