js实现搜索框智能搜索提示,类似百度搜索

一、概要

场景:用户可能记不得是哪个搜索词了,但是结果表单是唯一的,不可能实现模糊搜索。

解决方案:搜索框实现智能搜索提示。在用户搜索键入关键字的过程中,不断去请求后台,将查询结果放置在<ul>标签里面,起到提示作用。

实现过程(以我的需求场景和开发过程为例):

1、后台提供搜索接口。实现对键入值的模糊查询,返回查询结果给前台。

2、“接口编号”input框绑定onkeyup事件,在onkeyup函数中,设置监听时间,我设置的当键入停止0.7s后,调用后台提供的查询接口。

3、接口返回查询结果后,将值赋到<ul>标签中。(这个过程略复杂,需要有一定CSS基础,要不会像我一样搜啊搜啊搜)

效果如图:

image

二、详解

所有所有的教程都在代码里了,注释很全很详细。

1、后台代码

/**
* 模糊查询客户端页面所有接口
*/
@GetMapping(value = "/queryClientAllImpNo")
@ResponseBody
public ResultVO queryClientAllImpNo(String impNo) {
    List<String> impNoList = clientPageService.queryClientAllImpNo(impNo);
    return new ResultVO<>(impNoList);
}

2、前台代码


<input class="paramInput" type="text" name="impNo" id="impNo" onkeyup="queryAllImpNo()"/>

<ul id="impNoListUl"></ul>

<style>
    /**------------------------------------------- 模糊查询CSS---------------------------------------------------*/
    #impNoListUl {
        z-index: 999; // 实现将ul浮现在页面最上层
        position: absolute; // 绝对定位,实现ul位置不变
        list-style-type: none; // 去除ul的原有格式
        margin-left: 80px; // 以下皆是对着页面调整,使ul框在搜索input下,宽度一致
        margin-top: -18px;
        width: 168px;
        padding: 0px;
        border: black 1px solid;
    }

    #impNoListUl li {
        width: 168px; // 对准input搜索框的宽度
    }

    #impNoListUl li:hover { // 设置鼠标悬浮事件
        background-color: rgb(219, 235, 255); // 鼠标悬浮时,背景颜色改变
        cursor: pointer; // 鼠标悬浮时,鼠标指针变小手
    }
  </style>
//等待用户不输入 0.7 秒后再去调用查询接口
var loseInputMillsecs = 700;
var clocker = null;

// input搜索框的onkeyup事件函数

function queryAllImpNo() {
    let impNo = $('#impNo').val();

  // input框键入内容为空时,不查询,因为数据太多可能会出现问题,而且太积极了也不好~

    if (impNo != null && impNo != '') { 
        if (null == clocker) {

            // 设置的loseInputMillsecs为0.7秒,
            // setTimeout()函数可以实现等待0.7后调用loadImpNoList方法

            clocker = setTimeout(loadImpNoList, loseInputMillsecs);
        } else { //连续击键,重新开始计时
            clearTimeout(clocker);
            clocker = setTimeout(loadImpNoList, loseInputMillsecs);
        }
    } else {

        // 此处有可能是查询过一个了,ul列表时有值的
        // 讲道理第二次查询时应该将ul查询数据清空或更新

        $("#impNoListUl").find('li').remove();
    }
}

// 调用查询接口,并将查询结果动态展示在配置好的ul内
function loadImpNoList() {
    let impNo = $('#impNo').val();
    if (impNo == null || impNo == '') {
        return;
    }
    $.ajax({
        url: "serverPage/queryServerAllImpNo?impNo=" + impNo,
        type: 'get',
        contentType: 'application/json;charset=utf-8', //设置请求头信息
        success: function (res) {
            let data = res.data;

            // 每次查询数据时,将前一次查询的数据清除,否则会累加在ul中

            $("#impNoListUl").find('li').remove();

            // 如果查询结果为空,最好给个提示,否则用户会以为没有这个功能或功能失效

            if (data== null || data == '' || data.length == 0) {
                let ele = document.createElement('li');
                ele.innerText = '(搜索无结果)';
                $('#impNoListUl').append(ele);
            } else {
                for (let i = 0; i < data.length; i++) {

                    // // 实现在ul中动态创建li列表,并将数据置入li列表中

                    let ele = document.createElement('li');
                    ele.innerText = data[i];
                    $('#impNoListUl').append(ele);
                }
            }
        }
    });
}

// 此函数绑定了ul列表的点击事件,点击时实现将选中的值放入input搜索框中,调用页面的查询接口

$(function () {
    $("#impNoListUl").bind("click", function () {

        //   ul里面那么多li   通过这行代码实现获取鼠标点击的li的值 
        let innerText = document.elementFromPoint(event.clientX, event.clientY).innerText;

      // 如果是没有结果的,就不要获取值了,清除掉返回

      if (innerText == '(搜索无结果)') {
            $("#impNoListUl").find('li').remove();
            return;
        }

        // 将选中的值赋到input中
        $('#impNo').val(innerText);

        // 已经找到想要的了,ul里面的数据就没必要在占地方了
        $("#impNoListUl").find('li').remove();

        // 调用页面查询按钮接口,返回页面结果。
        $('#searchBtn').click();
    });
});

总结一下:有想法就能做出来。

onkeyup知识点:

  1. onkeydown 事件会在用户按下一个键盘按键时发生
  2. onkeypress 事件会在键盘按键被按下并释放一个键时发生
  3. onkeyup 事件会在键盘按键被松开时发生

setTimeout()

是属于 window 的方法,该方法用于在指定的毫秒数后调用函数或计算表达式。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,222评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,455评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,720评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,568评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,696评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,879评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,028评论 3 409
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,773评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,220评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,550评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,697评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,360评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,002评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,782评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,010评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,433评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,587评论 2 350

推荐阅读更多精彩内容