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


Posted in Javascript onJune 14, 2012

效果图

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

// JavaScript Document 
(function($){ 
$.fn.extend({ 
"changeTips":function(value){ 
value = $.extend({ 
divTip:"" 
},value) 
var $this = $(this); 
var indexLi = 0; 
//点击document隐藏下拉层 
$(document).click(function(event){ 
if($(event.target).attr("class") == value.divTip || $(event.target).is("li")){ 
var liVal = $(event.target).text(); 
$this.val(liVal); 
blus(); 
}else{ 
blus(); 
} 
}) 
//隐藏下拉层 
function blus(){ 
$(value.divTip).hide(); 
} 
//键盘上下执行的函数 
function keychang(up){ 
if(up == "up"){ 
if(indexLi == 1){ 
indexLi = $(value.divTip).children().length-1; 
}else{ 
indexLi--; 
} 
}else{ 
if(indexLi == $(value.divTip).children().length-1){ 
indexLi = 1; 
}else{ 
indexLi++; 
} 
} 
$(value.divTip).children().eq(indexLi).addClass("active").siblings().removeClass(); 
} 
//值发生改变时 
function valChange(){ 
var tex = $this.val();//输入框的值 
var fronts = "";//存放含有“@”之前的字符串 
var af = /@/; 
var regMail = new RegExp(tex.substring(tex.indexOf("@")));//有“@”之后的字符串,注意正则字面量方法,是不能用变量的。所以这里用的是new方式。 
//让提示层显示,并对里面的LI遍历 
if($this.val()==""){ 
blus(); 
}else{ 
$(value.divTip). 
show(). 
children(). 
each(function(index) { 
var valAttr = $(this).attr("email"); 
if(index==1){$(this).text(tex).addClass("active").siblings().removeClass();} 
//索引值大于1的LI元素进处处理 
if(index>1){ 
//当输入的值有“@”的时候 
if(af.test(tex)){ 
//如果含有“@”就截取输入框这个符号之前的字符串 
fronts = tex.substring(tex.indexOf("@"),0); 
$(this).text(fronts+valAttr); 
//判断输入的值“@”之后的值,是否含有和LI的email属性 
if(regMail.test($(this).attr("email"))){ 
$(this).show(); 
}else{ 
if(index>1){ 
$(this).hide(); 
} 
} 
} 
//当输入的值没有“@”的时候 
else{ 
$(this).text(tex+valAttr); 
} 
} 
}) 
} 
} 
//输入框值发生改变的时候执行函数,这里的事件用判断处理浏览器兼容性; 
if($.browser.msie){ 
$(this).bind("propertychange",function(){ 
valChange(); 
}) 
}else{ 
$(this).bind("input",function(){ 
valChange(); 
}) 
} 
//鼠标点击和悬停LI 
$(value.divTip).children(). 
hover(function(){ 
indexLi = $(this).index();//获取当前鼠标悬停时的LI索引值; 
if($(this).index()!=0){ 
$(this).addClass("active").siblings().removeClass(); 
} 
}) 
//按键盘的上下移动LI的背景色 
$this.keydown(function(event){ 
if(event.which == 38){//向上 
keychang("up") 
}else if(event.which == 40){//向下 
keychang() 
}else if(event.which == 13){ //回车 
var liVal = $(value.divTip).children().eq(indexLi).text(); 
$this.val(liVal); 
blus(); 
} 
}) 
} 
}) 
})(jQuery)

一、功能分析:

1.input输入框的值,发生变化时,显示提示的下拉层;

2.input输入框的值,发生变化时,显示提示的下拉层,会根据输入的内容自动往“@”前面添加;

3.input输入框的值,发生变化时,显示提示的下拉层,会根据输入的内容对下拉层“@”后面的内容进行筛选;

4.点击下拉层里面的提示内容,会将其值,填充到输入框;

5.按下鼠标回车键会将其选中的下拉层里的内容,填充到输入框;

6.按键盘的“向上”或“向下”的方向键,可以在下拉层的选项中移动(循环移动,改变当前LI的背景色);

7.鼠标悬停在下拉层的LI上面时,会有一个背景色。
二、功能实现:

1.input输入框的值,发生变化时的事件是:propertychange(IE)或input(标准);

2.在发生propertychange事件的时候,取其输入框的值,再取其“@”前面的值,并赋值给下拉层里面的LI加上LI的email属性值;

3.在发生propertychange事件的时候,

3.1取其输入框的值,再取其“@”后面的值,

3.2并将这个值与下拉层里面的LI的email属性值进行正则匹配;

  这里要注意,正则字面量方法,是不能用变量的。所以这里用的是new方式。

这里的正则是取的输入框“@”后面的值,所以正则,是变化的。而LI的EMAIL属性值是不变的

4.这里用了一个事件委托方式,将点击事件绑定给document,然后通过判断,点击时最初触发的DOM元素,是什么。来决定,

4.1否隐藏下拉提示层?

