jQuery实现邮箱下拉列表自动补全功能


Posted in Javascript onSeptember 08, 2016

记得,在上个项目中,遇到这样一个需求,网站要求填写邮箱的时候,还没有填写完,就会出现一系列下拉列表,帮助自动补全邮箱的功能。今天小编给给大家分享下我基于jquery是怎么实现此功能的!

功能简述

•填写邮箱名字,出现下拉列表,自动补全邮箱

•点击上下按键,选取下拉列表邮箱

•按回车键,选中列表内容,隐藏下拉列表

•鼠标经过,下拉列表选项设置为高亮

•鼠标点击,选中下拉列表选项,隐藏下拉列表

HTML

HTML代码很简单,我们就一个简单的输入框,然后一个ul标签,在内部可以放好多li标签。

<html>
<head>
<meta charset="utf-8"/>
<script src="js/jquery.min.js"></script>
<script src="js/main.js"></script>
<link href="css/style.css" rel="stylesheet"/>
</head>
<body>
<div class="content">
<input type="text" name="email" id="email" placeholder="请输入您的邮箱"/>
<ul class="list"></ul>
</div>
</body>
</html>

以上便是HTML代码

CSS

在CSS中,定义也比较简单,其中有一个 lilight 的 class,可以使背景变色,通过 remove 和 add 这个 class,我们可以轻松地实现下拉列表元素是否选中的区分。

CSS所有样式如下

.content input{
padding:5px 10px;
width:200px;
}
ul.list{
list-style:none;
padding:0px;
margin:0px;
overflow:hidden;
}
ul.list li{
border:1px solid #EEE;
width:180px;
padding:5px 10px;
margin:0px;
text-overflow:ellipsis; //溢出时变为省略
overflow:hidden;
}
.lilight{
background-color:#fafafa;
}

JS

我们引入 jQuery 来实现对元素的操作,实现了按键和鼠标监听,代码如下

$(function(){
//声明所有的电子邮件变量
var mail=new Array("sina.com.cn","126.com","163.com","gmail.com","qq.com","vip.qq.com","hotmail.com","sohu.com","139.com","vip.sina.com","cuiqingcai.com");
//生成一个个li,并加入到ul中
for(var i=0;i<mail.length;i++){
var liElement=$("<li class=\"autoli\"><span class=\"ex\"></span><span class=\"at\">@</span><span class=\"tail\">"+mail[i]+"</span></li>");
liElement.appendTo("ul.list");
}
//首先让list隐藏起来
$("ul.list").hide();
$("#email").keyup(function(event){
//键入的内容不是上下箭头和回车
if(event.keyCode!=38&&event.keyCode!=40&&event.keyCode!=13){
//如果输入的值不是空或者不以空格开头
if($.trim($(this).val())!=""&& $.trim($(this).val()).match(/^@/)==null){
$("ul.list").show();
//如果当前有已经高亮的下拉选项卡,那么将其移除
if($("ul.list li:visible").hasClass("lilight")){
$("ul.list li").removeClass("lilight");
}
//如果还存在下拉选项卡,那么将其高亮
if($("ul.list li:visible")){
$("ul.list li:visible:eq(0)").addClass("lilight");
}
}else{
//否则不进行显示
$("ul.list").hide();
$("ul.list li").removeClass("lilight");
}
//输入的内容还没有包括@符号
if($.trim($(this).val()).match(/.*@/)==null){
$(".list li .ex").text($(this).val());
}else{
//输入的符号已经包含了@
var str = $(this).val();
var strs = str.split("@");
$(".list li .ex").text(strs[0]);
if($(this).val().length>=strs[0].length+1){
tail=str.substr(strs[0].length+1);
$(".list li .tail").each(function(){
//如果数组中的元素是以文本中的后缀开头,那么就显示,否则不显示
if(!($(this).text().match(tail)!=null&&$(this).text().indexOf(tail)==0)){
//隐藏其他的li
$(this).parent().hide();
}else{
//显示所在的li
$(this).parent().show();
}
});
}
}
}
//按了回车时,将当前选中的元素写入到文本框中
if(event.keyCode==13){
$("#email").val($("ul.list li.lilight:visible").text());
$("ul.list").hide();
}
});
//监听上下方向键
$("#email").keydown(function(event){
//下方向键按下了
if(event.keyCode==40){
if($("ul.list li").is(".lilight")){
if($("ul.list li.lilight").nextAll().is("li:visible")){
$("ul.list li.lilight").removeClass("lilight").next("li").addClass("lilight");
}
}
}
//下方向键按下了
if(event.keyCode==38){
if($("ul.list li").is(".lilight")){
if($("ul.list li.lilight").prevAll().is("li:visible")){
$("ul.list li.lilight").removeClass("lilight").prev("li").addClass("lilight");
}
}
}
});
//当鼠标点击某个下拉项时,选中该项,下拉列表隐藏
$("ul.list li").click(function(){
$("#email").val($(this).text());
$("ul.list").hide();
});
//当鼠标划过某个下拉项时,选中该项,下拉列表隐藏
$("ul.list li").hover(function(){
$("ul.list li").removeClass("lilight");
$(this).addClass("lilight");
});
//当鼠标点击其他位置,下拉列表隐藏
$(document).click(function(){
$("ul.list").hide();
}); 
});

