js代码:

/*create by code_bunny 20140701
973295131@qq.com
https://github.com/OOP-Code-Bunny
*/
(function ($) {
$.fn.autoComplate = function (opts) {
this.each(function () {
init.call(this, opts);
});
return this;
}; function init(opts) {
var defaultOption = {
textInput: $(this), //文本输入框
emailBox: $(this).next(), //用于放置联想邮箱的框
links:['163.com','qq.com','126.com','gmail.com','yeah.net','hotmail.com','sina.com','sina.cn','sohu.com'] //联想内容,
}; var options = $.extend(defaultOption, opts); var func = {}; func.init = function(){
this.timeOut = null;
this.cur = null;
this.emailList = [];
this.aUl = $('<ul>');
for(var i=0; i<this.links.length; i++){
var aLi = $('<li>');
this.emailList.push(aLi);
this.aUl.append(aLi);
aLi.bind('mousedown',func.chooseLi.bind(options));
}
this.emailBox.append(this.aUl);
this.textInput.bind('keydown',func.keyDownFun.bind(this)).bind('keyup',func.keyUpFun.bind(this)).bind('blur',func.textBlur.bind(this));
return this;
}; func.chooseLi = function(e){
this.textInput.val($(e.target).text());
}; func.keyDownFun = function(e){
func.clearTO.call(this);
if(e.keyCode==13){
return func.pressEnter.call(this);
}
else if (e.keyCode==40) {
return func.upAndDown.apply(this,[true]);
}
else if(e.keyCode==38){
return func.upAndDown.apply(this,[false]);
}
this.timeOut = setTimeout(func.timeout.bind(this),0)
}; func.keyUpFun = function(e){
func.clearTO.call(this);
if (func.ifNotText.apply(this, [e.keyCode])) return;
this.timeOut = setTimeout(func.timeout.bind(this),0)
}; func.pressEnter = function(){
return (this.cur === null) ? func.noCurPressEnter.call(this) : func.curPressEnter.call(this)
}; func.noCurPressEnter = function(){
return (this.textInput.val().indexOf('@')>0 && this.textInput.val().indexOf('@')<this.textInput.val().length-1) ? this.textInput.blur() : this.textInput.val(this.emailList[0].text()).blur();
}; func.curPressEnter = function(){
return this.textInput.val(this.emailBox.find('li:visible').eq(this.cur).text()).blur();
}; //上下键函数,参数表示上下,true为下,false为上
func.upAndDown = function(direct){
this.length = this.emailBox.find('li:visible').length;
var start = direct ? 0 : this.length-1;
if(this.cur === null) {
this.cur = start;
this.emailBox.find('li:visible').eq(this.cur).addClass('cur');
}
else {
func.removeCur.call(this);
var end = direct ? options.length-1 : 0;
this.cur = this.cur == end ? start : (direct ? this.cur+1 : this.cur-1);
this.emailBox.find('li:visible').eq(this.cur).addClass('cur');
}
}; func.timeout = function(){
return this.textInput.val() == '' ? this.emailBox.hide() : func.match.apply(this,[this.textInput.val()])
}; func.ifNotText = function(num){
return num == 13 || num == 40 || num == 38
}; func.match = function(content){
func.removeCur.call(this).emailBox.show();
this.cur = null;
var contentPrv = content.split('@')[0];
var contentNext = content.split('@')[1] || '';
for(var i=0; i<this.links.length; i++){
this.emailList[i] = this.links[i].indexOf(contentNext)!=0 ? this.emailList[i].text(contentPrv+'@'+this.links[i]).hide() : this.emailList[i].text(contentPrv+'@'+this.links[i]).show();
}
}; func.textBlur = function(){
func.clearTO.call(this);
this.cur = null;
func.removeCur.call(this);
this.emailBox.hide();
return this
}; func.removeCur = function(){
$.each(this.emailList,function(){
$(this).removeClass('cur')
});
return this
}; func.clearTO = function(){
clearTimeout(this.timeOut);
this.timeOut = null;
}; func.bindFocus = function(){
this.textInput.bind('keydown',func.keyDownFun.bind(this)).bind('keyup',func.keyUpFun.bind(this));
}; func.init.call(options);
}
})(jQuery);

html代码:

                  <div class="inpt">
<div>
<input type="text" class="email text" name="email" >
<div class="textlist" style="display:none">
</div>
</div>
</div>

1. 创建ul,li,插入到emailBox中,同时给li绑定点击事件(必须是mousedown事件,不能是click事件)为chooseLi方法.  (查看→3)

