JSONP的原理 :
动态创建<script>,借助<script>发送请求。服务器端会返回JS语句,服务器端将要传递的数据填充进JS语句中返回,<script>接到了JS语句后,执行JS语句。
方案一:
用<script src="服务器端接口地址">代替$.ajax发送请求
服务端:将要发送的数据田中在一条js语句中
const url = require("url");
var weather = "北京 晴 18-32"
var callback = Url.query.callback
res.write('document.write("${weather}")')
客户端:
<script src="服务器端接口地址">
//<script>只要接收到js语句,及立刻自动执行
问题:JS语句写死在客户端,不灵活。
方案二:
提前在客户端定义一个函数,用于处理服务器端返回的请求。服务端仅使用函数名拼接一条函数调用的JS语句。
客户端:
function show(){
任意JS语句
}
服务器端:
res.write(`show("${weather}")`)
问题:本该定义在客户端的函数名,在服务端写死
方案三:
用请求参数,将函数传递给服务器
客户端:
<script src:"http://localhost:3000/?callback=doit">
服务端:
接收客户端传来的名为callback的参数中保存的函数名,将callback函数名动态拼接到要返回的函数调用语句中
res.write(`${callback}`"${weather}")
问题:<script> 在页面中是写死的,只能在页面加载时执行一次,无法反复执行。
方案四:
每次单击按钮动态创建<script>。为防止<script>堆积,所以在回调函数中删除上一个<script>
客户端;
<body>
<button> 查看天气</button>
</body>
<script>
function doit(weather){
conosole.log(weather);
$("body>script:last").remove(); //删除上一个script,防止<script>堆积
}$("button").click(function(){})
$('<script src="http://localhost:3000?callback=doit">')
.appendTo("body"); //动态创建<script>并追加在DOM树
</script>
以上是JSONP的实现原理,在工作中
客户端(jquery):
$.ajax({
url:"http://localhost:3000",
type:"get",
dataType:"jsonp",
success:function(){
alert(success);
}
})
JSONP的实现一定要有后台的支持;