文章目录
1.什么是jsonp
jsonp是json+padding是json的一种"使用模式",可以让网页json从别的域名(网页)拿到数据,即跨域获取数据
2.为什么要跨域
因为同源策略:域名,端口号,协议
3.[面试题]jsonp跨域的原理是什么?
动态创建script标签,它的src属性的指向不受同源限制
指向返回一个接口,这个接口的格式一定是函数表达式:函数名()
4,跨域例子
代码
index.html
<button>jsonp</button>
<script>
function test(obj) {
console.log(obj);
}
document.querySelector("button").onclick = function() {
var oScript = document.createElement("script");
oScript.src = "./jsonp.js";
document.body.appendChild(oScript);
}
</script>
:jsonp.js
test({ name: "zs" });
结果
输出:{name: ‘zs’}
5.接口名必须前后端名称一样
例子
<script>
function callbackFunction(obj) {//必须叫callbackFunction才能拿到数据
console.log(obj);
}
document.querySelector("button").onclick = function() {
var oScript = document.createElement("script");
oScript.src = "https://www.runoob.com/try/ajax/jsonp.php?jsoncallback=callbackFunction";//callbackFunction也可以改成别的名字
document.body.appendChild(oScript);
}
</script>
结果
(2) [‘customername1’, ‘customername2’]
6.jsonp的缺点
6.1.产生大量无用的script标签
解决:在onload中删除script标签
代码:
function cb(obj) {
console.log(obj);
}
document.querySelector("button").onclick = function() {
var oScript = document.createElement("script");
oScript.src = "https://www.runoob.com/try/ajax/jsonp.php?jsoncallback=cb";
document.body.appendChild(oScript);
//删除oScript标签
oScript.onload = function() {
oScript.remove();
}
}
6.2.只能GET请求,不能POST,PUT,DELETE
7.jsonp跨域案例:同步百度的搜索栏
详见:2021-06-21 使用ajax设置同步百度的搜索栏
8.jQuery的jsonp跨域请求
例子1
<div id="box"></div>
<script src="https://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js">
</script>
<script>
$("#box").css({
"width": 300,
'height': 100,
"background": "pink",
});
/*
https://www.runoob.com/try/ajax/jsonp.php?jsoncallback=callbackFunction
*/
$("#box").on("click", function() {
$.ajax({
url: "https://www.runoob.com/try/ajax/jsonp.php",
dataType: "jsonp",
jsonp: "jsoncallback",
jsonpCallback: "test"
});
});
function test(res) {
console.log(res);
}
</script>
结果
点击box,输出(2) [‘customername1’, ‘customername2’]
发现url已自动拼接好(后面数字是时间戳)
[推荐]例子2:格式改进,不需要自己写回调名
$("#box").on("click", function() {
$.ajax({
url: "https://www.runoob.com/try/ajax/jsonp.php",
dataType: "jsonp",
jsonp: "jsoncallback",
// jsonpCallback: "test"
success: (res) => {
console.log(res);
}
});
});