异步通信技术AJAX | AJAX实现搜索联想和自动补全

news2024/9/23 11:27:53

目录

一:AJAX实现搜索联想和自动补全

二:HTTP状态信息


一:AJAX实现搜索联想和自动补全

(1)实现的原理

(1)什么是搜索联想?自动补全?

①百度是一个很典型的代表。在百度的搜索框中输入相关信息的时候,会有搜索联想以及自动补全。

②搜索联想和自动补全:实际上是为了方便用户的使用,让用户的体验更好。

③搜索联想:当用户输入一些单词之后,自动联想出用户要搜索的信息,给一个提示。

④自动补全:当联想出一些内容之后,用户点击某个联想的单词,然后将这个单词自动补全到搜索框当中。

⑤搜索联想和自动补全功能,因为是页面局部刷新效果,所以需要使用ajax请求来完成。

(2)搜索联想,自动补全功能的核心实现原理?

①当键盘事件发生之后,比如keyup:键弹起事件。

②会发送ajax请求,请求中提交用户输入的搜索内容,例如:北京(发送ajax请求,携带“北京”两个字)。

③后端接收到ajax请求,接收到“北京”两个字,执行select语句进行模糊查询,返回查询结果

④将查询结果封装成json格式的字符串,将json格式的字符串响应到前端。

⑤前端接收到json格式的字符串之后,解析这个json字符串,动态展示页面。 

(2)页面实现

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>ajax实现搜索联想和自动补全功能</title>
    <style type="text/css">
        /* 类选择器,设置input标签,text边框*/
        .userInput {
            width: 300px; /*框宽*/
            height: 25px; /*框高*/
            font-size: 20px; /*里面字大小*/
            padding-left: 5px; /*内补丁,距离框的距离*/
        }

        /*类选择器,设置div的样式*/
        .showDataDiv {
            width: 309px; /*宽度*/
            border: 1px solid lightgray; /*实线边框*/
            background-color: antiquewhite; /*设置背景颜色*/
            display: none; /*设置开始的div是隐藏的,不显示*/
        }
        /*设置p标签*/
        .showDataDiv p {
            padding-left: 5px; /*内补丁,距离框的距离*/
            margin-top: 2px; /*外补丁,p距离顶部的宽度*/
            margin-bottom: 2px; /*外补丁,p距离低部的宽度*/
        }
        /*p标签增加动作,点到其中一个选项变色并变成小手*/
        .showDataDiv p:hover {
            cursor: pointer; /*鼠标变成小手*/
            border: 1px blue solid; /*每选中一行,增加实线边框*/
            background-color: aliceblue; /*设置变换的背景色*/
        }
    </style>
</head>
<body>

<!--文本框-->
<input type="text" class="userInput" id="keywords">
<!--div盒子-->
<div id="datadiv" class="showDataDiv">
<!--<p>北京疫情最新情况</p>
    <p>北京天气</p>
    <p>北京时间</p>
    <p>北京人</p>-->
</div>
</body>
</html>

页面展示

(3)设置数据库表

drop table if exists t_ajax;
create table t_ajax(
    id int primary key auto_increment,
    content varchar(255)
);
insert into t_ajax(content) values('javascript');
insert into t_ajax(content) values('javaweb');
insert into t_ajax(content) values('java');
insert into t_ajax(content) values('java123');
insert into t_ajax(content) values('mysql');
insert into t_ajax(content) values('myweb');
insert into t_ajax(content) values('myapp');
insert into t_ajax(content) values('jdk');
commit;
select * from t_ajax;

效果展示 

(4)前端代码实现

①只要keyup键盘事件发生,就发送Ajax请求,把输入的数据(this.value)发送出去

②首先就要连接数据库进行模糊查询,实现搜索联想功能

