基于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转换字符串为dom对象(字符串动态创建dom)
May 10 Javascript
Javascript中的isNaN函数使用说明
Nov 10 Javascript
原生js写的放大镜效果
Aug 22 Javascript
js给onclick事件赋值,动态传参数实例解说
Mar 28 Javascript
禁止选中文字兼容IE、Chrome、FF等
Sep 04 Javascript
Javascript中克隆一个数组的实现代码
Dec 06 Javascript
js/jquery判断浏览器类型的方法小结
May 12 Javascript
关于session和cookie的简单理解
Jun 08 Javascript
原生JS实现几个常用DOM操作API实例
Jan 19 Javascript
JS实现的计数排序与基数排序算法示例
Dec 04 Javascript
Angularjs之ngModel中的值验证绑定方法
Sep 13 Javascript
vue缓存的keepalive页面刷新数据的方法
Apr 23 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
Memcached常用命令以及使用说明详解
2013/06/27 PHP
PHP异常处理定义与使用方法分析
2017/07/25 PHP
防止页面被iframe(兼容IE,Firefox火狐)
2010/07/04 Javascript
JavaScript中几种常见排序算法小结
2011/02/22 Javascript
关于锚点跳转及jQuery下相关操作与插件
2012/10/01 Javascript
javascript获取ckeditor编辑器的值(实现代码)
2013/11/18 Javascript
简化版手机端照片预览组件
2015/04/13 Javascript
使用jspdf生成pdf报表
2015/07/03 Javascript
javaScript 事件绑定、事件冒泡、事件捕获和事件执行顺序整理总结
2016/10/10 Javascript
js实现网页定位导航功能
2017/03/07 Javascript
canvas压缩图片转换成base64格式输出文件流
2017/03/09 Javascript
js+html5实现半透明遮罩层弹框效果
2020/08/24 Javascript
vue实现商城购物车功能
2017/11/27 Javascript
微信小程序使用modal组件弹出对话框功能示例
2017/11/29 Javascript
如何去除vue项目中的#及其ie9兼容性
2018/01/11 Javascript
babel的使用及安装配置教程
2018/02/22 Javascript
AngularJS实现的鼠标拖动画矩形框示例【可兼容IE8】
2019/05/17 Javascript
layui实现左侧菜单点击右侧内容区显示
2019/07/26 Javascript
vue+element使用动态加载路由方式实现三级菜单页面显示的操作
2020/08/04 Javascript
[02:30]联想杯DOTA2完美世界全国高校联赛—北京站现场
2015/11/16 DOTA
[56:00]2018DOTA2亚洲邀请赛 4.6 淘汰赛 VP vs TNC 第二场
2018/04/10 DOTA
利用python获取当前日期前后N天或N月日期的方法示例
2017/07/30 Python
Tensorflow 实现将图像与标签数据转化为tfRecord文件
2020/02/17 Python
Django调用支付宝接口代码实例详解
2020/04/04 Python
matplotlib jupyter notebook 图像可视化 plt show操作
2020/04/24 Python
Windows下pycharm安装第三方库失败(通用解决方案)
2020/09/17 Python
Keds加拿大官网:购买帆布运动鞋和皮鞋
2019/09/26 全球购物
幼师自我鉴定范文
2013/10/01 职场文书
销售自荐信
2013/10/22 职场文书
机械加工与数控专业自荐书
2014/06/04 职场文书
新兵入伍心得体会
2014/09/04 职场文书
预备党员个人总结
2015/02/14 职场文书
《我的长生果》教学反思
2016/02/20 职场文书
升职自荐书
2019/05/09 职场文书
Java并发编程之详解CyclicBarrier线程同步
2021/06/23 Java/Android
浅谈 JavaScript 沙箱Sandbox
2021/11/02 Javascript