jQuery实现文本框邮箱输入自动补全效果


Posted in Javascript onNovember 17, 2015

  邮箱自动完成的效果在网站上大多都看过,但是质量参差不齐,今天突然在网上看到一篇博客,感觉这个插件很好,就想来写一下分享给大家!

 效果图如下:

jQuery实现文本框邮箱输入自动补全效果

完整demo代码如下:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>邮箱地址自动完成功能</title>
<meta http-equiv="content-type" content="text/html;charset=gb2312">
<style>
.demo p {width:1000px; margin-left:auto; margin-right:auto;}
.input{padding:12px; width:300px; border:1px solid #c2c2c2; border-radius:4px; box-shadow:0 0 1px #fff, inset 0 0 2px rgba(0,0,0,.15); background-color:#F2F2F2; font-size:14px;}
.emailist{border:1px solid #bdbdbd; border-radius: 4px; background-color:#fff; color:#666; font-size:14px; list-style-type:0; padding:0; margin:0; overflow:hidden;}
.emailist li{padding:2px 11px; cursor:pointer;}
.emailist .on, .emailist li:hover{background-color:#eee;}
</style>
</head>
<body>
 <div class="demo">
 <p><input type="email" class="input inputMailList" name="email" placeholder="请输入邮箱" required autofocus autocomplete="off"></p>    
 </div>
</body>
</html>
<script src="js/jquery-1.6.2.min.js"></script>
<script src="js/jquery.mailAutoComplete-4.0.js"></script>
<script type="text/javascript">
$(".inputMailList").mailAutoComplete();//使用方法
</script>

js实现效果代码(jquery.mailAutoComplete-4.0.js)如下:

(function($) {
 $.fn.mailAutoComplete = function(options) {
  var defaults = {
   className: "emailist",
   email:  ["qq.com","gmail.com","126.com","163.com","hotmail.com","yahoo.com","yahoo.com.cn","live.com","sohu.com","sina.com"], //邮件数组
   zIndex: 11 
  };
  // 最终参数
  var params = $.extend({}, defaults, options || {});
  
  // 是否现代浏览器
  var isModern = typeof window.screenX === "number", visibility = "visibility";
  // 键值与关键字
  var key = {
   "up": 38,
   "down": 40,
   "enter": 13,
   "esc": 27,
   "tab": 9 
  };
  // 组装HTML的方法
  var fnEmailList = function(input) {
   var htmlEmailList = '', arrValue = input.value.split("@"), arrEmailNew = [];
   $.each(params.email, function(index, email) {
    if (arrValue.length !== 2 || arrValue[1] === "" || email.indexOf(arrValue[1].toLowerCase()) === 0) {   
     arrEmailNew.push(email);      
    }
   }); 
   $.each(arrEmailNew, function(index, email) {
    htmlEmailList = htmlEmailList + '<li'+ (input.indexSelected===index? ' class="on"':'') +'>'+ arrValue[0] + "@" + email +'</li>'; 
   });  
   return htmlEmailList;   
  };
  // 显示还是隐藏
  var fnEmailVisible = function(ul, isIndexChange) {
   var value = $.trim(this.value), htmlList = '';
   if (value === "" || (htmlList = fnEmailList(this)) === "") {
    ul.css(visibility, "hidden"); 
   } else {
    isIndexChange && (this.indexSelected = -1);
    ul.css(visibility, "visible").html(htmlList);
   }
  };
  
  return $(this).each(function() {
   this.indexSelected = -1;
   // 列表容器创建
   var element = this;
   var eleUl = $('<ul></ul>').css({
    position: "absolute",
    marginTop: element.offsetHeight,
    minWidth: element.offsetWidth - 2,
    visibility: "hidden",
    zIndex: params.zIndex
   }).addClass(params.className).bind("click", function(e) {
    var target = e && e.target;
    if (target && target.tagName.toLowerCase() === "li") {
     $(element).val(target.innerHTML).trigger("input");
     $(this).css(visibility, "hidden");
     element.focus(); // add on 2013-11-20
    }    
   });   
   $(this).before(eleUl);
   // IE6的宽度
   if (!window.XMLHttpRequest) { eleUl.width(element.offsetWidth - 2); } 
   
   // 不同浏览器的不同事件
   isModern? $(this).bind("input", function() {
    fnEmailVisible.call(this, eleUl, true);
   }): element.attachEvent("onpropertychange", function(e) {    
    if (e.propertyName !== "value") return;
    fnEmailVisible.call(element, eleUl, true);  
   });
   
   $(document).bind({
    "click": function(e) {
     var target = e && e.target, htmlList = '';
     if (target == element && element.value && (htmlList = fnEmailList(element, params.email))) {
      eleUl.css(visibility, "visible").html(htmlList); 
     } else if (target != eleUl.get(0) && target.parentNode != eleUl.get(0)) {
      eleUl.css(visibility, "hidden");
     }
    },
    "keydown": function(e) {
     var eleLi = eleUl.find("li");
     if (eleUl.css(visibility) === "visible") {
      switch (e.keyCode) {
       case key.up: {
        element.indexSelected--;
        if (element.indexSelected < 0) {
         element.indexSelected = -1 + eleLi.length; 
        }
        e.preventDefault && e.preventDefault();
        break;
       }
       case key.down: {
        element.indexSelected++;
        if (element.indexSelected >= eleLi.length) {
         element.indexSelected = 0; 
        }
        e.preventDefault && e.preventDefault();
        break;
       }
       case key.enter: {  
        e.preventDefault();  
        eleLi.get(element.indexSelected) && $(element).val(eleLi.eq(element.indexSelected).html());
        eleUl.css("visibility", "hidden");
        break;
       }
       case key.tab: case key.esc: {
        eleUl.css("visibility", "hidden");
        break;
       }
      }
      if (element.indexSelected !== -1) {
       eleUl.html(fnEmailList(element));
      }
     }
    }
   });  
  });
 };
})(jQuery);

以上就是本文的全部内容,希望对大家的学习有所帮助。

Javascript 相关文章推荐
jQuery中append、insertBefore、after与insertAfter的简单用法与注意事项
Apr 04 Javascript
jquery插件如何使用 jQuery操作Cookie插件使用介绍
Dec 15 Javascript
js格式化时间小结
Nov 03 Javascript
JavaScript阻止事件冒泡示例分享
Dec 28 Javascript
JavaScript使用FileSystemObject对象写入文本文件内容的方法
Aug 05 Javascript
JavaScript简单下拉菜单实例代码
Sep 07 Javascript
JavaScrip调试技巧之断点调试
Oct 22 Javascript
JS实现获取键盘按下的按键并显示在页面上的方法
Nov 04 Javascript
仅9张思维导图帮你轻松学习Javascript 就这么简单
Jun 01 Javascript
基于Vue的延迟加载插件vue-view-lazy
May 21 Javascript
基于Fixed定位的框选功能的实现代码
May 13 Javascript
vue移动端的左右滑动事件详解
Jun 17 Javascript
基于Jquery和html5的7款个性化地图插件
Nov 17 #Javascript
JavaScript设置、获取、清除单值和多值cookie的方法
Nov 17 #Javascript
每天一篇javascript学习小结(RegExp对象)
Nov 17 #Javascript
node.js抓取并分析网页内容有无特殊内容的js文件
Nov 17 #Javascript
js全选按钮的实现方法
Nov 17 #Javascript
javascript实现省市区三级联动下拉框菜单
Nov 17 #Javascript
javascript中return,return true,return false三者的用法及区别
Nov 17 #Javascript
You might like
全国FM电台频率大全 - 29 青海省
2020/03/11 无线电
最贵的咖啡是怎么产生的,它的风味怎么样?
2021/03/04 新手入门
请php正则走开
2008/03/15 PHP
PHP用GD库生成高质量的缩略图片
2011/03/09 PHP
Zend Framework教程之请求对象的封装Zend_Controller_Request实例详解
2016/03/07 PHP
laravel5.2实现区分前后台用户登录的方法
2017/01/11 PHP
Laravel 5.5 的自定义验证对象/类示例代码详解
2017/08/29 PHP
解决PHP使用CURL发送GET请求时传递参数的问题
2019/10/11 PHP
JQuery的read函数与js的onload不同方式实现
2013/03/18 Javascript
jquery实现固定顶部导航效果(仿蘑菇街)
2013/03/21 Javascript
jQuery焦点图轮播效果实现方法
2016/12/19 Javascript
详解vue axios中文文档
2017/09/12 Javascript
AngularJS实现的锚点楼层跳转功能示例
2018/01/02 Javascript
JS canvas绘制五子棋的棋盘
2020/05/28 Javascript
基于JavaScript canvas绘制贝塞尔曲线
2018/12/25 Javascript
vue-cli —— 如何局部修改Element样式
2020/10/22 Javascript
JavaScript canvas实现雨滴特效
2021/01/10 Javascript
[01:02:30]Mineski vs Secret 2019国际邀请赛淘汰赛 败者组 BO3 第三场 8.22
2019/09/05 DOTA
windows下python模拟鼠标点击和键盘输示例
2014/02/28 Python
Python的另外几种语言实现
2015/01/29 Python
windows下ipython的安装与使用详解
2016/10/20 Python
python监控linux内存并写入mongodb(推荐)
2017/09/11 Python
Python 模拟员工信息数据库操作的实例
2017/10/23 Python
Python及Django框架生成二维码的方法分析
2018/01/31 Python
Sanic框架配置操作分析
2018/07/17 Python
Django 多对多字段的更新和插入数据实例
2020/03/31 Python
Django media static外部访问Django中的图片设置教程
2020/04/07 Python
python字典的值可以修改吗
2020/06/29 Python
美国折衷生活方式品牌:Robert Graham
2018/07/13 全球购物
饮料业务员岗位职责
2013/12/15 职场文书
矫正人员思想汇报
2014/01/08 职场文书
大课间体育活动方案
2014/03/12 职场文书
在CSS中映射鼠标位置并实现通过鼠标移动控制页面元素效果(实例代码)
2021/04/22 HTML / CSS
go原生库的中bytes.Buffer用法
2021/04/25 Golang
Mysql效率优化定位较低sql的两种方式
2021/05/26 MySQL
聊聊配置 Nginx 访问与错误日志的问题
2022/05/25 Servers