模拟百度联想词 跨域 不可以用Ajax 不支持跨域
解决跨域手段
1、flash
2、服务器中转代理
浏览器受同源策略的限制不可以实现跨域访问 可首先访问本地服务器 由本服务器代理访问百度服务器 将数据带回本地再经由浏览器访问本地服务器获取数据,完成跨域
3、jsonp 数据交换协议 动态创建script标签实现
4、document.domain(针对基础域名相同的情况)
bj.58.com document.domain = '58.com'
tj.58.com document.domain = '58.com'
----------------------------------------------------------------------
JSONP原理
1.Web页面上用<script> 引入 js文件时则不受是否跨域的影响 (不仅如此,我们还发现凡是拥有"src"这个属性的标签都拥有跨域的能力,比如<script>、<img>、<iframe>)
2.于是我们把数据放到服务器上,并且数据为json形式(因为js可以轻松处理json数据)
3.因为我们无法监控通过<script>的src属性是否把数据获取完成,所以我们需要做一个处理。
4.实现定义好处理跨域获取数据的函数,如 function doJSON(data){}。
5.用src获取数据的时候添加一个参数cb=‘doJSON’ (服务端会根据参数cb的值返回 对应的内容) 此内容为以cb对应的值doJSON为函数真实要传递的数据为函数的参数的一串字符 如 doJSON(’数据’)
固定步骤
动态创建script标签 设置src的路径 将标签下插入到body中
jsonp跨越访问与Ajax本质区别
jsonp通过动态创建script标签来实现跨域操作
Ajax通过创建xmlhttpRequest()对象来实现数据的请求
以下实现百度联想词
<script>
var inp = document.getElementById('inp');
var ul = document.getElementById('ul');
inp.oninput = function() {
var value = this.value;
var oscript = document.createElement('script');
oscript.src = 'https://www.baidu.com/sugrec?pre=1&p=3&ie=utf-8&json=1&prod=pc&from=pc_web&sugsid=1432,21123,29523,29721,29568,29220&wd=' + value + '&r&cb=show';
//wd指的是搜索字段 cb指的是请求数据后回调函数
$('body').append(oscript);
}
function show(data) {
console.log(data);
var str = '';
var res = data.g;
if ((res)) {
res.forEach(ele => {
str += '<li> <a href="https://www.baidu.com/s?ie=UTF-8&wd=' + ele.q + '">' + ele.q + '</a></li>'
//wd指的是搜索字段 cb指的是请求数据后回调函数
//原理相同只是用的百度地址
ul.innerHTML = str;
ul.style.display = 'block'
});
} else {
ul.style.display = 'none'
}
}
</script>