input输入框联想功能

一直想找一个可以连接后台,可以根据后台内容的input输入框,可以实现联想功能,网上找到一个简单的静态页面的输入框联想,经过一番修改之后终于可以实现读取自己定义的数组的联想了,其实也比较简单就是格式的问题。还是直接上代码吧。

首先是一个简单的界面

auto.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>input自动补全</title>
    <link rel="stylesheet" type="text/css" href="auto.css" />
</head>

<body>
    <div class="wrap">
        <input type="text" id="input" class="auto-inp">
        <div class="auto hidden" id="auto">
            <div class="auto_out">1</div>
            <div class="auto_out">2</div>
        </div>
    </div>
    <%String[] a = {"a12","124","15"};
    out.print(a[1]);
    %>

    <script src="auto.js"></script>
    <script>

        //var array = [‘b12‘,‘b22‘,‘固戍‘,‘b4‘,‘b5‘,‘b6‘,‘如果爱‘,‘b7‘,‘b8‘,‘b2‘,‘abd‘,‘ab‘,‘西乡‘,‘accd‘,‘abd‘,‘qq音乐‘,‘b1‘,‘cd‘,‘ccd‘,‘cbcv‘,‘小王子‘,‘cxf‘,‘b0‘];
        var array=[
            <%for(int i = 0 ; i < 3;i++)
            {
                %>
                ‘<%=a[i]%>‘,   //一定要加上单引号
                <%
            }
            %>
        ]
        var autoComplete = new AutoComplete("input","auto",array);
        document.getElementById("input").onkeyup = function(event){
            autoComplete.start(event);
        }
    </script>
</body>
</html>

为了实现联想的内容是自己程序里的数组,我用了一个循环,将java中的数组添加到了js中,改了好长时间,后来才想到,对于js数组中还有其固定的格式,加了一个‘ <%=a[]%>’号之后就成了

然后对界面进行设计

auto.css

div,p,h1,h2,h3,h4,h5,h6,ul,li,span,input{
    box-sizing: border-box;
    font: 14px/20px "microsoft yahei";
}
div.wrap{
    width: 240px;
    margin: 20px auto 0 auto;
}
.auto-inp{
    width: 240px;
    height: 36px;
    padding-left: .5em;
    border-radius: 2px;
    border: 1px solid #dedede;
    color: #666;
    outline: none;
}
.auto{
    width: 240px;
    border: 1px solid #dedede;
    border-top: none;
    position: absolute;
}
.auto_out{
    width: 238px;
    height: 36px;
    line-height: 36px;
    padding-left: .5em;
    color: #000;
    background: #fff;
    overflow: hidden;
    white-space: nowrap;
    -o-text-overflow: ellipsis;
    text-overflow: ellipsis;
}
.auto_out.on{
    background: #eee;
    cursor: pointer;
}
.hidden{
    display: none;
}

然后就是主要起作用的部分了

auto.js:

// 数组去重
Array.prototype.unique = function(){
    this.sort();
    var res = [];
    var json = {};
    for (var i = 0; i < this.length; i++) {
        if(!json[this[i]]){
            res.push(this[i]);
            json[this[i]] = 1;
        }
    }
    return res;
}

// 对样式操作
var setClass = {
    hasClass: function(elements,cName){    // 判断是否含有某个class
        if(elements.className.match(new RegExp( "(\\s|^)" + cName + "(\\s|$)") ))
            return true;
        else
            return false;
    },
    addClass: function(elements,cName){    // 添加class
        if( !this.hasClass( elements,cName ) ){
            elements.className += " " + cName;
        };
    },
    removeClass: function(elements,cName){    // 移除某个class
        if( this.hasClass( elements,cName ) ){
            elements.className = elements.className.replace( new RegExp( "(\\s|^)" + cName + "(\\s|$)" )," " );
        }
    }
}

var Bind = function(This){
    return function(){
        This.init();
    }
}

