利用js实现输入框动态提示信息

为了提高和用户的交互性,现在的输入框往往都采用输入信息自动提示的功能,类似于百度输入框中的提示功能。

设计思路是:在输入框input的组件下面放置一个div,这个div主要是为了提示信息的展示功能,类似于下拉框那种形式。

步骤一:在网页加载的时候会首先把输入框中要查询的信息全部加载出来,并且放置在一个全局变量中。

步骤二:当用户在输入框中输入信息的时候会触发响应函数,函数的主要功能是获取用户的输入值并继续监控用户后续的输入值,然后把输入值进行处理,于缓存中的全局变量进行对比操作,把缓存中相同的部分返回给上面提到过的div,div中就显示了和用户输入条件相类似的信息,提供用户选择。

步骤三:用户在菜单中选择自己想要的信息,通过js代码实现将选择的信息返回到输入框中去。

大体的设计思路就是这样,现在看看具体的例子:

1.菜单显示的样式信息:

.auto_hidden {
    width:204px;
    border-top: 1px solid #333;
    border-bottom: 1px solid #333;
    border-left: 1px solid #333;
    border-right: 1px solid #333;
    position:absolute;
    display:none;
}
.auto_show {
    width:204px;
    border-top: 1px solid #333;
    border-bottom: 1px solid #333;
    border-left: 1px solid #333;
    border-right: 1px solid #333;
    position:absolute;
    z-index:9999; /* 保证页面在最前端*/
    display:block;
    height:100px;
    overflow:auto
}
.auto_onmouseover{
    color:#ffffff;
    background-color:highlight;
    width:100%;
}
.auto_onmouseout{
    color:#000000;
    width:100%;
    background-color:#ffffff;
}

2.js部分的处理代码:

var Bind = function(object, fun) {
    return function() {
        return fun.apply(object, arguments);
    }
}
function AutoComplete(obj,autoObj,arr){
    this.obj=document.getElementById(obj);        //输入框
    this.autoObj=document.getElementById(autoObj);//DIV的根节点
    this.value_arr=arr;        //不要包含重复值
    this.index=-1;          //当前选中的DIV的索引
    this.search_value="";   //保存当前搜索的字符    
}
AutoComplete.prototype={
    //初始化DIV的位置
    init: function(){
        this.autoObj.style.left = this.obj.offsetLeft + "px";
        this.autoObj.style.top  = this.obj.offsetTop + this.obj.offsetHeight + "px";
        this.autoObj.style.width= this.obj.offsetWidth - 2 + "px";//减去边框的长度2px   
    },
    //删除自动完成需要的所有DIV
    deleteDIV: function(){
        while(this.autoObj.hasChildNodes()){
            this.autoObj.removeChild(this.autoObj.firstChild);
        }
        this.autoObj.className="auto_hidden";
    },
    //设置值
    setValue: function(_this){
        return function(){
            _this.obj.value=this.seq;
            _this.autoObj.className="auto_hidden";
        }       
    },
    //模拟鼠标移动至DIV时,DIV高亮
    autoOnmouseover: function(_this,_div_index){
        return function(){
            _this.index=_div_index;
            var length = _this.autoObj.children.length;
            for(var j=0;j<length;j++){
                if(j!=_this.index ){       
                    _this.autoObj.childNodes[j].className='auto_onmouseout';
                }else{
                    _this.autoObj.childNodes[j].className='auto_onmouseover';
                    _this.obj.value=this.seq;
                }
            }            
        }
    },
    //更改classname
    changeClassname: function(length){
        for(var i=0;i<length;i++){
            if(i!=this.index ){       
                this.autoObj.childNodes[i].className='auto_onmouseout';
            }else{
                this.autoObj.childNodes[i].className='auto_onmouseover';
                this.obj.value=this.autoObj.childNodes[i].seq;
            }
        }
    }
    ,
    //响应键盘
    pressKey: function(event){
        var length = this.autoObj.children.length;
        //光标键"↓"
        if(event.keyCode==40){
            ++this.index;
            if(this.index>length){
                this.index=0;
            }else if(this.index==length){
                this.obj.value=this.search_value;
            }
            this.changeClassname(length);
        }
        //光标键"↑"
        else if(event.keyCode==38){
            this.index--;
            if(this.index<-1){
                this.index=length - 1;
            }else if(this.index==-1){
                this.obj.value=this.search_value;
            }
            this.changeClassname(length);
        }
        //回车键
        else if(event.keyCode==13){
            this.autoObj.className="auto_hidden";
            this.index=-1;
        }else{
            this.index=-1;
        }
    },
    //程序入口
    start: function(event){
        if(event.keyCode!=13&&event.keyCode!=38&&event.keyCode!=40){
            this.init();
            this.deleteDIV();
            this.search_value=this.obj.value;
            var valueArr=this.value_arr;
            valueArr.sort();
            if(this.obj.value.replace(/(^\s*)|(\s*$)/g,'')==""){ return; }//值为空,退出
            try{ var reg = new RegExp("(" + this.obj.value + ")","i");}
            catch (e){ return; }
            var div_index=0;//记录创建的DIV的索引
            for(var i=0;i<valueArr.length;i++){
                if(reg.test(valueArr[i])){
                    var div = document.createElement("div");
                    div.className="auto_onmouseout";
                    div.seq=valueArr[i];
                    div.onclick=this.setValue(this);
                    div.onmouseover=this.autoOnmouseover(this,div_index);
                    div.innerHTML=valueArr[i].replace(reg,"<strong>$1</strong>");//搜索到的字符粗体显示
                    this.autoObj.appendChild(div);
                    this.autoObj.className="auto_show";
                    div_index++;
                }
            }
        }
        this.pressKey(event);
        window.onresize=Bind(this,function(){this.init();});
    }
}