因为点击的时候元素就会失去焦点,触发input的blur事件,但是必须让li的点击事件发生在input的blur事件之前,所以要用mousedown事件

2.

①. 给input的keydown事件绑定keyDownFun方法.   (查看→5)

②. 给input的keyup事件绑定keyUpFun方法.   (查看→6)

③. 给input的blur事件绑定textBlur方法.   (查看→4)

3. chooseLi方法,选取点击项填充input(点击后也会触发input的blur事件)

4. textBlur方法,清除timeOut,清除cur,删除li的cur类名,隐藏联想框

5. keyDownFun方法:

①清除timeout(防止输入太快出现bug)

②如果按下的是回车键,调用pressEnter方法,return   (查看→7)

③如果按下的是'下'键,调用upAndDown方法,传入true,return   (查看→10)

④如果按下的是'上'键,调用upAndDown方法,传入false,return   (查看→10)

⑤设置timeOut为0秒后执行timeout方法,使输入内容和联想内容同步显示   (查看→11)

6. keyUpFun方法:

①清除timeout(防止输入太快出现bug)

②调用ifNotText方法,传入e.keycode作为参数,判断按下的是否是'回车,下,上',如果是的话,直接return

* 还是需要判断输入的是文字,还是'上,下,回车',如果是'上,下,回车',则不能直接再次匹配,因为匹配的过程就包括了重置cur.

③设置timeOut为0秒后执行timeout方法   (查看→11)

* 显示联想的内容在keydown和keyup时都要发生(如果只定义其中一个,输入快了会有时不同步),而且即使发生两次,也没有问题. 但是回车,上,下,这三个键的事件只能绑定keydown,因为它每次按键只能被调用一次.

7. pressEnter方法:

①如果当前没有cur项,则调用noCurPressEnter方法    (查看→8)

②如果当前有cur项,则调用curPressEnter方法    (查看→9)

*判断是否有cur项,不能使用 if(cur),或者if(!cur),因为cur的值有可能是0,是0的时候会得到和想要的值不同的结果

8. noCurPressEnter方法:

判断输入框里是否有'@'符,并且@符不在最后一位,

①已经有@符并且不在最后一位,则表示已输入想要的结果,直接触发input的blur事件.

②输入的内容里没有@符,或者@符后面没有内容,则表示没有输入完整邮箱,将第一个li里的内容填充到input,再触发input的blur事件

9. curPressEnter方法:

直接将cur项的值填充到input,然后input失去焦点

10. upAndDown方法:

①定义length属性为当前显示的li项的数量

②判断当前是否有cur项,有的话将cur转到下一个或上一个(根据传入的参数判断是上还是下)

③没有的话将cur转到第一个或者最后一个(根据传入的参数判断是上还是下)

11. timeout方法:

①如果input框内容为空,隐藏emailBox

②如果input框内容不为空,调用match方法    (查看→13)

12. ifNotText方法:

判断是否是'回车,下,上'键,是其中之一的话,返回true

13. match方法:

①清空cur项

*如果已经通过键盘选择了一个邮箱,又接着输入内容,则原来被选中的项必须清空. 如果不清空,新输入的内容会导致筛选条件的变化,导致显示的项也发生变化,这时假设接着按'下',则cur的改变不是新筛选出的显示项,依然是原来的显示项,导致错误.

②让emailBox显示

③按照@符分割输入的内容

④每个li的内容应该就是@前面的内容+links的内容

⑤让@后面的内容去匹配每个links的开头,匹配成功的显示,匹配失败的隐藏

github地址: https://github.com/OOP-Code-Bunny/ocj-index-v3.0.0/blob/master/common/js/common/jquery.autoComplate.js