总结

其实还有一个比较强大的插件,叫autocomplete,同样可以实现下拉列表的自动补全,功能更加完善,如果大家有兴趣可以去试一下。不过感觉最常用的就是邮箱自动补齐,而且直接用 jQuery 就可以比较方便地实现,所以博主就没有使用autocomplete插件,而是自己写了一下,一来练习一下,二来对这种功能的实现了解得更加透彻。

以上所述是小编给大家介绍的jQuery实现邮箱下拉列表自动补全功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
js操作ajax返回的json的注意问题!
Feb 23 Javascript
js switch case default 的用法示例介绍
Oct 23 Javascript
实现placeholder效果的方案汇总
Jun 11 Javascript
noty ? jQuery通知插件全面解析
May 18 Javascript
javascript 定时器工作原理分析
Dec 03 Javascript
vue 通过下拉框组件学习vue中的父子通讯
Dec 19 Javascript
Js中将Long转换成日期格式的实现方法
Jun 05 Javascript
解决select2在bootstrap modal中不能正常使用的问题
Aug 09 Javascript
微信小程序解除10个请求并发限制
Dec 18 Javascript
vue单页面在微信下只能分享落地页的解决方案
Apr 15 Javascript
Angular8基础应用之表单及其验证
Aug 11 Javascript
Ant Design Vue table中列超长显示...并加提示语的实例
Oct 31 Javascript
JS图片放大效果简单实现代码
Sep 08 #Javascript
Angularjs 实现一个幻灯片示例代码
Sep 08 #Javascript
利用Vue.js指令实现全选功能
Sep 08 #Javascript
AngularJS 实现JavaScript 动画效果详解
Sep 08 #Javascript
javascript使用 concat 方法对数组进行合并的方法
Sep 08 #Javascript
jQuery插入节点和移动节点用法示例(insertAfter、insertBefore方法)
Sep 08 #Javascript
jQuery删除节点用法示例(remove方法)
Sep 08 #Javascript
You might like
首页四格,首页五格For6.0(GBK)(UTF-8)[12种组合][9-18][版主安装测试通过]
2007/09/24 PHP
PHP实现获取域名的方法小结
2014/11/05 PHP
PHP直接修改表内容DataGrid功能实现代码
2015/09/24 PHP
PHP实现可添加水印与生成缩略图的图片处理工具类
2018/01/16 PHP
Javascript load Page,load css,load js实现代码
2010/03/31 Javascript
克隆javascript对象的三个方法小结
2011/01/12 Javascript
js/jQuery对象互转(快速操作dom元素)
2013/02/04 Javascript
关于textarea提交的内容无法换行的解决办法
2013/04/09 Javascript
extjs ColumnChart设置不同的颜色实现代码
2013/05/17 Javascript
js获取判断上传文件后缀名的示例代码
2014/02/19 Javascript
自己实现ajax封装示例分享
2014/04/01 Javascript
Node.js+Express配置入门教程
2016/05/19 Javascript
JavaScript必知必会(十) call apply bind的用法说明
2016/06/08 Javascript
jQuery插件扩展操作入门示例
2017/01/16 Javascript
BootStrap实现鼠标悬停下拉列表功能
2017/02/17 Javascript
jQuery实现Select下拉列表进行状态选择功能
2017/03/30 jQuery
jQuery实现表单动态添加与删除数据操作示例
2018/07/03 jQuery
Vue slot用法(小结)
2018/10/22 Javascript
浅析vue中的MVVM实现原理
2019/03/04 Javascript
简单说说如何使用vue-router插件的方法
2019/04/08 Javascript
vue v-for 使用问题整理小结
2019/08/04 Javascript
在vue项目中 实现定义全局变量 全局函数操作
2020/10/26 Javascript
python利用hook技术破解https的实例代码
2013/03/25 Python
python中合并两个文本文件并按照姓名首字母排序的例子
2014/04/25 Python
python面向对象入门教程之从代码复用开始(一)
2018/12/11 Python
Darphin迪梵官网: 来自巴黎,植物和精油调制的护肤品牌
2016/10/11 全球购物
Weekendesk意大利:探索多种引人入胜的周末主题
2016/10/14 全球购物
高中生校园生活自我评价
2013/09/19 职场文书
如何掌握自荐信格式呢
2013/11/19 职场文书
《生命 生命》教学反思
2014/04/19 职场文书
教师敬业奉献模范事迹材料
2014/05/18 职场文书
党委书记个人对照检查材料
2014/09/15 职场文书
公司员工离职证明书
2014/10/04 职场文书
人事聘任通知
2015/04/21 职场文书
股东出资协议书
2016/03/21 职场文书
PHP控制循环操作的时间
2021/04/01 PHP