4.2还是需要将下拉层,选中的值,赋给输入框

(这里不能直接使用,当输入框失去焦点时,隐藏下拉提示层,因为会与点击下拉层,将其值填入输入框,这个功能有逻辑上的矛盾;)

5.和上面第4条差不多;

6.就是要注意,在鼠标悬停时,把当前的LI索引存入一个全局变量当中,这样就可以告诉“向上”或“向下”按键时,的起始位置了;

7.遍历LI,给它们的悬停事件都绑定一个改变其当前背景色的处理函数;
感谢“妙味课堂”提供的视频
在线演示 http://demo.3water.com/js/2012/myinputMail/
打包下载 myinputMail_3water.rar

Javascript 相关文章推荐
JavaScript的eval JSON object问题
Nov 15 Javascript
浅谈jQuery中setInterval()方法
Jul 07 Javascript
js从外部获取图片的实现方法
Aug 05 Javascript
浅谈JS继承_寄生式继承 & 寄生组合式继承
Aug 16 Javascript
jQuery选择器实例应用
Jan 05 Javascript
微信小程序 安全包括(框架、功能模块、账户使用)详解
Jan 16 Javascript
vue动态组件实现选项卡切换效果
Mar 08 Javascript
jQuery弹出窗口简单实现代码
Mar 09 Javascript
vue实现提示保存后退出的方法
Mar 15 Javascript
javascript数据结构之多叉树经典操作示例【创建、添加、遍历、移除等】
Aug 01 Javascript
javascript实现滚动条效果
Mar 24 Javascript
openLayer4实现动态改变标注图标
Aug 17 Javascript
jquery 之 $().hover(func1, funct2)使用方法
Jun 14 #Javascript
Javascript生成json的函数代码(可以用php的json_decode解码)
Jun 11 #Javascript
javascript倒计时功能实现代码
Jun 07 #Javascript
基于jQuery的计算文本框字数的代码
Jun 06 #Javascript
Javascript 页面模板化很多人没有使用过的方法
Jun 05 #Javascript
Javascript创建自定义对象 创建Object实例添加属性和方法
Jun 04 #Javascript
Javascript数组的排序 sort()方法和reverse()方法
Jun 04 #Javascript
You might like
php中使用redis队列操作实例代码
2013/02/07 PHP
PHP下使用CURL方式POST数据至API接口的代码
2013/02/14 PHP
深入Nginx + PHP 缓存详解
2013/07/11 PHP
php自定义函数截取汉字长度
2014/05/15 PHP
教你如何用php实现LOL数据远程获取
2014/06/10 PHP
php中unserialize返回false的解决方法
2014/09/22 PHP
ThinkPHP打开验证码页面显示乱码的解决方法
2014/12/18 PHP
Centos下升级php5.2到php5.4全记录(编译安装)
2015/04/03 PHP
php下的原生ajax请求用法实例分析
2020/02/28 PHP
JavaScript入门教程(10) 认识其他对象
2009/01/31 Javascript
js中的onchange和onpropertychange (onchange无效的解决方法)
2014/03/08 Javascript
js 操作符汇总
2014/11/08 Javascript
基于JavaScript实现百叶窗动画效果不只单纯flas可以实现
2016/02/29 Javascript
快速掌握Node.js中setTimeout和setInterval的使用方法
2016/03/21 Javascript
vue.js实现表格合并示例代码
2016/11/30 Javascript
基于jQuery和CSS3实现APPLE TV海报视差效果
2017/06/16 jQuery
利用JavaScript如何查询某个值是否数组内
2017/07/30 Javascript
JS简单添加元素新节点的方法示例
2018/02/10 Javascript
详解Vue SPA项目优化小记
2018/07/03 Javascript
vue使用监听实现全选反选功能
2018/07/06 Javascript
Angular使用ControlValueAccessor创建自定义表单控件
2019/03/08 Javascript
LayUI动态设置checkbox不显示的解决方法
2019/09/02 Javascript
如何基于JavaScript判断图片是否加载完成
2019/12/28 Javascript
js抽奖转盘实现方法分析
2020/05/16 Javascript
js实现浏览器打印功能的示例代码
2020/07/15 Javascript
python在windows和linux下获得本机本地ip地址方法小结
2015/03/20 Python
Python中字典的setdefault()方法教程
2017/02/07 Python
在Pycharm中将pyinstaller加入External Tools的方法
2019/01/16 Python
html5 touch事件实现触屏页面上下滑动(二)
2016/03/10 HTML / CSS
详解移动端h5页面根据屏幕适配的四种方案
2020/04/15 HTML / CSS
应届毕业生个人自我评价
2013/09/20 职场文书
本科毕业生求职自荐信
2014/02/03 职场文书
前厅部经理岗位职责范文
2014/02/04 职场文书
大学生个人自荐信样本
2014/03/02 职场文书
八一建军节慰问信
2015/02/14 职场文书
vue组件vue-esign实现电子签名
2022/04/21 Vue.js