JSONP的原生实现和JQ实现(上)
JSONP
JSONP,全称:JSON with padding乍一看应该是和用来数据解析描述的JSON的某个远房亲戚。通过学习,这两者本质上完全是不同的东西。
JSONP的概念在这就不赘言。自己的理解,由于Ajax直接请求文件数据时,跨域无权访问(为了安全)。为了解决跨域问题,我们发现在页面调用JS文件时不受跨域影响(例如,我们在任意文件中都可以引入jq文件,从而使用jq开发页面),因此通过把数据装在一个js格式文件里,在客户端进行处理。这就是JSONP的原理。JSONP允许用户传递一个callback参数给服务器,之后服务器返回数据时通过这个参数的函数包裹上数据传给客户端。
下面不多说废话,下面用原生和jq分别写两个小获取baidu联想词条的小demo。
想要的效果就是当我在搜索条输入‘a’时,出现下拉联想列表(baidu的)

首先是原生实现方式:
我们先通过浏览器得到这一个数据请求。(在调试窗口的network中)
得到了请求:
Request URL:https://sp0.baidu.com/5a1Fazu8AA54nxGko9WTAnF6hhy/su?wd=a&json=1&p=3&sid=1424_21114_17001_21930_22036&req=2&csor=1&cb=jQuery1102023194193176203193_1487780037910&_=1487780037913
经过分析wd=a是我们联想的a(故这儿可以放我们想要联想的值);cb是callback回调函数。把其他的都干掉: https://sp0.baidu.com/5a1Fazu8AA54nxGko9WTAnF6hhy/su?wd=a&cb=show show随便起的回调函数名字。 之后代码如下:
function show(data) {
var oUl = document.getElementById('ull');
var arr = data.s;
oUl.innerHTML='';
for(var i=0;i<arr.length;i++){
var oLi=document.createElement('li');
oLi.innerHTML=arr[i];
oUl.appendChild(oLi);
}
}
window.onload = function () {
var oT = document.getElementById('inp');
oT.oninput = function () {
var str = oT.value;
var oScript = document.createElement('script');
oScript.src = `https://sp0.baidu.com/5a1Fazu8AA54nxGko9WTAnF6hhy/su?wd=${str}&cb=show`;
document.head.appendChild(oScript);
}
};
html
<body>
<input type="text" name="" value="" id="inp">
<input type="button" name="" value="baidu" id="inp">
<ul id="ull">
</ul>
</body>
当文本框有键盘输入事件时,我们在head标签下面动态的创建了一个script标签,标签的src中是放入了我们的请求wd,之后cb(回调函数)show来接受返回的data。并存储在ul的li下。效果如下:
