思路:
1.利用script标签的src不受跨域限制的原理
2.动态创建一个script标签,src里面就是请求的接口,
(直接在地址栏里输入地址都是get请求,所以jsonp只支持get请求)
3.等这个请求完成了,通过你传入的回调函数名字接收值
封装jsonp
function jsonp(url, fn) {
//路径和回调函数
//cbName是自己随便起的名字,这个名字用来接收回调函数
const cbName = 'cb' + Math.random().toString().replace('.', '');
//路径拼接回调函数的名字
url += '&callback=' + cbName;
//创建script标签
let script = document.createElement('script');
//设置src
script.src = url;
//window下取这个名字,拿回调函数接收值
window[cbName] = cdData => {
//cbData 这个值在这里就拿到了
fn(cdData);
//接收完了,就移除并且置为空 提升性能
document.body.removeChild(script);
window[cbName] = null;
}
//把创建好的script标签添加到body里面
document.body.appendChild(script);
}
调用
getResult(val) {
//利用百度实现jsonp
const url = 'https://m.baidu.com/sugrec?prod=wise&wd=' + val
执行jsonp的函数,传入地址和接收值的回调函数,
jsonp(url, data => {
//data就是值,
this.sugList = data.g.map(item => {
return item.q
})
console.log(this.sugList);
})
}