一個(gè)仿微博登陸郵箱提示框js開發(fā)案例
最近在好好的研究JS,通過(guò)一個(gè)仿郵箱登錄提示框的案例加深下對(duì)面向?qū)ο蟮睦斫?!啥都別說(shuō),先上圖:
功能:實(shí)現(xiàn)正則匹配顯示相符的內(nèi)容、鍵盤事件、鼠標(biāo)事件
簡(jiǎn)單布局:
<div id="login"> <h2>仿微博登錄</h2> <div class="detail"> <input type="text" placeholder='郵箱/會(huì)員賬號(hào)/手機(jī)號(hào)' autocomplete='off' class='name' id='nameInput' maxlength='18'> </div> <div class="detail"> <input type="password" placeholder='請(qǐng)輸入密碼' autocomplete='off' class='password'> </div> <ul id='suggest'> <li class="note">請(qǐng)選擇郵箱類型:</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 //標(biāo)準(zhǔn):oninput /*判斷IE瀏覽器最短方法:var isIE = !-[1,]*/ var ie=!-[1,]; //存this指向,this指向問(wèn)題 var This=this; if(ie){ this.oInput.onpropertychange=function(){ if(This.oInput.value==''){ This.tips();//?解決ie下空值時(shí)li新增內(nèi)容不置空情況 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修復(fù):全部?jī)?nèi)容一次性清空仍可出現(xiàn)提示 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)){//匹配項(xiàng)顯示,否則隱藏 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){//傳入當(dāng)前索引 var This=this; //每次改變重新設(shè)置類型,不會(huì)重復(fù) 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;//當(dāng)前索引 }; //鼠標(biāo)點(diǎn)擊事件: 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();//回車后觸發(fā)blur事件隱藏ul層 } } } }
需要處理好多個(gè)分支情況,處理好小細(xì)節(jié),也感覺(jué)面向?qū)ο笾斜容^常遇到是this指向的問(wèn)題,通過(guò)這個(gè)案例好好地理解了下this。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- js輸入框郵箱自動(dòng)提示功能代碼實(shí)現(xiàn)
- 仿新浪微博登陸郵箱提示效果的js代碼
- JavaScript輸入郵箱自動(dòng)提示實(shí)例代碼
- JS實(shí)現(xiàn)提交表單前的數(shù)字及郵箱校檢功能
- js仿QQ郵箱收件人選擇與搜索功能
- JavaScript實(shí)現(xiàn)郵箱地址自動(dòng)匹配功能代碼
- JavaScript 文本框下拉提示(自動(dòng)提示)
- JS仿百度自動(dòng)下拉框模糊匹配提示
- javascript實(shí)現(xiàn)下拉提示選擇框
- javascript仿百度輸入框提示自動(dòng)下拉補(bǔ)全
- JS實(shí)現(xiàn)的郵箱提示補(bǔ)全效果示例
相關(guān)文章
js DNA動(dòng)態(tài)序列比對(duì)代碼
JavaScript動(dòng)態(tài)序列比對(duì)代碼,隨便 寫著玩的,在網(wǎng)上見(jiàn)到用VC、VB寫的比較多,這個(gè)算法以前在高中課本上見(jiàn)到過(guò),我只是用Js寫一下試試,或許還不是太準(zhǔn)確。2010-07-07JS實(shí)現(xiàn)簡(jiǎn)單的下雪特效示例詳解
很多南方的小伙伴可能沒(méi)怎么見(jiàn)過(guò)或者從來(lái)沒(méi)見(jiàn)過(guò)下雪,這篇文章小編給大家?guī)?lái)一個(gè)小Demo,模擬了下雪場(chǎng)景。感興趣的小伙伴快來(lái)跟隨小編一起學(xué)習(xí)一下吧2021-12-1215個(gè)頂級(jí)開源JavaScript框架和庫(kù)
今天小編就為大家分享一篇關(guān)于15個(gè)頂級(jí)開源JavaScript框架和庫(kù)的文章,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2018-10-10從setTimeout看js函數(shù)執(zhí)行過(guò)程
這篇文章主要介紹了從setTimeout看js函數(shù)執(zhí)行過(guò)程,需要的朋友可以參考下2017-12-12JavaScript中調(diào)用函數(shù)的4種方式代碼實(shí)例
這篇文章主要介紹了JavaScript中調(diào)用函數(shù)的4種方式代碼實(shí)例,本文分別給出方法調(diào)用模式、函數(shù)調(diào)用模式、構(gòu)造器調(diào)用模式、apply調(diào)用模式4種方式的代碼實(shí)例,需要的朋友可以參考下2015-07-07JS實(shí)現(xiàn)關(guān)鍵字搜索時(shí)的相關(guān)下拉字段效果
關(guān)鍵字搜索時(shí)有下拉字段,在使用百度時(shí)會(huì)遇到,本例講述用js實(shí)現(xiàn)類似的效果2014-08-08