/**
 * 邮箱自动提示插件
 * @constructor EmailAutoComplete
 * @ options {object} 可配置项
 */
 function EmailAutoComplete(options) {

this.config = {
targetCls      :  '.inputElem',       // 目标input元素
parentCls      :  '.parentCls',       // 当前input元素的父级类
hiddenCls      :  '.hiddenCls',       // 当前input隐藏域 
searchForm     :  '.jqtransformdone', //form表单
hoverBg        :  'hoverBg',          // 鼠标移上去的背景
inputValColor  :  'black',              // 输入框输入提示颜色
mailArr        : ["@qq.com","@gmail.com","@126.com","@163.com","@hotmail.com","@yahoo.com","@yahoo.com.cn","@live.com","@sohu.com","@sina.com"], //邮箱数组
isSelectHide   : true,                // 点击下拉框 是否隐藏 默认为true
callback       : null                 // 点击某一项回调函数
};
this.cache = {
onlyFlag            : true,     // 只渲染一次
currentIndex        : -1,
        oldIndex            : -1
};

this.init(options);
 }

EmailAutoComplete.prototype = {

constructor: EmailAutoComplete,

init: function(options){
this.config = $.extend(this.config,options || {});

var self = this,
_config = self.config,
_cache = self.cache;

$(_config.targetCls).each(function(index,item){

$(item).keyup(function(e){
var target = e.target,
targetVal = $.trim($(this).val()),
keycode = e.keyCode,
elemHeight = $(this).outerHeight(),
elemWidth = $(this).outerWidth(),
parentNode = $(this).closest(_config.parentCls);

$(parentNode).css({'position':'relative'});
// 如果输入框值为空的话 那么下拉框隐藏
if(targetVal == '') {
$(item).attr({'data-html':''});
// 给隐藏域赋值
$(_config.hiddenCls,parentNode).val('');

_cache.currentIndex = -1;
_cache.oldIndex = -1;
$(".auto-tip",parentNode) && !$(".auto-tip",parentNode).hasClass('hidden') && $(".auto-tip",parentNode).addClass('hidden');
self._removeBg(parentNode);
}else {

$(item).attr({'data-html':targetVal});

// 给隐藏域赋值
$(_config.hiddenCls,parentNode).val(targetVal);

$(".auto-tip",parentNode) && $(".auto-tip",parentNode).hasClass('hidden') && $(".auto-tip",parentNode).removeClass('hidden');
// 渲染下拉框内容
self._renderHTML({keycode:keycode,e:e,target:target,targetVal:targetVal,height:elemHeight,width:elemWidth,parentNode:parentNode});
}

});
});

// 阻止form表单默认enter键提交
   $(_config.searchForm).each(function(index,item) {
$(item).keydown(function(e){
var keyCode = e.keyCode;
if(keyCode == 13) {
return false;
}
});
   });

// 点击文档document时候 下拉框隐藏掉
   $(document).click(function(e){
  e.stopPropagation();
  var target = e.target,
  tagCls = _config.targetCls.replace(/^\./,'');

if(!$(target).hasClass(tagCls)) {
$('.auto-tip') && $('.auto-tip').each(function(index,item){
!$(item).hasClass('hidden') && $(item).addClass('hidden');
});
  }
   });
},
/*
* 渲染下拉框提示内容
* @param cfg{object}
*/
_renderHTML: function(cfg) {
var self = this,
_config = self.config,
_cache = self.cache,
curVal;
var curIndex = self._keyCode(cfg.keycode);

$('.auto-tip',cfg.parentNode).hasClass('hidden') && $('.auto-tip',cfg.parentNode).removeClass('hidden');
if(curIndex > -1){
// 键盘上下操作
self._keyUpAndDown(cfg.targetVal,cfg.e,cfg.parentNode);
}else {
if(/@/.test(cfg.targetVal)) {
curVal = cfg.targetVal.replace(/@.*/,'');
}else {
curVal = cfg.targetVal;
}
if(_cache.onlyFlag) {
$(cfg.parentNode).append('<input type="hidden" class="hiddenCls"/>');
var wrap = '<ul class="auto-tip">';

for(var i = 0; i < _config.mailArr.length; i++) {

wrap += '<li class="p-index'+i+'">'+'<span class="output-num"></span><em class="em" data-html="'+_config.mailArr[i]+'">'+_config.mailArr[i]+'</em></li>';
}
wrap += '</ul>';
_cache.onlyFlag = false;
$(cfg.parentNode).append(wrap);
$('.auto-tip',cfg.parentNode).css({'position':'absolute','top':cfg.height,'width':cfg.width - 2 + 'px','left':0,
'border':'1px solid #ccc','z-index':10000});
}

// 给所有li添加属性 data-html
$('.auto-tip li',cfg.parentNode).each(function(index,item){
$('.output-num',item).html(curVal);
!$('.output-num',item).hasClass(_config.inputValColor) && 
$('.output-num',item).addClass(_config.inputValColor);
var emVal = $.trim($('.em',item).attr('data-html'));
$(item).attr({'data-html':curVal + '' +emVal});
});

// 精确匹配内容
self._accurateMate({target:cfg.target,parentNode:cfg.parentNode});

// 鼠标移到某一项li上面时候
self._itemHover(cfg.parentNode);

// 点击对应的项时
self._executeClick(cfg.parentNode);
}

},
/**
* 精确匹配某项内容
*/
_accurateMate: function(cfg) {
var self = this,
_config = self.config,
_cache = self.cache;

var curVal = $.trim($(cfg.target,cfg.parentNode).attr('data-html')),
newArrs = [];
if(/@/.test(curVal)) {

// 获得@ 前面 后面的值
var prefix = curVal.replace(/@.*/, ""),
suffix = curVal.replace(/.*@/, "");

$.map(_config.mailArr,function(n){
var reg = new RegExp(suffix);
if(reg.test(n)) {
newArrs.push(n);
}
});
if(newArrs.length > 0) {
$('.auto-tip',cfg.parentNode).html('');
$(".auto-tip",cfg.parentNode) && $(".auto-tip",cfg.parentNode).hasClass('hidden') && 
$(".auto-tip",cfg.parentNode).removeClass('hidden');

var html = '';
for(var j = 0, jlen = newArrs.length; j < jlen; j++) {
html += '<li class="p-index'+j+'">'+'<span class="output-num"></span><em class="em" data-html="'+newArrs[j]+'">'+newArrs[j]+'</em></li>';
}
$('.auto-tip',cfg.parentNode).html(html);

// 给所有li添加属性 data-html
$('.auto-tip li',cfg.parentNode).each(function(index,item){
$('.output-num',item).html(prefix);
!$('.output-num',item).hasClass(_config.inputValColor) && 
$('.output-num',item).addClass(_config.inputValColor);

var emVal = $.trim($('.em',item).attr('data-html'));

$(item).attr('data-html','');
$(item).attr({'data-html':prefix + '' +emVal});
});

// 精确匹配到某项时候 让当前的索引等于初始值
_cache.currentIndex = -1;
_cache.oldIndex = -1;

$('.auto-tip .output-num',cfg.parentNode).html(prefix);

// 鼠标移到某一项li上面时候
self._itemHover(cfg.parentNode);

// 点击对应的项时
self._executeClick(cfg.parentNode);
}else {
$(".auto-tip",cfg.parentNode) && !$(".auto-tip",cfg.parentNode).hasClass('hidden') && 
$(".auto-tip",cfg.parentNode).addClass('hidden');
$('.auto-tip',cfg.parentNode).html('');
}
}
},
/*
* 鼠标移到某一项li上时
*/
_itemHover: function(parentNode) {
var self = this,
_config = self.config,
_cache = self.cache;
$('.auto-tip li',parentNode).hover(function(index,item) {
!$(this).hasClass(_config.hoverBg) && $(this).addClass(_config.hoverBg);
},function() {
$(this).hasClass(_config.hoverBg) && $(this).removeClass(_config.hoverBg);
});
},
/*
* 当输入框值为空时候 li项都删掉class hoverBg
*/
_removeBg: function(parentNode){
var self = this,
_config = self.config;

$(".auto-tip li",parentNode).each(func

小插件,通过js实现邮箱自动提示功能相关推荐

  1. [模仿微软Live.cn]JavaScript输入邮箱自动提示

    原理是:在一个输入框 中,当我输入任何字的时候 自动下拉相应的邮箱提示,在输入框输入123的时候 下拉框有所有123的邮箱 输入其他的时候 有其他文案对应的邮箱. 同理 此插件不需要任何html标签, ...

  2. java培训教程分享:Java编写软件代码自动提示功能

    本期的java培训教程分享主要是介绍的java编写软件代码的一个自动提示功能,很多零基础和初学java的同学们对这一块还不是很了解,Eclipse for android 实现代码自动提示智能提示功能 ...

  3. js脚本实现自动签到功能

    js脚本实现自动签到功能 1.首先在谷歌浏览器安装Tampermonkey插件 2.写入脚本 // ==UserScript== // @name New Userscript // @namespa ...

  4. Eclips写Java代码和CSS、Javascript、Html代码设置代码自动提示功能

    按照我的方法设置后用Eclipse编写Java代码和前端代码(Html.CSS.JS)都可以自动提示代码.赶紧去试试吧. 1.打开Eclipse软件,点击Windows→Preferences→Jav ...

  5. python控制相机自动拍照_微信小程序实现倒计时调用相机自动拍照功能

    这篇文章主要为大家详细介绍了微信小程序实现倒计时调用相机自动拍照功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 本文实例为大家分享了微信小程序定时拍照的具体代码,供大家参考,具体内容如下 在某 ...

  6. Ajax实现百度搜索框自动提示功能

    Ajax实现百度搜索框自动提示功能 当你在搜索框内写入关键字时下拉框会匹配和你输入的关键字相匹配的信息 文章目录 Ajax实现百度搜索框自动提示功能 一.实现效果 二.代码实现 1.前端页面 2.后端 ...

  7. eclipse hibernate配置文件(*.hbm.xml)加上自动提示功能

    转自:https://blog.csdn.net/u012217085/article/details/17397843?utm_source=blogkpcl3 1. 标签:hibernate 在编 ...

  8. [转]Android 代码自动提示功能

    源地址http://blog.sina.com.cn/s/blog_7dbac12501019mbh.html 或者http://blog.csdn.net/longvslove/article/de ...

  9. Eclipse输入Java和XML代码自动提示功能最简单的方法

    Eclipse输入Java和XML代码自动提示功能 1.设置 java 文件的代码提示功能 打 开 Eclipse 依次选择 Window > Preferences > Java > ...

  10. 怎样增强MyEclipse的代码自动提示功能

    转载自  怎样增强MyEclipse的代码自动提示功能 MyElipse的默认代码提示功能隐藏了许多细节,需要开发者手动设置,一起来设置吧,让你的myeclpse更强大 一般在Eclipse ,MyE ...

最新文章

  1. node.js和npm版本升级及升级过程中遇到的问题和解决方案
  2. flask_sqlalchemy 中 or 、 and 和 like 的用法
  3. mysql明明有索引却用不到的情况
  4. 10.4 实现关系下的匿名内部类
  5. CnGAN:面向跨网用户偏好推荐的生成对抗网络
  6. PHP的ob输出缓冲函数作用
  7. bmp转换tiff c++代码_如何快速转换图片格式
  8. javascript对象数组的二维比较和插入
  9. 15-struct(构造函数,重载)
  10. Microsoft Excel设置单元格下拉框的方法
  11. SLAM常见面试题集锦
  12. php 网站的多语言设置(IP地址区分国内国外)
  13. 银行家算法02--申请资源 (操作系统)
  14. 使用Cubic定制ubuntu系统
  15. 【UVM基础】UVM 树形组织结构
  16. 惠而浦将斥资30亿美元收购艾默生电气旗下爱适易;高通和格芯签署一项长期制造协议 | 美通企业日报...
  17. 神经网络算法处理器设计,神经网络是机器算法吗
  18. 1000多万淘宝卖家及23万天猫卖家,开始构建私域流量时代!
  19. 搭建Genero BDL环境-安装篇
  20. 牛市来了,我却被矿机收割了

热门文章

  1. codeforces 592D(树DP)
  2. 深度学习(增量学习)——ICCV2021:SS-IL: Separated Softmax for Incremental Learning
  3. VMware Funsion 8.5.1破解版
  4. imazing iOS设备管理软件
  5. java中set和get用法_java中 set 和 get
  6. 论文解读:FASPell: A Fast, Adaptable, Simple, Powerful Chinese Spell Checker Based On DAE-Decoder Paradig
  7. 使用树莓派打造家庭监控系统
  8. 苹果手机来电归属地_手机号码归属地能否取消?
  9. 如何确定因果关系?四种理论分析模型!
  10. Tiny6410 SD卡启动裸机程序