基于jquery的邮箱输入联想插件开发的更多相关文章

  1. jquery 实现邮箱输入自动提示功能:(二)

    上篇文章写到了一个不错的jquery实现邮箱输入自动提示功能,发现还有一个不错的自动提示插件: 先展示结果如图: html代码: <center> <h1>输入邮箱试试!< ...

  2. jquery 实现邮箱输入自动提示功能

    邮箱的广泛使用得益于它的免费,因此很多网站在注册的时候都会直接使用邮箱作为账号名 为了提高用户的体验,很多网站都会实现邮箱输入的自动提示功能,所有自己也实现了一个,先看下效果吧,觉得效果还行的就拿去 ...

  3. jquery 实现邮箱输入自动提示功能:(一)

    记得去年做某个项目的时候,用到了邮箱输入自动提示功能,于是网上搜了一下,发现了这个写得不错,现在回想起来,转载一下,方便查阅. 邮箱的广泛使用得益于它的免费,因此很多网站在注册的时候都会直接使用邮箱作 ...

  4. 基于jQuery的input输入框下拉提示层(自动邮箱后缀名)

    基于jQuery的input输入框下拉提示层,方便用户输入邮箱时的提示信息,需要的朋友可以参考下     效果图   // JavaScript Document (function($){ $.fn ...

  5. 基于jquery的插件开发

    最近在公司做一个项目,由于后台数据太多需要分页显示,在网上找了很多插件都没有找到合适的分页插件,所有的分页插件始终达不到自己想要的效果.由于这个项目也不是很赶,就在网上查找各种资料,自己写一个基于jq ...

  6. 基于jQuery的Validate表单验证

    表单验证可以说在前端开发工作中是无处不在的~ 有数据,有登录,有表单, 都需要前端验证~~  而我工作中用到最多的就是基于基于jQuery的Validate表单验证~  就向下面这样~ 因为今天有个朋 ...

  7. 基于Jquery Validate 的表单验证

    基于Jquery Validate 的表单验证 jquery.validate.js是jquery下的一个验证插件,运用此插件我们可以很便捷的对表单元素进行格式验证. 在讲述基于Jquery Vali ...

  8. 10款基于jquery的web前端特效及源码下载

    1.jQuery时间轴插件:jQuery Timelinr 这是一款可用于展示历史和计划的时间轴插件,尤其比较适合一些网站展示发展历程.大事件等场景.该插件基于jQuery,可以滑动切换.水平和垂直滚 ...

  9. 推荐20款基于 jQuery & CSS 的文本效果插件

    jQuery 和 CSS 可以说是设计和开发行业的一次革命.这一切如此简单,快捷的一站式服务.jQuery 允许你在你的网页中添加一些真正令人惊叹的东西而不用付出很大的努力,要感谢那些优秀的 jQue ...

随机推荐

  1. RESTful到底是什么玩意??

      0. REST不是"rest"这个单词,而是几个单词缩写.: 1. REST描述的是在网络中client和server的一种交互形式:REST本身不实用,实用的是如何设计 RE ...

  2. java面试第九天

    图形界面: 布局管理器: CardLayout:卡片布局,面板重叠放置,只能看到一个,最先添加的会被显示出来,可以进行翻动 两种构造方法: CardLayout() 创建一个间隙大小为 0 的新卡片布 ...

  3. C++ union使用注意

    union在我们敲代码的时候的使用概率远远小于struct.所以我们常常不太关心她.就知道他是使用内存复用技术.同一个时刻,他仅仅能存在一个成员的值. C中,我们在union中能够包括struct的, ...

  4. 安装 启动sshd服务:

    .先确认是否已安装ssh服务: [root@localhost ~]# rpm -qa | grep openssh-server openssh-server-.3p1-.fc12.i686 (这行 ...

  5. cocos2dx跟eclipse交叉编译“make: * No rule to make target `all' Stop”的解决方案

    cocos2dx和eclipse交叉编译“make: *** No rule to make target `all'. Stop”的解决方案 搞cocos2dx在eclipse上的交叉编译. 项目. ...

  6. 每一个软件开发人员绝对必须掌握的关于 Unicode 和字符集的最基础的知识

    2013-02-05 14:18 48人阅读 评论(0) 收藏 举报 关键字:     Unicode, Character Set, 字符集, UTF-8, ANSI, ASCII, UTF-7   ...

  7. iOS打包framework - Swift完整项目打包Framework,嵌入OC项目使用

    场景说明: -之前做的App,使用Swift框架语言,混合编程,内含少部分OC代码. -需要App整体功能打包成静态库,完整移植到另一个App使用,该App使用OC. -所以涉及到一个语言互转的处理, ...

  8. 批量修改Java类文件中引入的package包路径

    http://libeey.blogbus.com/logs/101848958.html当复制其他工程中的包到新工程的目录中时,由于包路径不同,出现红叉,下面的类要一个一个修改包路径,类文件太多的话 ...

  9. 【Linux】撷取命令grep

    什么是撷取命令啊?说穿了,就是将一段数据经过分析后,取出我们所想要的.或者是经由分析关键词,取得我们所想要的那一行! 不过,要注意的是,一般来说,撷取信息通常是针对『一行一行』来分析的, 并不是整篇信 ...

  10. PopupWindow的简单使用(结合RecyclerView)

    Android弹窗: 在Android中弹出式菜单(以下称弹窗)是使用十分广泛一种菜单呈现的方式,弹窗为用户交互提供了便利.关于弹窗的实现大致有以下两种方式AlertDialog和PopupWindo ...