AJAX综合案例

实现百度搜索框的效果

在这里插入图片描述

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)
        }
    }
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值