其实不是要随机,而是要唯一性。因为 JSONP 的回调实际上是创建了一个临时的函数供加载的 js 调用。如果不唯一的话,同时发出多个 JSONP 请求,前面的函数就会被覆盖掉,后面的方法就没法执行了。
如果你能确保页面中不会同时出现多个请求, 也没Jsonp请求的响应体通常为 callback(dataObject),callback即回调函数名。为保证Jsonp正常运作,在发出请求之前需要在window对象上放置回调函数。假设回调函数不是随机的,那在连续JSONP请求时,后发出的请求放置的回调函数会覆盖掉之前的,回调数据会出问题所谓。
<script>
//调用百度jsonp 模拟百度搜索
// https://www.baidu.com/sugrec?prod=pc&wd=H5&cb=callback
// wd=H5 关键词
// cb 回调函数名
var searchCon = document.getElementsByClassName("searchCon")[0];
var list = document.getElementsByClassName("list")[0];
// function callback(result) {
// console.log(result);
// }
searchCon.oninput = function () {
var search = this.value;
var callbackName = "JSONP_" + Math.random().toString().replace(".", "");
var script = document.createElement("script");
script.src = `https://www.baidu.com/sugrec?prod=pc&wd=${search}&cb=${callbackName}`;
//给全局的window上定义一个function
window[callbackName] = function(result){
// if(datalist.)
var datalist = result.g;
// console.log(result);
if(datalist)
{
var html = "";
datalist.forEach(item => {
var data = item.q;
html += ` <li><a href="">${data}</a></li>`;
});
list.style.display = "block";
list.innerHTML = html;
}else{
list.style.display = "none";
}
script.remove();
}
document.body.appendChild(script);
}
</script>