基于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 相关文章推荐
过虑特殊字符输入的js代码
Aug 05 Javascript
你必须知道的Javascript知识点之"深入理解作用域链"的介绍
Apr 23 Javascript
解决js数据包含加号+通过ajax传到后台时出现连接错误
Aug 01 Javascript
js过滤HTML标签完整实例
Nov 26 Javascript
原生JS实现旋转木马式图片轮播插件
Apr 25 Javascript
Javascript日期格式化format函数的使用方法
Aug 30 Javascript
JavaScript实现的鼠标响应颜色渐变效果完整实例
Feb 18 Javascript
深入理解JavaScript创建对象的多种方式以及优缺点
Jun 01 Javascript
JavaScript实现鼠标滚轮控制页面图片切换功能示例
Oct 14 Javascript
微信小程序实现图片滚动效果示例
Dec 05 Javascript
jqGrid表格底部汇总、合计行footerrow处理
Aug 21 Javascript
浅析 Vue 3.0 的组装式 API(一)
Aug 31 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水印技术
2007/02/14 PHP
php include,include_once,require,require_once
2008/09/05 PHP
用php获取本周,上周,本月,上月,本季度日期的代码
2009/08/05 PHP
PHP 编写大型网站问题集
2010/05/07 PHP
PHP编程实现计算抽奖概率算法完整实例
2017/08/09 PHP
Nigma vs Alliance BO5 第一场2.14
2021/03/10 DOTA
扩展JS Date对象时间格式化功能的小例子
2013/12/02 Javascript
jQuery制作效果超棒的手风琴折叠菜单
2015/04/03 Javascript
如何使用jQuery技术开发ios风格的页面导航菜单
2015/07/29 Javascript
BootstrapValidator超详细教程(推荐)
2016/12/07 Javascript
原生js实现旋转木马轮播图效果
2017/02/27 Javascript
vue中设置height:100%无效的问题及解决方法
2018/07/27 Javascript
javascript function(函数类型)使用与注意事项小结
2019/06/10 Javascript
vue2 中二级路由高亮问题及配置方法
2019/06/10 Javascript
JavaScript实现简单动态表格
2020/12/02 Javascript
js制作提示框插件
2020/12/24 Javascript
python标准日志模块logging的使用方法
2013/11/01 Python
python正则表达式match和search用法实例
2015/03/26 Python
Python 给某个文件名添加时间戳的方法
2018/10/16 Python
Python爬虫 批量爬取下载抖音视频代码实例
2019/08/16 Python
python监控nginx端口和进程状态
2019/09/06 Python
Pytorch模型转onnx模型实例
2020/01/15 Python
关于tf.matmul() 和tf.multiply() 的区别说明
2020/06/18 Python
python如何调用java类
2020/07/05 Python
吉列剃须刀美国官网:Gillette美国
2018/07/13 全球购物
施惠特软件测试面试题以及笔试题
2015/05/13 面试题
总裁岗位职责
2013/12/04 职场文书
员工拓展培训方案
2014/02/15 职场文书
产品包装策划方案
2014/05/18 职场文书
2014年党员自我评价材料
2014/09/22 职场文书
检讨书范文300字
2015/01/28 职场文书
总经理司机岗位职责
2015/04/10 职场文书
2015年秘书个人工作总结
2015/04/25 职场文书
2015年外贸业务员工作总结范文
2015/05/23 职场文书
2019年浪漫婚礼证婚词
2019/06/27 职场文书
公司开业的祝贺语大全(60条)
2019/07/05 职场文书