一个仿微博登陆邮箱提示框js开发案例


Posted in Javascript onJuly 28, 2016

最近在好好的研究JS,通过一个仿邮箱登录提示框的案例加深下对面向对象的理解!啥都别说,先上图:

一个仿微博登陆邮箱提示框js开发案例

功能:实现正则匹配显示相符的内容、键盘事件、鼠标事件

简单布局:

<div id="login">
  <h2>仿微博登录</h2>
  <div class="detail">
    <input type="text" placeholder='邮箱/会员账号/手机号' autocomplete='off' class='name' id='nameInput' maxlength='18'>
  </div>
  <div class="detail">
    <input type="password" placeholder='请输入密码' autocomplete='off' class='password'>
  </div>
  <ul id='suggest'>
    <li class="note">请选择邮箱类型:</li>
    <li class="item" email=""></li>
    <li class="item" email="@sina.com">@sina.com</li>
    <li class="item" email="@163.com">@163.com</li>
    <li class="item" email="@qq.com">@qq.com</li>
    <li class="item" email="@126.com">@126.com</li>
    <li class="item" email="@sina.cn">@sina.cn</li>
    <li class="item" email="@139.com">@139.com</li>
  </ul>
</div>

CSS代码:

body,ul,li,h2{margin:0;padding:0;color:#ccc;}
ul{list-style-type: none;}
#login{width:250px;background:#fff;border:1px solid #ccc;text-align: center;margin:10px auto;position:relative;}
#login h2{background:#FA7D3C;color:#fff;line-height:40px; }
.detail{}
.detail input{width:220px;height:30px;margin:10px auto;border:1px solid #ccc;padding-left:5px;}
#suggest{width:225px;height:auto;background:#fff;border:1px solid #ccc;position:absolute;top:84px;left:12px;display: none;}
#suggest li{width:225px;height:25px;line-height:25px;text-align: left;cursor: pointer;}
#suggest li.note{color:#989090;}
#suggest li.active{background:#eee;}

JS代码:

window.onload=function(){
  var s1=new Suggest();
  s1.init();
};
function Suggest(){
  this.oInput=document.getElementById('nameInput');
  this.oUl=document.getElementById('suggest');
  this.aLi=this.oUl.getElementsByTagName('li');
}
Suggest.prototype={
  init:function(){
    this.toChange();
    this.toBlur();
  },
  toChange:function(){
    //ie:onpropertychange
    //标准:oninput
    /*判断IE浏览器最短方法:var isIE = !-[1,]*/
    var ie=!-[1,];
    //存this指向,this指向问题
    var This=this;
    if(ie){
      this.oInput.onpropertychange=function(){
        if(This.oInput.value==''){
          This.tips();//?解决ie下空值时li新增内容不置空情况
          return;
        }

        This.showUl();
        This.tips();
        This.sel(1);//选中第一条
      };
    }else{
      this.oInput.oninput=function(){
        This.showUl();
        This.tips();
        This.sel(1);//选中第一条
      }
    }
  },
  showUl:function(){
    this.oUl.style.display='block';
  },
  toBlur:function(){
    var This=this;
    this.oInput.onblur=function(){
      This.oUl.style.display='none';
    }
  },
  tips:function(){

    var value=this.oInput.value;
    //正则匹配
    var re=new RegExp('@'+value.substring(value.indexOf('@')+1)+'');
    // console.log(re);
    //bug修复:全部内容一次性清空仍可出现提示
    for(var i=1;i<this.aLi.length;i++){
      this.aLi[i].style.display='block';
    }
    if(re.test(value)){//匹配@输入后情况
      for(var i=1;i<this.aLi.length;i++){
        var oEmail=this.aLi[i].getAttribute('email');
        if(i==1){
          this.aLi[i].innerHTML=value;
        }else{

          if(re.test(oEmail)){//匹配项显示,否则隐藏
            this.aLi[i].style.display='block';
          }else{
            this.aLi[i].style.display='none';
          }
        }
      }
    }else{//未输入@之前
      for(var i=1;i<this.aLi.length;i++){
        var oEmail=this.aLi[i].getAttribute('email');
        if(!oEmail){
          this.aLi[i].innerHTML=value;
        }else{
          this.aLi[i].innerHTML=value+oEmail;
        }
      }
    }

  },
  sel:function(iNow){//传入当前索引

    var This=this;
    //每次改变重新设置类型,不会重复
    for(var i=1;i<this.aLi.length;i++){
      this.aLi[i].className='item';
    }

    if(this.oInput.value==''){
      this.aLi[iNow].className='item';
    }else{
      this.aLi[iNow].className='active';
    }

    for(var i=1;i<this.aLi.length;i++){
      this.aLi[i].index=i;
      this.aLi[i].onmouseover=function(){
        for(var i=1;i<This.aLi.length;i++){
          This.aLi[i].className='item';
        }
        this.className='active';
        iNow=this.index;//当前索引
      };
      //鼠标点击事件:
      this.aLi[i].onmousedown=function(){
        This.oInput.value=this.innerHTML;
      }
    }
    //键盘事件:
    this.oInput.onkeydown=function(e){
      var e=e||window.event;
      if(e.keyCode==38){//上

        if(iNow==1){
          iNow=This.aLi.length-1;
        }else{
          iNow--;
        }
        for(var i=1;i<This.aLi.length;i++){
          This.aLi[i].className='item';
        }
        This.aLi[iNow].className='active';

      }else if(e.keyCode==40){//下

        if(iNow==This.aLi.length-1){
          iNow=1;
        }else{
          iNow++;
        }
        for(var i=1;i<This.aLi.length;i++){
          This.aLi[i].className='item';
        }
        This.aLi[iNow].className='active';

      }else if(e.keyCode==13){//回车
        This.oInput.value=This.aLi[iNow].innerHTML;
        This.oInput.blur();//回车后触发blur事件隐藏ul层
      }
    }
  }

}

需要处理好多个分支情况,处理好小细节,也感觉面向对象中比较常遇到是this指向的问题,通过这个案例好好地理解了下this。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript设计模式 封装和信息隐藏(上)
Jul 24 Javascript
jQuery之选择组件的深入解析
Jun 19 Javascript
javascript jq 弹出层实例
Aug 25 Javascript
jquery获取文档高度和窗口高度汇总
Jan 25 Javascript
有关JavaScript中call()和apply() 的一些理解
May 20 Javascript
jQuery 跨域访问解决原理案例详解
Jul 09 Javascript
快速入门Vue
Dec 19 Javascript
node中使用es5/6以及支持性与性能对比
Aug 11 Javascript
Node做中转服务器转发接口
Oct 18 Javascript
vue.js实现的幻灯片功能示例
Jan 18 Javascript
javascript 高级语法之继承的基本使用方法示例
Nov 11 Javascript
Vue axios获取token临时令牌封装案例
Sep 11 Javascript
利用JS实现数字增长
Jul 28 #Javascript
灵活使用数组制作图片切换js实现
Jul 28 #Javascript
AngularJS 中文API参考手册
Jul 28 #Javascript
AngularJS 简单应用实例
Jul 28 #Javascript
AngularJS 路由详解和简单实例
Jul 28 #Javascript
AngularJS 依赖注入详解和简单实例
Jul 28 #Javascript
AngularJS中实现动画效果的方法
Jul 28 #Javascript
You might like
php输出xml格式字符串(用的这个)
2012/07/12 PHP
php中{}大括号是什么意思
2013/12/01 PHP
PHP二维索引数组的遍历实例分析【2种方式】
2019/06/24 PHP
JavaScript入门教程(9) Document文档对象
2009/01/31 Javascript
js change,propertychange,input事件小议
2011/12/20 Javascript
基于JQuery的一句话搞定手风琴菜单
2012/09/14 Javascript
JQuery EasyUI 日期控件如何控制日期选择区间
2014/05/05 Javascript
TypeScript 中接口详解
2015/06/19 Javascript
编写高性能Javascript代码的N条建议
2015/10/12 Javascript
基于JavaScript如何实现私有成员的语法特征及私有成员的实现方式
2015/10/28 Javascript
js实现的奥运倒计时时钟效果代码
2015/12/09 Javascript
利用jquery实现下拉框的禁用与启用
2016/12/07 Javascript
jQuery结合jQuery.cookie.js插件实现换肤功能示例
2017/10/14 jQuery
jQuery高级编程之js对象、json与ajax用法实例分析
2019/11/01 jQuery
pygame播放音乐的方法
2015/05/19 Python
详解tensorflow实现迁移学习实例
2018/02/10 Python
Python采集猫眼两万条数据 对《无名之辈》影评进行分析
2018/12/05 Python
Python列表(list)所有元素的同一操作解析
2019/08/01 Python
Python socket模块ftp传输文件过程解析
2019/11/05 Python
Pandas时间序列:重采样及频率转换方式
2019/12/26 Python
Python流程控制常用工具详解
2020/02/24 Python
Python爬虫抓取指定网页图片代码实例
2020/07/24 Python
ECOSUSI官网:女式皮革背包
2019/09/27 全球购物
JBL美国官方商店:扬声器、耳机等
2019/12/01 全球购物
介绍一下代理模式(Proxy)
2014/10/17 面试题
介绍一下.NET构架下remoting和webservice
2014/05/08 面试题
路政管理专业推荐信
2013/11/11 职场文书
护理专业毕业生自荐信范文
2014/01/05 职场文书
经济类毕业生求职信
2014/06/26 职场文书
党员干部批评与自我批评反四风思想汇报
2014/09/21 职场文书
2015年英语教学工作总结
2015/05/25 职场文书
小学2016年“我们的节日·重阳节”活动总结
2016/04/01 职场文书
Innodb存储引擎中的后台线程详解
2022/04/03 MySQL
ICOM R71E和R72E图文对比解说
2022/04/07 无线电
Python OpenCV形态学运算示例详解
2022/04/07 Python
详解MySQL的内连接和外连接
2023/05/08 MySQL