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的一个拖拽到指定区域内的效果
Sep 21 Javascript
js中document.write使用过程中的一点疑问解答
Mar 20 Javascript
JavaScript函数的4种调用方法详解
Apr 22 Javascript
Javascript获取CSS伪元素属性的实现代码
Sep 28 Javascript
JavaScript定时显示广告代码分享
Mar 02 Javascript
javascript解决小数的加减乘除精度丢失的方案
May 31 Javascript
微信公众平台开发教程(五)详解自定义菜单
Dec 02 Javascript
fullCalendar中文API官方文档
Feb 07 Javascript
react-native使用react-navigation进行页面跳转导航的示例
Sep 07 Javascript
ES6中数组array新增方法实例总结
Nov 07 Javascript
vue data恢复初始化数据的实现方法
Oct 31 Javascript
js实现简单的日历显示效果函数示例
Nov 25 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
常见PHP数据库解决方案分析介绍
2015/09/24 PHP
PHP表单提交后引号前自动加反斜杠的原因及三种办法关闭php魔术引号
2015/09/30 PHP
调试WordPress中定时任务的相关PHP脚本示例
2015/12/10 PHP
jQuery插件 tabBox实现代码
2010/02/09 Javascript
扩展jquery实现客户端表格的分页、排序功能代码
2011/03/16 Javascript
jquery load()在firefox(火狐)下显示不正常的解决方法
2011/04/05 Javascript
24款非常有用的 jQuery 插件分享
2011/04/06 Javascript
javascript日期转换 时间戳转日期格式
2011/11/05 Javascript
JavaScript高级程序设计 读书笔记之八 Function类及闭包
2012/02/27 Javascript
十个迅速提升JQuery性能让你的JQuery跑得更快
2012/12/10 Javascript
js中的异常处理try...catch使用介绍
2013/09/21 Javascript
jquery实现在网页指定区域显示自定义右键菜单效果
2015/08/25 Javascript
javascript动态生成树形菜单的方法
2015/11/14 Javascript
阿里巴巴技术文章分享 Javascript继承机制的实现
2016/01/14 Javascript
原生JavaScript实现Ajax的方法
2016/04/07 Javascript
jQuery实现点击水纹波动动画
2016/04/10 Javascript
最丑的时钟效果!js canvas时钟制作方法
2016/08/15 Javascript
jQuery实现自动调用和触发某个事件的方法
2016/11/18 Javascript
jQuery表格(Table)基本操作实例分析
2017/03/10 Javascript
微信小程序手机号码验证功能的实例代码
2018/08/28 Javascript
微信公众号H5支付接口调用方法
2019/01/10 Javascript
使用vue脚手架(vue-cli)搭建一个项目详解
2019/05/09 Javascript
浅谈Vue2.4.0 $attrs与inheritAttrs的具体使用
2020/03/08 Javascript
JavaScript设计模式之观察者模式与发布订阅模式详解
2020/05/07 Javascript
python输入错误密码用户锁定实现方法
2017/11/27 Python
python实现闹钟定时播放音乐功能
2018/01/25 Python
解决phantomjs截图失败,phantom.exit位置的问题
2018/05/17 Python
Python运维自动化之nginx配置文件对比操作示例
2018/08/29 Python
django中SMTP发送邮件配置详解
2019/07/19 Python
在Django下测试与调试REST API的方法详解
2019/08/29 Python
使用Django搭建一个基金模拟交易系统教程
2019/11/18 Python
查看keras的默认backend实现方式
2020/06/19 Python
小学生运动会报道稿
2014/09/12 职场文书
2015年评职称个人工作总结
2015/10/15 职场文书
Python基础之元编程知识总结
2021/05/23 Python
浅谈redis整数集为什么不能降级
2021/07/25 Redis