③然后我们点击div的<p>标签的内容时,会进行自动补全到文本框

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>ajax实现搜索联想和自动补全功能</title>
    <style type="text/css">
        /* 类选择器,设置input标签,text边框*/
        .userInput {
            width: 300px; /*框宽*/
            height: 25px; /*框高*/
            font-size: 20px; /*里面字大小*/
            padding-left: 5px; /*内补丁,距离框的距离*/
        }

        /*类选择器,设置div的样式*/
        .showDataDiv {
            width: 309px; /*宽度*/
            border: 1px solid lightgray; /*实线边框*/
            background-color: antiquewhite; /*设置背景颜色*/
            display: none; /*设置开始的div是隐藏的,不显示*/
        }
        /*设置p标签*/
        .showDataDiv p {
            padding-left: 5px; /*内补丁,距离框的距离*/
            margin-top: 2px; /*外补丁,p距离顶部的宽度*/
            margin-bottom: 2px; /*外补丁,p距离低部的宽度*/
        }
        /*p标签增加动作,点到其中一个选项变色并变成小手*/
        .showDataDiv p:hover {
            cursor: pointer; /*鼠标变成小手*/
            border: 1px blue solid; /*每选中一行,增加实线边框*/
            background-color: aliceblue; /*设置变换的背景色*/
        }
    </style>
</head>
<body>

<script type="text/javascript">
    window.onload = function() {
        document.getElementById("keywords").onkeyup = function(){
            if (this.value == "") {
                // 如果为空串,就把div隐藏起来
                // 不然查询联想之后,删除查询的内容,下面div还是保持原状
                document.getElementById("datadiv").style.display = "none"
            }else{
                // 发送ajax请求
                // 1. 创建AJAX核心对象
                var xmlHttpRequest = new XMLHttpRequest();
                // 2. 注册回调函数
                xmlHttpRequest.onreadystatechange = function() {
                    if (xmlHttpRequest.readyState == 4) {
                        if (xmlHttpRequest.status >= 200 && xmlHttpRequest.status < 300) {
                            // [{"content":"javascript"},{"content":"javaweb"},{"content":"java..."}]
                            var json = JSON.parse(xmlHttpRequest.responseText);
                            // 遍历数组
                            var html = ""
                            for (var i = 0; i < json.length; i++) {
                                // 点击p标签执行一个回调函数,把内容显示到文本框中
                                html += "<p onclick='setInput(\""+json[i].content+"\")'>"+json[i].content+"</p>"
                            }
                            // 让数据在div展示出来
                            document.getElementById("datadiv").innerHTML = html
                            // 让div显示出来
                            document.getElementById("datadiv").style.display = "block"
                        }
                    }
                }
                // 3. 开启通道,并把数据传过去,连接数据库进行模糊查询
                xmlHttpRequest.open("GET", "/auto_complete/query?_="+new Date().getTime()+"&keywords=" + this.value, true)
                // 4. 发送请求
                xmlHttpRequest.send()
            }

        }
    }

    // 实现自动补全功能
    function setInput(content){
        // 先把数据显示到文本框中
        document.getElementById("keywords").value = content
        // 显示到文本框后,再次把div进行隐藏
        document.getElementById("datadiv").style.display = "none"
    }
</script>

<!--文本框-->
<input type="text" class="userInput" id="keywords">
<!--div盒子-->
<div id="datadiv" class="showDataDiv">
    <!--<p>北京疫情最新情况</p>
    <p>北京天气</p>
    <p>北京时间</p>
    <p>北京人</p>-->
</div>
</body>
</html>

(5)后端代码实现

主要是根据发过来的数据,连接数据库进行模糊查询;把查询结果拼成JSON格式的字符串

package com.bjpowernode.zl;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import java.io.IOException;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;

