基于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 继承详解(四)
Jul 13 Javascript
jquery 快速回到页首的方法
Dec 05 Javascript
jquery实现仿JqueryUi可拖动的DIV实例
Jul 31 Javascript
微信小程序request请求后台接口php的实例详解
Sep 20 Javascript
javascript计算对象长度的方法
Oct 25 Javascript
详解layui弹窗父子窗口之间传参数的方法
Jan 16 Javascript
Angular使用操作事件指令ng-click传多个参数示例
Mar 27 Javascript
JS获取浏览器地址栏的多个参数值的任意值实例代码
Jul 24 Javascript
深入理解JavaScript的async/await
Aug 05 Javascript
vue 组件内获取actions的response方式
Nov 08 Javascript
JS中间件设计模式的深入探讨与实例分析
Apr 11 Javascript
基于jquery实现彩色投票进度条代码解析
Aug 26 jQuery
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做的端口嗅探器--可以指定网站和端口
2006/10/09 PHP
使用php来实现网络服务
2009/09/15 PHP
php网站被挂木马后的修复方法总结
2014/11/06 PHP
php格式输出文件var_export函数实例
2014/11/15 PHP
AJAX PHP无刷新form表单提交的简单实现(推荐)
2016/09/09 PHP
在Laravel中使用DataTables插件的方法
2018/05/29 PHP
js判断浏览器的比较全的代码
2007/02/13 Javascript
javascript 放大镜效果js组件 qsoft.PopBigImage.v0.35 加入了chrome支持
2009/04/07 Javascript
ext combox 下拉框不出现自动提示,自动选中的解决方法
2010/02/24 Javascript
修改jquery里的dialog对话框插件为框架页(iframe) 的方法
2010/09/14 Javascript
基于SVG的web页面图形绘制API介绍及编程演示
2013/06/28 Javascript
bootstrap table 服务器端分页例子分享
2015/02/10 Javascript
JS实现自动切换文字的导航效果代码
2015/08/27 Javascript
浅谈vue后台管理系统权限控制思考与实践
2018/12/19 Javascript
vue自定义js图片碎片轮播图切换效果的实现代码
2019/04/28 Javascript
微信小程序上传图片到php服务器的方法
2019/05/23 Javascript
Windows下安装 node 的版本控制工具 nvm
2020/02/06 Javascript
微信小程序开发(二):页面跳转并传参操作示例
2020/06/01 Javascript
利用Python中的mock库对Python代码进行模拟测试
2015/04/16 Python
Python的SQLAlchemy框架使用入门
2015/04/29 Python
Python+Pika+RabbitMQ环境部署及实现工作队列的实例教程
2016/06/29 Python
Python中模块pymysql查询结果后如何获取字段列表
2017/06/05 Python
python tensorflow学习之识别单张图片的实现的示例
2018/02/09 Python
Python shutil模块用法实例分析
2019/10/02 Python
python关于倒排列的知识点总结
2020/10/13 Python
python 对一幅灰度图像进行直方图均衡化
2020/10/27 Python
戴尔加拿大官网:Dell加拿大
2016/09/17 全球购物
Joules美国官网:出色的英国风格
2017/10/30 全球购物
DERMAdoctor官网:美国著名皮肤护理品牌
2019/07/06 全球购物
JAVA和C++区别都有哪些
2015/03/30 面试题
网站美工岗位职责
2014/04/02 职场文书
农民工工资承诺书大全
2015/05/04 职场文书
董事长新年致辞
2015/07/29 职场文书
Nginx本地目录映射实现代码实例
2021/03/31 Servers
SQL Server——索引+基于单表的数据插入与简单查询【1】
2021/04/05 SQL Server
SONY AN-LP1 短波有源天线放大器
2021/04/22 无线电