实现百度搜索框的效果
search.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
#imgDiv{
margin-left: 600px;
margin-top: 200px;
}
#par{
width: 600px;
height: 480px;
position: absolute;
left: 30%;
}
#keyword{
width: 400px;
height: 30px;
margin-top: 30px;
border: 1px solid green;
}
#search{
margin-top: 30px;
width: 150px;
height: 36px;
font-size: 20px;
}
.tdHover{
background-color: pink;
font-size: 20px;
}
</style>
</head>
<body>
<div id="imgDiv">
<img src="imgs/logo.png" width="480"/>
</div>
<div id="par">
<input type="text" id="keyword" onkeyup="getContent()">
<input type="button" id="search" value="search一下">
<table>
<tbody id="bodyId">
<!--<tr>
<td>java</td>
</tr>-->
</tbody>
</table>
</div>
</body>
</html>
SearchServlet.java(给XMLHttpRequest提供URL)
//需要gson-2.8.0.jar
import com.google.gson.Gson;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
@WebServlet(name = "SearchServlet", urlPatterns = "/SearchServlet")
public class SearchServlet extends HttpServlet {
//模拟数据源
private static List<String> datas = new ArrayList<>();
static {
datas.add("java");
datas.add("javascript");
datas.add("jsp");
datas.add("jstl");
datas.add("aaaa");
datas.add("abc");
datas.add("bbbb");
datas.add("zzzz");
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//从页面获取参数
String keyword = request.getParameter("keyword");
//调用getContent方法获取list
List list = getContent(keyword);
Gson g = new Gson();
//将list转换为字符串
String json = g.toJson(list);
//将json输出到页面显示
response.getWriter().write(json);
}
private List<String> getContent(String keyword){
if(keyword == null || keyword.length() == 0){
return datas;
}
List<String> list = new ArrayList<>();
for(String s : datas){
//字符串中包含keybody就加入到集合中
//String.contains(String str)看字符串中是否包含子字符串
if(s.contains(keyword)){
list.add(s);
}
}
//对集合进行排序
Collections.sort(list);
return list;
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
在search.html中编写ajax
<script>
// 声明一个全局的XMLHttpRequest对象
var xhr;
// 兼容所有浏览器创建XMLHttpRequest对象
function create(){
if(window.XMLHttpRequest){
// ie7+, ff, openra, safiri , chrome
xhr = new XMLHttpRequest();
}else{
// ie5, ie6
xhr = new ActiveXObject("Mricosft.XMLHTTP");
}
}
// 键盘事件出发该函数
function getContent(){
// 创建XMLHttpRequest对象
create();
//alert(xhr)
//console.log(xhr);
// 拿到用户在输入框中的值
var keyword = document.getElementById("keyword").value;
//alert(keyword);
// ajax的第二步,open()方法,三个参数,请求方式,url,异步
xhr.open("GET", "SearchServlet?keyword=" + keyword, true);
// ajax的第三步,send()发送请求
xhr.send();
// XMLHttpRequest对象的状态监控,调用回调函数
xhr.onreadystatechange = callback;
}
// 回调函数
function callback(){
// 监控状态
if(xhr.readyState == 4 && xhr.status == 200){
//alert(xhr.responseText)
// 拿到后台传递过来的数据
var content = xhr.responseText;
// 将字符串转换为json对象
content = eval(content);
// 给tbody里面动态添加tr、td、textNode
createTD(content);
// 动态地给每个td设置监听
setListener(content);
}
}
// 设置监听
function setListener(c){
// 分别给每个td设置鼠标悬浮、鼠标离开和点击事件
var size = c.length;
for(var i = 0; i < size; i++){
// 鼠标悬浮,让悬浮的td有一个专门的样式tdHover
document.getElementById("id" + i).addEventListener("mouseover", function () {
this.setAttribute("class", "tdHover");
}, false)
// 鼠标离开,让离开之后的td没有了之前的样式tdHover
document.getElementById("id" + i).addEventListener("mouseout", function () {
this.setAttribute("class", "kill");
}, false)
// 点击事件,用户点击该td之后,让td的内容填充给keyword输入框,并且消除tbody的所有内容
document.getElementById("id" + i).addEventListener("click", function () {
// keyword的内容直接是当前的文本内容
document.getElementById("keyword").value = this.innerText;
// 动态清理tbody中的所有子元素
clearTD();
}, false)
}
}
// 动态的创建tr、td以及textNode
function createTD(c){
// 每一次创建之前,需要将之前tbody的所有内容清空
clearTD();
// 拿到tbody
var tbody = document.getElementById("bodyId");
// 分别动态的创建tr、td textNode
//alert(c.length);
for(var i = 0; i < c.length; i++){
var cc = c[i];
var tr = document.createElement("tr");
var td = document.createElement("td");
var tvalue = document.createTextNode(cc);
// 给每个tid设置一个id
td.setAttribute("id", "id" + i);
// 分别将textNode添加到td
// 将td添加到tr
// 将tr添加到tbody中
td.appendChild(tvalue);
tr.appendChild(td);
tbody.appendChild(tr);
}
}
// 逆序动态清理tbody中的所有内容
function clearTD(){
var tbody = document.getElementById("bodyId");
var size = tbody.childNodes.length;
for(var i = size - 1; i >= 0; i--){
// 删除tbody中的所有的子元素
tbody.removeChild(tbody.childNodes[i]);
}
}
</script>
实现效果
实现思路
-
兼容所有浏览器创建XMLHttpRequest对象。
// 声明一个全局的XMLHttpRequest对象 var xhr; // 兼容所有浏览器创建XMLHttpRequest对象 function create(){ if(window.XMLHttpRequest){ // ie7+, ff, openra, safiri , chrome xhr = new XMLHttpRequest(); }else{ // ie5, ie6 xhr = new ActiveXObject("Mricosft.XMLHTTP"); } }
-
ajax实现动态获取数据
// 键盘事件触发该函数 function getContent(){ // 创建XMLHttpRequest对象 create(); //alert(xhr) //console.log(xhr); // 拿到用户在输入框中的值 var keyword = document.getElementById("keyword").value; //alert(keyword); // ajax的第二步,open()方法,三个参数,请求方式,url,异步 xhr.open("GET", "SearchServlet?keyword=" + keyword, true); // ajax的第三步,send()发送请求 xhr.send(); // XMLHttpRequest对象的状态监控,调用回调函数 xhr.onreadystatechange = callback; } // 回调函数 function callback(){ // 监控状态 if(xhr.readyState == 4 && xhr.status == 200){ //alert(xhr.responseText) // 拿到后台传递过来的数据 var content = xhr.responseText; // 将字符串转换为json对象 content = eval(content); // 给tbody里面动态添加tr、td、textNode createTD(content); // 动态地给每个td设置监听 setListener(content); } }
-
给tbody里面动态添加tr、td、textNode
// 动态的创建tr、td以及textNode function createTD(c){ // 每一次创建之前,需要将之前tbody的所有内容清空 clearTD(); // 拿到tbody var tbody = document.getElementById("bodyId"); // 分别动态的创建tr、td textNode //alert(c.length); for(var i = 0; i < c.length; i++){ var cc = c[i]; var tr = document.createElement("tr"); var td = document.createElement("td"); var tvalue = document.createTextNode(cc); // 给每个tid设置一个id td.setAttribute("id", "id" + i); // 分别将textNode添加到td // 将td添加到tr // 将tr添加到tbody中 td.appendChild(tvalue); tr.appendChild(td); tbody.appendChild(tr); } }
此时基本实现功能,但会出现tbody中数据不断重复的现象,所以需要在每次键盘事件后对数据进行清理
-
逆序动态清理tbody中的所有内容
function clearTD(){ var tbody = document.getElementById("bodyId"); var size = tbody.childNodes.length; for(var i = size - 1; i >= 0; i--){ // 删除tbody中的所有的子元素 tbody.removeChild(tbody.childNodes[i]); } }
-
动态地给每个td设置监听,分别给每个td设置鼠标悬浮、鼠标离开和点击事件
// 设置监听 function setListener(c){ // 分别给每个td设置鼠标悬浮、鼠标离开和点击事件 var size = c.length; for(var i = 0; i < size; i++){ // 鼠标悬浮,让悬浮的td有一个专门的样式tdHover document.getElementById("id" + i).addEventListener("mouseover", function () { this.setAttribute("class", "tdHover"); }, false) // 鼠标离开,让离开之后的td没有了之前的样式tdHover document.getElementById("id" + i).addEventListener("mouseout", function () { this.setAttribute("class", "kill"); }, false) // 点击事件,用户点击该td之后,让td的内容填充给keyword输入框,并且消除tbody的所有内容 document.getElementById("id" + i).addEventListener("click", function () { // keyword的内容直接是当前的文本内容 document.getElementById("keyword").value = this.innerText; // 动态清理tbody中的所有子元素 clearTD(); }, false) } }