function AutoComplete(input,auto,arr) {
    this.obj = document.getElementById(input);
    this.autoObj = document.getElementById(auto);
    this.search_value = "";    //当前的搜索输入值
    this.index = -1;        //当前选中的DIV的索引
    this.value_arr = arr;    //数据库中供检索的值 不包含重复值
}
AutoComplete.prototype = {
    // 初始化
    init: function(){
        var This = this;
        setClass.removeClass(This.autoObj,"hidden");
        this.autoObj.style.left = this.obj.offsetLeft + "px";
        this.autoObj.style.top = this.obj.offsetTop + this.obj.offsetHeight + "px";
    },
    //删除自动完成需要的所有DIV
    deleteDIV: function(){
        while(this.autoObj.hasChildNodes()){
            this.autoObj.removeChild(this.autoObj.firstChild);
        }
        setClass.addClass(this.autoObj,"hidden");
    },
    autoOnmouseover: function(index){
        if(index != this.index){
            setClass.addClass(this.autoObj.children[index],"on");
            setClass.removeClass(this.autoObj.children[this.index],"on");
            this.index = index;
        }
    },
    setValue: function(This){
        return function(){
            This.obj.value = this.seq;
            setClass.addClass(This.autoObj,"hidden");
        }
    },
    // 响应键盘
    pressKey: function(event){
        var code = event.keyCode;
        var length = this.autoObj.children.length;
        if(code == 38){        //↑
            setClass.removeClass(this.autoObj.children[this.index],"on");
            this.index--;
            if(this.index < 0){
                this.index = length - 1;
            }
            setClass.addClass(this.autoObj.children[this.index],"on");
            this.obj.value = this.autoObj.children[this.index].seq;
        }else if(code == 40){    //↓
            setClass.removeClass(this.autoObj.children[this.index],"on");
            this.index++;
            if(this.index > length-1){
                this.index = 0;
            }
            setClass.addClass(this.autoObj.children[this.index],"on");
            this.obj.value = this.autoObj.children[this.index].seq;
        }else{            //回车
            this.obj.value = this.autoObj.children[this.index].seq;
            setClass.addClass(this.autoObj,"hidden");
            this.index = -1;
        }
    },
    // 程序入口
    start: function(event){
        event = event || window.event;
        var code = event.keyCode;
        var This = this;
        if(code != 13 && code != 38 && code != 40){
            this.init();
            this.deleteDIV();
            this.search_value = this.obj.value;
            var valueArr = this.value_arr.unique();
            //去掉前后空格不能为空
            if(this.obj.value.replace(/(^\s*)|(\s*$)/g,"") == ""){ return;}
            //判断数组中是否含有输入的关键字
            try{
                var reg = new RegExp("("+ this.obj.value +")","i");    //输入"aaa" 则 reg = /(aaa)/i
            }catch(e){
                alert(e.message);
            }
            var div_index = 0;    //记录匹配索引个数
            for (var i = 0; i < valueArr.length; i++) {
                if(reg.test(valueArr[i])){
                    var div = document.createElement("div");
                    div.className = "auto_out";
                    div.seq = valueArr[i];
                    div.index = div_index;
                    div.innerHTML = valueArr[i].replace(reg,"<strong>$1</strong>");
                    this.autoObj.appendChild(div);
                    setClass.removeClass(this.autoObj,"hidden");
                    div_index++;
                    if(div_index == 1) {
                        setClass.addClass(this.autoObj.firstChild,"on");
                        this.index = 0;
                    }
                    div.onmouseover = function(){
                        This.autoOnmouseover(this.index);
                    }
                    div.onclick = this.setValue(This);
                }
            }
        }else{
            this.pressKey(event);
        }
        window.onresize = Bind(This);
    }
}

原文地址:https://www.cnblogs.com/1gaoyu/p/11875588.html

时间: 2024-11-03 19:49:05

input输入框联想功能的相关文章

vue input输入框联想

以下是示例,样式可以自己修改.最后是效果图,其实也挺简单的,主要是用了watch监控input输入值的变化,如果数据是请后端请求可以,先请求数据. <template> <div class="binding" v-title data-title="绑定账号"> <div class="bindingbtn"> <input type="text"v-model="city

input输入框实现联想关键词功能

实现原理很简单,代码如下: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>input输入框实现联想关键词功能</title> <script src="http://www.kiscms.com/static/jquery-3.1.1.min.js"></script> </head>

实现bootstrap布局的input输入框中的图标点击功能

使用bootstrap布局可以在input的输入框中添加譬如登录名输入框中的一键清除图标和密码输入框中显示密码的小眼睛图标.如下图: 但是在将图标放入input输入框中,这些小图标是无法获得点击事件的: 那么问题来了,怎样让这些小图标能够获得点击事件呢? 我也不知道,但是可以用一种迂回的方式,来间接的实现该功能. 重点来了: 在小图标的位置上,添加一个看不见的元素,元素的大小正好将小图标覆盖,但是没有背景颜色和边框:相当于给小图标盖了一个透明的被子: <div class="input-g

jQuery/javascript实现IP/Mask自动联想功能

之前做一个云计算的项目,涉及到一个安全组自动联想的功能,思想是这样的: 安全组规则之间是可以相互引用的,也可以自己是自己手动输入的ip/mask,这时候可以加一个功能,实现securityGroupId和securityGroupName以及ip/mask之间随意的联想输入. 主要实现方式是:后台处理securityGroupName和SecurityGroupName的组合列表,并且在前台做相应的处理,处理为数组对象,此时对名称和id的联想基本实现,如果再加上ip/task,只需做一些处理,创

基于jQuery的input输入框下拉提示层(自动邮箱后缀名)

基于jQuery的input输入框下拉提示层,方便用户输入邮箱时的提示信息,需要的朋友可以参考下 效果图 // JavaScript Document (function($){ $.fn.extend({ "changeTips":function(value){ value = $.extend({ divTip:"" },value) var $this = $(this); var indexLi = 0; //点击document隐藏下拉层 $(docum

JavaScript实现搜索联想功能

-.虽然Jquery已经有了一个完整的包 实现前端搜索联想功能,但是出于学习还是想了解一下实现此功能的原理性 回想起来 实现此功能很简单,1.前端输入字符串 文本改变 异步请求服务器 将返回的资料显示在前端就OK了 实际上这样没有问题但是性能却大大减少了很多,那么为了优化性能 此处做了一个时间间隔 当用户输入字符之间停顿一定时间后去请求资料 看看实现代码吧 <!doctype html><html lang="en"> <head> <meta

输入框联想

要做一个车牌号输入的输入框联想提示功能,要求比较简单,故没有利用ajax去数据库查询. 车辆多为京津冀地区的. js代码如下: <head> <style type="text/css">          .item:hover{           background-color: Gray;           cursor:pointer;          }         .hidden{           width:100%;      

微信小程序组件解读和分析:十、input输入框

input输入框组件说明: 本文介绍input 输入框的各种参数及特性. input输入框示例代码运行效果如下: 下面是WXML代码: [XML] 纯文本查看 复制代码 ? 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 <view class="content"> type:有效值:text 感觉没什么区别 <input  placeholder="type=text" type=

input输入框只能输入正整数

input输入框加入限制只能输入正整数,输入其他字符会自动清除: <input type="text" value="1" onkeyup="if(this.value.length==1){this.value=this.value.replace(/[^1-9]/g,'')}else{this.value=this.value.replace(/\D/g,'')}" onafterpaste="if(this.value.le