javascript+ajax仿百度搜索框智能提示
输入框内输入内容,实时显示搜索内容
点击搜索内容跳转播放页面
处理流程
问题和功能实现大致分为六部分:
1、什么时候请求数据或者触发请求数据的条件是什么?
2、怎么去请求数据?
3、数据怎么格式处理?
4、处理的数据怎么放到页面中?
5、实现键盘按键切换下拉提示
6、enter按键打开新页面,跳转到搜索结果
界面布局
- Mac窗口样式
- 窗口头部
- 三个按钮
- 搜索表单
- 一只小鸡
- inout 输入框
- button 按钮
- 窗口头部
<div id="Mac-windows">
<div id="windows-head">
<button id="exit"></button>
<button id="small"></button>
<button id="max"></button>
</div>
<form target="_self" id="search">
<img src="./img/images-02.png" />
<input type="text" name="" id="search-box" value="" autocomplete="off" />
<input type="submit" value="搜索" id="search-button" />
</form>
</div>
<div id="hint">
<ul id="data_result"></ul>
</div>
主要代码
常用函数封装
var getDOMid = function(id) {
return document.getElementById(id);
}
var getDOMClass = function(cla) {
return document.getElementsByClassName(cla);
}
var getElementLeft = function(element) {
var actualLeft = element.offsetLeft; //offsetLeft获取父元素左边的距离
var current = element.offsetParent;
while (current != null) {
actualLeft += current.offsetLeft;
current = current.offsetParent;
}
return actualLeft;
}
var getElementTop = function(element) {
var actualTop = element.offsetTop; //获取父元素顶部距离
var current = element.offsetParent;
while (current != null) {
actualTop += current.offsetTop;
current = current.offsetParent;
}
return actualTop;
}
封装事件函数
var addEvent = function(id, event, fn) {
var el = getDOMid(id) || document;
if (el.addEventListener) { //解决浏览器兼容问题
el.addEventListener(event, fn, false); //适合非IE浏览器
} else {
el.attachEvent('on' + event, fn); //适合IE浏览器
}
}
AJAX
var ajaxGet = function(url, callback) {
var _xhr = null;
// 考虑兼容性
if (window.XMLHttpRequest) {
_xhr = new XMLHttpRequest(); //非IE浏览器
} else if (window.ActiveXObject) {
_xhr = new ActiveXObject("Msxml2.XMLHTTP"); //IE浏览器
}
// 监听连接事件
_xhr.onreadystatechange = function() {
if (_xhr.readyState == 4 && _xhr.status == 200) {
callback(JSON.parse(_xhr.responseText)); //JSON.parse()是把字符串转成js可识别对象
}
}
_xhr.open('get', url, true);
_xhr.send();
}
提示框处理
提示框输入自动显示
addEvent('search-box', 'keyup', function() {
var _dom = getDOMid('hint');
_dom.style.top = getElementTop(getDOMid('search-box')) + 38 + 'px';
_dom.style.left = getElementLeft(getDOMid('search-box')) + 'px';
_dom.style.width = getDOMid('search-box').offsetWidth + 'px';
_dom.style.position = 'absolute';
_dom.style.display = 'block';
});
点击其他位置提示框隐藏
document.body.onclick = function() {
getDOMid('hint').style.display = 'none';
}
小鸡动画设置
鼠标移入—>小鸡向前移动,换图片
var chick = document.getElementsByTagName('img')[0]; chick.style.left = (getDOMid('search-box').offsetWidth / 2) - (chick.offsetWidth / 2) + 'px'; var n = parseInt(chick.style.left); addEvent('search-box', 'mousemove', function() { chick.src = "./img/images-01.png"; var time = setInterval(function() { if (n < 40) { clearInterval(time); } else { n -= 40; chick.style.left = n + 'px'; } }, 100); });
鼠标移出—>小鸡回归原位
addEvent('search-box', 'mouseout', function() { chick.src = "./img/images-02.png"; var box_width = parseInt((getDOMid('search-box').offsetWidth / 2) - (chick.offsetWidth / 2)); if (n < 30) { var time = setInterval(function() { n += 80; if (n > box_width) { clearInterval(time); } else { chick.style.left = n + 'px'; } }, 100) } });
如何获取网站API?
直接从开发者工具,监控网络,找到请求地址。
比如获取百度查询数据接口
https://sp0.baidu.com/5a1Fazu8AA54nxGko9WTAnF6hhy/su?wd=123&json=1&p=3&sid=26525_1468_21124_18559_26350_22073&req=2&bs=sp0.baidu.com%20API&pbs=sp0.baidu.com%20API&csor=3&pwd=s%27s%27s&cb=jQuery1102009673098249865686_1532417299552&_=1532417299572
再把api缩减了一下,删除了大部分暂时用不上的参数。
https://sp0.baidu.com/5a1Fazu8AA54nxGko9WTAnF6hhy/su?wd=关键词&json=1&p=3&cb=fn
必应搜索
http://api.bing.com/qsonhs.aspx?q=
百度搜索
https://sp0.baidu.com/5a1Fazu8AA54nxGko9WTAnF6hhy/su?wd=关键词&son=1&p=3&cb=fn
网盘搜索API
http://unionsug.baidu.com/su?cb=empty&wd=关键字&p=3&json=1
http://www.panduoduo.net/s/name/关键字
用原生js的确麻烦,会遇到请求失败,同源策略问题,得要学会用JSONP解决。。。
本作品采用 知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议 进行许可。