我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Ajax实现关键字联想和自动补全功能及遇到坑

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Ajax实现关键字联想和自动补全功能及遇到坑

遇到的小坑

  • 回调函数相对window.onload的摆放位置
  • 给回调函数addData传数据时,如何操作才能将数据传进去

代码实现

前端代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>ajax实现关键字联想和自动补全</title>
    <style>
        *{
            margin: 0;
            padding: 0;
            box-sizing: border-box;
        }
        #keyWords{
            margin-top: 10px;
            margin-left: 10px;
            width: 300px;
            height: 25px;
            font-size: 20px;
            padding-left: 5px;
        }
        #dataDiv{
            background-color: wheat;
            width: 300px;
            margin-left: 10px;
            display: none;
        }
        #dataDiv p{
            padding-left: 10px;
            padding-top: 7px;
            padding-bottom: 3px;
            cursor: pointer;
        }
        #dataDiv p:hover{
            background-color: cornflowerblue;
            color: white;
        }
    </style>
</head>
<body>
    <!--
        需求:
            1. 给定文本输入框,显示层,显示层里的显示栏
            2. 当用户在文本框里输入数据时,发生keyup事件时,将文本框里的数据,以ajax请求方式提交的到后端
            3. 后端对前端提交的关键字,在数据库里进行模糊查询
            4. 将后端查询到的数据以json格式传给前端
            5. 前端解析后端传来的数据,将数据显示在提示栏里
            6. 当用户点击提示中的某条提示信息时,将提示栏里的信息赋给输入框,隐藏提示层
            注意:1. 凡是输入框里发生keyup事件时,都要进行ajax请求提交,实时获取提示信息
                 2. 输入框信息为空时,也要隐藏提示层
    -->
    <script>
        window.onload = function (){
            //获取dom对象
            input_txt = document.getElementById("keyWords")
            div_data = document.getElementById("dataDiv")
            //为输入框绑定keyup事件
            input_txt.onkeyup = function (){
                //输入框为空,隐藏提示层
                if(this.value.trim() == ""){
                    div_data.style.display = "none"
                }else{
                    //每当keyup时,发送ajax请求,传递文本框内数据
                    var xmlHttpRequest = new XMLHttpRequest();
                    xmlHttpRequest.onreadystatechange = function (){
                        if(this.readyState == 4){
                            if(this.status == 200){
                                //解析后端传来的json数据:[{"content" : "data"}, {}, {}]
                                var jsonArray = JSON.parse(this.responseText)
                                var html = ""
                                for(var i = 0; i < jsonArray.length; i++){
                                    var perData = jsonArray[i].content
                                    //为p标签绑定单击事件,将数据以字符串的形式传给回调函数
                                    html += "<p onclick='addData(\""+perData+"\")'>"+perData+"</p>"
                                }
                                div_data.innerHTML = html
                                div_data.style.display = "block"
                            }else{
                                alert("异常状态码: " + this.status)
                            }
                        }
                    }
                    xmlHttpRequest.open("GET", "/ajax/ajaxAutoComplete?keyWords="+this.value+"", true)
                    xmlHttpRequest.send()
                }
            }
        }
        function addData(perData){
            //完成自动补全
            input_txt.value= perData
            //隐藏提示层
            div_data.style.display = "none"
        }
    </script>
    <input type="text" id="keyWords">
    <div id="dataDiv">
        <!--
        <p>java</p>
        <p>jsp</p>
        <p>service</p>
        <p>servlet</p>
        <p>docker</p>
        <p>linux</p>
        -->
    </div>
</body>
</html>

后端代码

package com.examples.ajax.servlet;
import com.alibaba.fastjson.JSON;
import com.examples.ajax.beans.KeyWords;
import com.examples.ajax.utils.DBUtils;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
@WebServlet("/ajaxAutoComplete")
public class AjaxRequest13 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        //获取前端传来的关键字
        String keyWords = request.getParameter("keyWords");
        //连接数据库,进行模糊查询
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        //封装关键字对象
        List<KeyWords> keyWordsList = new ArrayList<>();
        try {
            conn = DBUtils.getConnection();
            String sql = "select content from tb_search where content like ?";
            ps = conn.prepareStatement(sql);
            ps.setString(1, keyWords + "%");
            rs = ps.executeQuery();
            while(rs.next()){
                String content = rs.getString("content");
                //封装成关键字对象
                KeyWords keyWordsObj = new KeyWords(content);
                //将关键字对象封装
                keyWordsList.add(keyWordsObj);
            }
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }finally {
            DBUtils.close(conn, ps, rs);
        }
        //后端数据json化
        String jsonKeyWordsArray = JSON.toJSONString(keyWordsList);
        //返回后端数据
        response.getWriter().write(jsonKeyWordsArray);
    }
}

用到的实体类

package com.examples.ajax.beans;
public class KeyWords {
    private String content;
    public KeyWords() {
    }
    public KeyWords(String content) {
        this.content = content;
    }
    public String getContent() {
        return content;
    }
    public void setContent(String content) {
        this.content = content;
    }
}

自己封装的jdbc工具类

package com.examples.ajax.utils;
import java.sql.*;
import java.util.ResourceBundle;

public class DBUtils {
    static ResourceBundle bundle = ResourceBundle.getBundle("jdbc");
    static String driver;
    static String url;
    static  String username;
    static  String password;
    static {
        driver = bundle.getString("driver");
        url = bundle.getString("url");
        username = bundle.getString("username");
        password = bundle.getString("password");
        try {
            Class.forName(driver);
        } catch (ClassNotFoundException e) {
            throw new RuntimeException(e);
        }
    }
    private DBUtils(){}
    public static Connection getConnection() throws SQLException {
        return DriverManager.getConnection(url, username, password);
    }
    public static void close(Connection conn, PreparedStatement ps, ResultSet rs){
        if(rs != null){
            try {
                rs.close();
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }
        }
        if(ps != null){
            try {
                ps.close();
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }
        }
        if(conn != null){
            try {
                conn.close();
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }
        }
    }
}

数据库表:

一张表: tb_search
数据表描述: 除了id, 就一个字段 content varchar(255) not null

效果展示:

自己在远程数据库上用docker运行了一个mysql数据库,查询速度比较慢,但演示关键字联想和自动补全功能的测试目的已经达到

到此这篇关于Ajax实现关键字联想和自动补全功能的文章就介绍到这了,更多相关ajax关键字自动补全内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Ajax实现关键字联想和自动补全功能及遇到坑

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Ajax实现关键字联想和自动补全功能及遇到坑

这篇文章主要介绍了Ajax实现关键字联想和自动补全功能,实现代码包括前端部分和后端部分,代码简单易懂,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
2022-11-13

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录