HTML中的实现代码:

<html>
<head>
<meta charset="UTF-8">
<title>js中字符串处理</title>
</head>
<link href="css/AutoComplete.css" type="text/css" rel="stylesheet"/>
<script type="text/javascript" src="js/jquery-1.8.0.min.js"></script>
<script type="text/javascript" src="js/AutoComplete.js"></script>
<script type="text/javascript">
	$(document).ready(function(){
		//$('#p_apiName').val(api);
		createApi();
	});

	var autoComplete;
	function createApi(){
		var inputValue=["aa.bb.ccc","as.sd.we","123.425","aa.bb.ccc.ee","as.sd.we.ee","123.425.ee","aa.bb.ccc.ee.ee","as.sd.we.ee.ee.e","123.425.e"];
		if(!autoComplete){
			autoComplete = new AutoComplete('p_apiName','auto',inputValue);//第一个参数是输入框id,第二个是下拉显示的id,第三个是获取的全部数据。
		}
		$('#p_apiName').blur(function () {//点击下拉选项得到获取值
			//alert($('#p_apiName').val());点击获取选择的值。
	    });
	}
</script>
<body>
	<h1>输入框动态提示信息</h1>
	<div>
		<label class="flabel">输入值:</label>
		<input id="p_apiName" name="apiName" type="text" autocomplete="off" 
		style="width:395px;height:30px;font-size:15pt;" onkeyup="autoComplete.start(event)">
	</div>
    <div class="auto_hidden" style="height: auto; background-color: #F0F0F0;font-size: 15pt;" id="auto">
	</div>
</body>
</html>

运行截图:

到这里例子就介绍完毕了,这里需要主要的是:这个项目还引用了JQuery的js文件,大家可以去网络上下载。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏coder修行路

python爬虫从入门到放弃(八)之 Selenium库的使用

一、什么是Selenium selenium 是一套完整的web应用程序测试系统,包含了测试的录制(selenium IDE),编写及运行(Selenium R...

6357
来自专栏青青天空树

MFC--响应鼠标和键盘操作

  一.  理解鼠标事件.之前对鼠标事件的认识仅仅局限于处理控件的单击与双击事件.但实际鼠标的操作包含很多.这里将以一个画图的小程序讲解对鼠标的响应.

581
来自专栏Young Dreamer

html5之histroy浅析

history是HTML5的新特性,我们可以使用它操作这个历史记录堆栈。 (1)history提供了对浏览器历史纪录堆栈的读取,同时实现在访问记录中的前进和后退...

2017
来自专栏Danny的专栏

机房收费系统——将MSHFlexGrid控件中的数据导出到Excel

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/huyuyang6688/article/...

1182
来自专栏前端架构

vue2.x入坑总结—回顾对比angularJS/React的一统

从感性的角度讲,我是不屑于用VUE,觉得react套件用起来更顺手,但是vue现在越来火,所以也不得入vue(杂烩汤)的坑。

1312
来自专栏向治洪

ios开发之xcode环境介绍

作为一个刚入门ios开发的人来说,对于ios开发,对于xcode一切都是那么的陌生,那么我们如何开始我们的第一步呢?首先对开发的ide是必须要了解的,其实要对开...

2136
来自专栏IT开发技术与工作效率

VBA登录抓取网络数据

1644
来自专栏技术墨客

React学习(最终篇)—— 高阶应用:高阶组件(HOCs)

高阶组件(higher-order components:以下简称HOC或HOC组件)是一个React组件复用的高级技巧。HOCs本身并不是React的API接...

1654
来自专栏IMWeb前端团队

react组件性能优化探索实践

React本身就非常关注性能,其提供的虚拟DOM搭配上Diff算法,实现对DOM操作最小粒度的改变也是非常的高效。然而其组件渲染机制,也决定了在对组件进行更新时...

2327
来自专栏7号代码

Android应用界面开发——Widget(实现液晶时钟)

桌面控件是通过BroadcastReceiver的形式进行控制的,因此每个桌面控件都对应于一个BroadcastReceiver。开发桌面控件时,只需继承Bro...

1846

扫码关注云+社区