基于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 文件本身编码转换 图文教程
Oct 12 Javascript
firebug的一个有趣现象介绍
Nov 30 Javascript
javascript贪吃蛇完整版(源码)
Dec 09 Javascript
最棒的Angular2表格控件
Aug 10 Javascript
简单实现Vue的observer和watcher
Dec 21 Javascript
利用nvm管理多个版本的node.js与npm详解
Nov 02 Javascript
Vue组件中prop属性使用说明实例代码详解
May 31 Javascript
详解基于vue-cli3.0如何构建功能完善的前端架子
Oct 09 Javascript
新版小程序登录授权的方法
Dec 12 Javascript
vue使用recorder.js实现录音功能
Nov 22 Javascript
vue插件--仿微信小程序showModel实现模态提示窗功能
Aug 19 Javascript
详解vue 中 scoped 样式作用域的规则
Sep 14 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 存取 MySQL 数据库的一个例子
2006/10/09 PHP
深入解读php中关于抽象(abstract)类和抽象方法的问题分析
2014/01/03 PHP
Nginx实现反向代理
2017/09/20 Servers
ThinkPHP5.0框架验证码功能实现方法【基于第三方扩展包】
2019/03/11 PHP
javascript去除字符串中所有标点符号和提取纯文本的正则
2014/06/07 Javascript
javascript实现类似java中getClass()得到对象类名的方法
2015/07/27 Javascript
理解javascript中的with关键字
2016/02/15 Javascript
node.js学习之base64编码解码
2016/10/21 Javascript
node.js 中间件express-session使用详解
2017/05/20 Javascript
bootstrap daterangepicker汉化以及扩展功能
2017/06/15 Javascript
vuejs使用$emit和$on进行组件之间的传值的示例
2017/10/04 Javascript
Vue源码解析之数组变异的实现
2018/12/04 Javascript
小程序实现悬浮搜索框
2019/07/12 Javascript
vue 验证码界面实现点击后标灰并设置div按钮不可点击状态
2019/10/28 Javascript
vue中利用iscroll.js解决pc端滚动问题
2020/02/15 Javascript
vue使用better-scroll实现滑动以及左右联动
2020/06/30 Javascript
vue实现点击按钮“查看详情”弹窗展示详情列表操作
2020/09/09 Javascript
javascript实现倒计时提示框
2021/03/02 Javascript
[33:09]完美世界DOTA2联赛循环赛 Forest vs DM BO2第二场 10.29
2020/10/29 DOTA
python使用cookie库操保存cookie详解
2014/03/03 Python
使用graphics.py实现2048小游戏
2015/03/10 Python
Python实现网站注册验证码生成类
2017/06/08 Python
神经网络相关之基础概念的讲解
2018/12/29 Python
python使用gdal对shp读取,新建和更新的实例
2020/03/10 Python
土耳其国际性时尚购物网站:Modanisa
2018/01/19 全球购物
香港最大的洋酒零售连锁店:屈臣氏酒窖(Watson’s Wine)
2018/12/10 全球购物
英国现代市场:ARKET
2019/04/10 全球购物
SEPHORA丝芙兰德国官方购物网站:化妆品、护肤品和香水
2020/01/21 全球购物
建材业务员岗位职责
2013/12/08 职场文书
班长自荐书范文
2014/02/11 职场文书
高中军训第一天感言
2014/03/06 职场文书
个人授权委托书
2014/04/03 职场文书
车辆转让协议书
2014/09/24 职场文书
2014年团支书工作总结
2014/11/14 职场文书
员工表扬信怎么写
2015/05/05 职场文书
中学政教处工作总结
2015/08/13 职场文书