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的button默认enter事件(回车事件)。
May 18 Javascript
JavaScript实现16进制颜色值转RGB的方法
Feb 09 Javascript
jQuery实现自定义checkbox和radio样式
Jul 13 Javascript
JQUERY的AJAX请求缓存里的数据问题处理
Feb 23 Javascript
js实现背景图自适应窗口大小
Jan 10 Javascript
简单谈谈JS中的正则表达式
Sep 11 Javascript
React Native预设占位placeholder的使用
Sep 28 Javascript
详解开源的JavaScript插件化框架MinimaJS
Oct 26 Javascript
JavaScript 2018 中即将迎来的新功能
Sep 21 Javascript
前端js中的事件循环eventloop机制详解
May 15 Javascript
jQuery实时统计输入框字数及限制
Jun 24 jQuery
JavaScript实现手风琴效果
Feb 18 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.MVC的模板标签系统(二)
2006/09/05 PHP
PHP堆栈调试操作简单示例
2018/06/15 PHP
PHP解析url并得到url参数方法总结
2018/10/11 PHP
JS 用6N±1法求素数 实例教程
2009/10/20 Javascript
jquery实现图片滚动效果的简单实例
2013/11/23 Javascript
Javascript实现div的toggle效果实例分析
2015/06/09 Javascript
javascript巧用eval函数组装表单输入项为json对象的方法
2015/11/25 Javascript
完善的jquery处理机制
2016/02/21 Javascript
jQuery tagsinput在h5邮件客户端中应用详解
2016/09/26 Javascript
angularjs+bootstrap菜单的使用示例代码
2017/03/07 Javascript
详解vue express启动数据服务
2017/07/05 Javascript
Angularjs的键盘事件的绑定
2017/07/27 Javascript
用vue快速开发app的脚手架工具
2018/06/11 Javascript
trackingjs+websocket+百度人脸识别API实现人脸签到
2018/11/26 Javascript
详解vue 图片上传功能
2019/04/30 Javascript
基于layui框架响应式布局的一些使用详解
2019/09/16 Javascript
JQuery 实现文件下载的常用方法分析
2019/10/29 jQuery
JS可断点续传文件上传实现代码解析
2020/07/30 Javascript
[00:49]完美世界DOTA2联赛10月28日开团时刻:随便打
2020/10/29 DOTA
python列表与元组详解实例
2013/11/01 Python
Python脚本实现下载合并SAE日志
2015/02/10 Python
Python实现控制台进度条功能
2016/01/04 Python
python 提取tuple类型值中json格式的key值方法
2018/12/31 Python
Python3.7实现验证码登录方式代码实例
2020/02/14 Python
利用CSS3的特性改变文本选中时的颜色
2013/09/11 HTML / CSS
美国潜水装备、水肺潜水和浮潜设备商店:Leisure Pro
2018/08/08 全球购物
Skyscanner香港:机票比价, 平机票和廉价航空机票预订
2020/02/07 全球购物
实习单位接收函模板
2014/01/10 职场文书
禁毒宣传标语
2014/06/19 职场文书
团队拓展活动方案
2014/08/28 职场文书
群众路线教育实践活动剖析材料
2014/09/30 职场文书
销售经理工作失职检讨书
2014/10/24 职场文书
白酒代理协议书范本
2014/10/26 职场文书
实习证明模板
2015/06/16 职场文书
Vue.js中v-bind指令的用法介绍
2022/03/13 Vue.js
详解Redis的三种常用的缓存读写策略步骤
2022/05/06 Redis