IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> bootstrap实践录:输入框自动补全-typeahead篇 -> 正文阅读

[JavaScript知识库]bootstrap实践录:输入框自动补全-typeahead篇

因工作需要,在网页的输入框实现自动补全功能。本文继续研究,使用 typeahead 实现该功能。

概述

关于 typeahead,笔者找到2个仓库:github.com:twitter/typeahead.js.gitgithub.com:bassjobsen/Bootstrap-3-Typeahead.git。前者测试不成功,因此本文使用后者仓库。

bootstrap 的 typeahead 插件是用来完成输入框的自动完成、模糊搜索和建议提示的功能,支持ajax数据加载,类似于jquery的 autocomplete 插件。

代码

下载源码:

git clone git@github.com:bassjobsen/Bootstrap-3-Typeahead.git

将仓库的文件bootstrap3-typeahead.min.js放到工程目录,再引入到 html 文件即可。

使用比较简单,如下:

.typeahead(options)

其中,options主要使用sourceitems两项,items指定匹配时最多显示的数量(默认为8);source指定数据源,可直接赋值数组,也可自实现函数。经实验,可有如下的使用方式:

$("#ent").typeahead({
    items: 10,
    source: theSource
});

或者:

$("#ent").typeahead({
    items: 10,
    source: 
    function (query, process) {
    ...
    }// end of function
});  // end of typeahead

function (query, process)函数中可通过 ajax 向后台请求数据(数据为数组形式)。其中,query表示当前文本输入框中的字符串,process 是回调函数(返回的数据作为该函数的参数)。具体见下文代码。

前端

引入文件:

    <link href="css/bootstrap.min.css" rel="stylesheet">
    <link href="css/font-awesome.min.css" rel="stylesheet">
    <script src="js/jquery-3.1.1.min.js"></script>
    <script src="js/bootstrap3-typeahead.min.js"></script>
    <script src="js/bootstrap.min.js"></script>

如果没有引入相应文件,使用typeahead会提示如下错误信息:

TypeError: $(…).typeahead is not a function

页面代码片段如下:

<div class="input-group">
    <span class="input-group-addon">输入节点</span>
    <input id="input1" type="text" placeholder="节点代码"  class="form-control" name="ent" id="ent" value= "001" /> <br >
<div id="resetInfo1" class="bs-example">
    <input id="bt" type="button" class="btn btn-info" onClick="calfee()" value="提交"/>
</div>

js 核心代码如下:

    var theSource = [
        "广西南宁 001",
        "南宁西乡塘 002",
        "广西梧州 003",
        "梧州岑溪 004"
        ];

    function GetSource() { return theSource; }

    nodeList = []

    $("#input1").typeahead({
        source: 
        function (query, process) {
        if (nodeList.length == 0 )
        {
            $.ajax({
            type: "POST",
            contentType: "application/json",
            dataType: "json",
            url: "/getnodeList",
            data: "sta",
            success: function (result) {
                nodeList = result.data
                console.log("got station list ", nodeList.length)
                // console.log("result: ", result)
                return process(nodeList); // 回调处理
            },
            error : function(jqXHR, textStatus, errorThrown) {
                console.log("error: ", errorThrown)
            }
            }); // end of ajax
        }
        else
        {
            return process(nodeList);
        }

        }// end of function
    });  // end of typeahead

后端

后端使用 golang 的 gin 框架实现。

前面请求的 URL 为getnodeList,对应的响应函数为GetNodeListHandle,如下:

func GetNodeListHandle(ctx *gin.Context) {
    var nodeList []string
    nodeList = append(nodeList, "广西南宁 001")
    nodeList = append(nodeList, "南宁西乡塘 002")
    nodeList = append(nodeList, "广西梧州 003")
    nodeList = append(nodeList, "梧州岑溪 004")

    klog.Printf("list: %v\n", len(nodeList))
    ctx.JSON(http.StatusOK,
        gin.H{
            "code": 0,
            "msg":  "ok",
            "data": nodeList,
        })
    return
}

返回的数据为 json 对象,其中 data 为实际数据,因此前端 js 代码使用result.data传入process函数。

效果

输入“南”,可匹配2项,如图:
在这里插入图片描述

小结

因为 ajax 请求是异步,本来想着先请求一次后台返回数据,后续直接使用即可,测试发现不行,所以要在$("#input1").typeahead请求,但该每输入一个字符,即触发一次。实在太频繁,但又没想到好的方法。因此在代码中先判断 nodeList 的长度,如有值,则不请求而是直接使用,否则请求后台,这样能减少请求的次数。因为在应用场合中,服务启动后,输入的数据不会变化,因此不需要实时请求。

至此,输入框自动补全功能暂告一段落。网上有自行实现的版本,但为了省事,无须自制轮子,经对比,发现 typeahead 能较好实现功能,因此在项目中使用。

  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2022-06-26 16:49:40  更:2022-06-26 16:50:48 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 16:52:01-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码