@WebServlet("/query")
public class QueryServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // 获取用户输入的关键字
        String keywords = request.getParameter("keywords");
        // jdbc代码连接数据库,根据关键字查询数据库,返回数据,拼接json格式的字符串
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        // 拼成JSON格式的字符串
        StringBuilder sb = new StringBuilder();
        sb.append("[");
        try {
            // 注册驱动
            Class.forName("com.mysql.jdbc.Driver");
            // 获取连接
            String url = "jdbc:mysql://localhost:3306/bjpowernode?useUnicode=true&characterEncoding=UTF-8";
            String user = "root";
            String password = "***";
            conn = DriverManager.getConnection(url, user, password);

            String sql = "select content from t_ajax where content like ?"; // 模糊查询的时候,条件不建议使用%开始,因为会让字段上的索引失效,查询效率降低。
            ps = conn.prepareStatement(sql);
            ps.setString(1, keywords + "%");
            rs = ps.executeQuery();
            // [{"content":"javascript"},{"content":"javaweb"},{"content":"java..."}]
            while (rs.next()) {
                String content = rs.getString("content");
                sb.append("{\"content\":\""+content+"\"},");
            }

        }catch(Exception e){
            e.printStackTrace();
        } finally {
            if (conn != null) {
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (ps != null) {
                try {
                    ps.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (rs != null) {
                try {
                    rs.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
        // 最后会多一个逗号,进行截串
        response.setContentType("text/html;charset=UTF-8");
        response.getWriter().print(sb.subSequence(0, sb.length() - 1) + "]");

    }
}

(6)动图效果展示 

二:HTTP状态信息

1xx: 信息

消息:描述:
100 Continue服务器仅接收到部分请求,但是一旦服务器并没有拒绝该请求,客户端应该继续发送其余的请求。
101 Switching Protocols服务器转换协议:服务器将遵从客户的请求转换到另外一种协议。

2xx: 成功

消息:描述:
200 OK请求成功(其后是对GET和POST请求的应答文档。)
201 Created请求被创建完成,同时新的资源被创建。
202 Accepted供处理的请求已被接受,但是处理未完成。
203 Non-authoritative Information文档已经正常地返回,但一些应答头可能不正确,因为使用的是文档的拷贝。
204 No Content没有新文档。浏览器应该继续显示原来的文档。如果用户定期地刷新页面,而Servlet可以确定用户文档足够新,这个状态代码是很有用的。
205 Reset Content没有新文档。但浏览器应该重置它所显示的内容。用来强制浏览器清除表单输入内容。
206 Partial Content客户发送了一个带有Range头的GET请求,服务器完成了它。

3xx: 重定向

消息:描述:
300 Multiple Choices多重选择。链接列表。用户可以选择某链接到达目的地。最多允许五个地址。
301 Moved Permanently所请求的页面已经转移至新的url。
302 Found所请求的页面已经临时转移至新的url。
303 See Other所请求的页面可在别的url下被找到。
304 Not Modified未按预期修改文档。客户端有缓冲的文档并发出了一个条件性的请求(一般是提供If-Modified-Since头表示客户只想比指定日期更新的文档)。服务器告诉客户,原来缓冲的文档还可以继续使用。
305 Use Proxy客户请求的文档应该通过Location头所指明的代理服务器提取。
306 Unused此代码被用于前一版本。目前已不再使用,但是代码依然被保留。
307 Temporary Redirect被请求的页面已经临时移至新的url。

4xx: 客户端错误

消息:描述:
400 Bad Request服务器未能理解请求。
401 Unauthorized被请求的页面需要用户名和密码。
402 Payment Required此代码尚无法使用。
403 Forbidden对被请求页面的访问被禁止。
404 Not Found服务器无法找到被请求的页面。
405 Method Not Allowed请求中指定的方法不被允许。
406 Not Acceptable服务器生成的响应无法被客户端所接受。
407 Proxy Authentication Required用户必须首先使用代理服务器进行验证,这样请求才会被处理。
408 Request Timeout请求超出了服务器的等待时间。
409 Conflict由于冲突,请求无法被完成。
410 Gone被请求的页面不可用。
411 Length Required"Content-Length" 未被定义。如果无此内容,服务器不会接受请求。
412 Precondition Failed请求中的前提条件被服务器评估为失败。
413 Request Entity Too Large由于所请求的实体的太大,服务器不会接受请求。
414 Request-url Too Long由于url太长,服务器不会接受请求。当post请求被转换为带有很长的查询信息的get请求时,就会发生这种情况。
415 Unsupported Media Type由于媒介类型不被支持,服务器不会接受请求。
416服务器不能满足客户在请求中指定的Range头。
417 Expectation Failed

5xx: 服务器错误

消息:描述:
500 Internal Server Error请求未完成。服务器遇到不可预知的情况。
501 Not Implemented请求未完成。服务器不支持所请求的功能。
502 Bad Gateway请求未完成。服务器从上游服务器收到一个无效的响应。
503 Service Unavailable请求未完成。服务器临时过载或当机。
504 Gateway Timeout网关超时。
505 HTTP Version Not Supported服务器不支持请求中指明的HTTP协议版本。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/141117.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

易基因|DNA甲基化揭示肌痛性脑脊髓炎/慢性疲劳综合征在复发和恢复周期中的动态表观变化

大家好&#xff0c;这里是专注表观组学十余年&#xff0c;领跑多组学科研服务的易基因。2022年10月06日&#xff0c;《Int J Mol Sci》杂志发表题为“Dynamic Epigenetic Changes during a Relapse and Recovery Cycle in Myalgic Encephalomyelitis/Chronic Fatigue Syndrome”…

大数据挖掘课程案例资源介绍

大数据挖掘课程案例资源分为【基础】版&#xff0c;【进阶】版&#xff0c;不同阶段的课程难易程度不一样&#xff0c;对学生的基础知识掌握要求也不一样。 【基础】Python编程基础 通过学习本课程可掌握Python 开发环境的搭建、Python 基础入门、函数、面向对象编程、…

初识PHP原生类

目录 DirectoryIterator SplFileInfo DirectoryIterator 适用&#xff1a;PHP 5, PHP 7, PHP 8 __toString()方法可以获取字符串形式的文件名 <?php highlight_file(__file__); $dir $_GET[dir]; $a new DirectoryIterator($dir); foreach($a as $f){echo($f->__toS…

【Linux操作系统】编辑器天花板vim与一键配置vim

文章目录一vim简介二.命令模式1.光标定位操作2.光标移动操作3.文本复制&#xff0c;粘贴&#xff0c;删除&#xff0c;剪切操作三.插入模式四.替换模式五.底行模式1.分屏操作2.不退出vim执行Linux指令3.全局查找.替换4.退出vim六.vim配置1.各配各的2.配置方案七.添加root信任用…

高校房产管理系统平台架构分析

数图互通高校房产综合管理信息系统是基于公司自主研发的FMCenterV5.0平台&#xff0c;是针对中国高校房产的管理特点和管理要求&#xff0c;研发的一套标准产品&#xff1b;通过在中国100多所高校的成功实施和迭代&#xff0c;形成了一套成熟、完善、全生命周期的房屋资源管理解…

网络规划.弱电CAD设计规范

机柜是机房布线中必不可少的设备&#xff0c;关于机柜的品牌与安装细节&#xff0c;尤其是关于机柜内部的设备布置。一个 全面的数据中心机房设计 一般包括&#xff1a;综合布线、抗静电地板铺设、棚顶墙体装修、隔断装修、UPS、专用恒温恒湿空调、机房环境监控系统、新风系统、…

VC调用AutoCAD自动化的两种方法(包装类、接口)使用详解

----哆啦刘小洋 原创&#xff0c;转载需说明出处 2022-12-29 VC调用AutoCAD自动化1 简介2 AutoCAD的Automation类型库说明文件3 包装类方式3.1 VC63.2 VC20224 接口调用方式5 两种方式对比5.1 使用便捷性5.2 兼容性5.3 结论6 后记1 简介 在工程领域&#xff0c;使用AutoCAD时经…

(小程序)后台交互--个人中心

目录 一、微信登录流程简介 二、微信用户获取用户昵称头像和昵称 ① wx.getUserProfile ——> 获取头像 三、微信登录流程代码详解 1.bindgetuserinfo——>把小程序端搭建起来 ① oa-mini 2.登录-小程序 ① wx.checkSession ② wx.login ③ wx.request 3.后台…

Python - 数据容器list(列表)

目录列表的定义列表的下标&#xff08;索引&#xff09;列表的常用操作查找某元素的下标index修改特定位置&#xff08;索引&#xff09;的元素值插入元素insert追加元素append追加元素方式extend删除元素pop与del删除某元素在列表中的第一个匹配项remove清空列表内容clear()统…

【JavaScript】获取和操作 DOM 节点

文章目录【JavaScript】获取和操作 DOM 节点一. DOM节点分类二. 获取节点(1) 获取元素节点1. 非常规元素节点2. 常规元素节点(2) 获取节点的方式三. 操作节点(1) 创建节点(2) 插入节点(3) 删除节点(4) 替换节点(5) 克隆节点(6) 节点属性四. 案例&#xff1a;微博发布【JavaScri…

使用云开发的垃圾分类、垃圾识别、答题的微信小程序源码+部署教程,文字识别垃圾类型、语音识别垃圾类型、图片识别类型、垃圾类别答题

使用云开发的垃圾分类、垃圾识别、答题的微信小程序 完整代码下载地址&#xff1a;使用云开发的垃圾分类、垃圾识别、答题的微信小程序 前言 项目介绍 小程序使用了云开发&#xff0c;包含文字识别垃圾类型、语音识别垃圾类型、图片识别类型、垃圾类别答题、腾讯机器人对话…

AndroidStudio启动app时闪退问题解决过程

问题描述: Android app在启动时闪退的问题有很多种,大部分可能集中在代码有问题上,譬如StartActivity的时候启动不了。 看提示里一般是有错误出现的,这个很好解决,只要找到对应的错误就可以了。 那么,还有一类问题,就是我这里出现的,启动成功,没有任何错误,查看lo…

Odoo 16 企业版手册 - 库存管理之库存调拨

库存调拨 拥有多个仓库的公司需要管理产品从一个地点转移到另一个地点。在某些情况下&#xff0c;公司可能在不同地点设有不同的分支机构&#xff0c;这需要付出巨大努力才能成功管理产品调拨。公司通常通过分配主要仓库和子仓库进行产品分销来管理这种情况。Odoo中的调拨功能支…

SpringBoot+JWT+Shiro+MybatisPlus实现Restful快速开发后端脚手架

一、背景 前后端分离已经成为互联网项目开发标准&#xff0c;它会为以后的大型分布式架构打下基础。SpringBoot使编码配置部署都变得简单&#xff0c;越来越多的互联网公司已经选择SpringBoot作为微服务的入门级微框架。 Mybatis-Plus是一个 Mybatis 的增强工具&#xff0c;有…

房产管理系统系统与数据中心对接要遵循的标准和规范

数图互通高校房产综合管理系统平台是基于公司自主研发的FMCenterV5.0平台&#xff0c;是针对中国高校房产的管理特点和管理要求&#xff0c;研发的一套标准产品&#xff1b;通过在中国100多所高校的成功实施和迭代&#xff0c;形成了一套成熟、完善、全生命周期的房屋资源管理解…

票务公司网上订票系统

课程设计题目七&#xff1a;票务公司网上订票系统https://download.csdn.net/download/qq_45037155/87364367 点击此链接免费下载原文章&#xff01; 第1章 绪论 1.1 引言 在当今社会&#xff0c;速度决定了很多商业机构的成败。为了顺应时代发展&#xff0c;提高效率&#x…

2023年山东建筑安全员考试真题题库及答案

百分百题库提供建筑安全员考试试题、安全员证考试真题、安全员证考试题库等,提供在线做题刷题&#xff0c;在线模拟考试&#xff0c;助你考试轻松过关。 51.申请从事建筑施工特种作业的人员,应当具备()基本条件。 A.年满18周岁且符合相关工种规定的年龄要求; B.经医院体检合格…

【Java多线程JUC入门详解】AQS原理详解

AQS 概述 AbstractQuenedSynchronizer抽象的队列式同步器, 在java.util.concurrent.locks包下。 我们常用的ReentrantLock中有一个抽象静态内部类Sync&#xff0c;就继承自AbstractQuenedSynchronizer。 abstract static class Sync extends AbstractQueuedSynchronizer { …

1.4日报

验收了TestMrlController 历经千辛万苦给电脑安装了vpn 因为昨天系统损坏&#xff0c;今天重新配置postman和navicat 遇到的困难及解决 linux安装vpn时官方给的教程&#xff1a; 可是ubnutu里没有yum&#xff0c;我得先下载yum 而默认镜像源里找不到yum软件包&#xff0c;…

单调栈 单调队列 专题

文章目录一、单调栈1、问题模型2、实现过程&#xff1a;3、代码实现4、规律总结5、题目练习二、单调队列1、问题模型2、实现过程&#xff1a;3、代码实现4、规律总结5、题目练习三、总结一、单调栈 1、问题模型 主要解决一类问题&#xff1a; O(n)O(n)O(n) 求数列中每个元素左…