JSONP(JSON with Padding) 是一种跨域请求方式。
利用了script 标签可以跨域请求的特点来实现。
平时都是用jquery来实现,其实自己写也很简单。就是创建一个script标签,设置src,src添加一个callback参数,参数的值对应一个function的名字,加载完成之后就会自动调用callback指定的function了。
jquery实现。
<script type="text/javascript" src = 'jquery.js'></script>
<script type="text/javascript">
var url = "https://books.google.com/books";
$.ajax(url, {
data:{
id: '6IUarHeMWpAC',
h1: 'zh-CN',
pg: 'PP1',
jscmd: 'click3'
},
dataType: 'jsonp',
crossDomain: true,
success: function(data) {
console.log('jquery',data);
},
error:function(e){
console.log(e);
}
});
</script>自己用js实现。
<script type="text/javascript">
var url = "https://books.google.com/books";
jsonp({
url: url,
time: 10000,
data:{
id: '6IUarHeMWpAC',
hl: 'zh-CN',
pg: 'PP1',
jscmd: 'click3'
},
fail:(obj)=>{
console.log('超时');
},
success:(json)=>{
console.log(json);
}
});
function jsonp(options) {
options = options || {};
if (!options.url) {
throw new Error("参数不合法");
}
//创建 script 标签并加入到页面中
var callbackName = ('jsonp_' + Math.random()).replace(".", "");
var oHead = document.getElementsByTagName('head')[0];
options.data['callback'] = callbackName;
var params = formatParams(options.data);
var oS = document.createElement('script');
oHead.appendChild(oS);
//创建jsonp回调函数
window[callbackName] = function (json) {
oHead.removeChild(oS);
clearTimeout(oS.timer);
window[callbackName] = null;
options.success && options.success(json);
};
//发送请求
oS.src = options.url + '?' + params;
//超时处理
if (options.time) {
oS.timer = setTimeout(function () {
window[callbackName] = null;
oHead.removeChild(oS);
options.fail && options.fail({ message: "超时" });
}, options.time);
}
};
//格式化参数
function formatParams(data) {
var arr = [];
for (var name in data) {
arr.push(encodeURIComponent(name) + '=' + encodeURIComponent(data[name]));
}
return arr.join('&');
}
</script>直接在页面中的script的src中加callback。
<script type="text/javascript">
function jsonpCallback(json){
console.log('jsonpCallback:', json);
}
</script>
<script type="text/javascript" src = "https://books.google.com/books?id=6IUarHeMWpAC&hl=zh-CN&pg=PP1&jscmd=click3&callback=jsonpCallback"></script>以上测试用的谷歌图书的地址,需要翻墙,不能翻墙的话,可以自己换个测试地址。
参考:https://www.cnblogs.com/greatluoluo/p/6295082.html
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。