---恢复内容开始---javascript
当咱们注册或者登陆要用邮箱格式时会显示邮箱后缀的提示下拉框css
效果如图所示html
主要介绍了JS输入用户名自动显示邮箱后缀列表的方法,可实现自动显示邮箱后缀名列表的功能,java
原理是:一个输入框 当我输入任何字的时候 自动下拉相应的邮箱提示,在输入框输入11的时候 下拉框有全部11的邮箱 输入其余的时候 有其余文案对应的邮箱。jquery
同理 此插件不须要任何html标签,只须要一个输入框 有相对应的id类名就ok 且父级有个class类名,其余的都不须要。内部的HTML代码都是自动生成的正则表达式
下面即是此功能代码;数组
此段代码引用了jq 因此须要先引入jq.js;app
<script src="http://apps.bdimg.com/libs/jquery/1.6.4/jquery.js"></script>
把咱们须要提示的邮箱后缀存入数组;this
var emailsorce = ["@sina.com", "@163.com", "@qq.com", "@126.com", "@vip.sina.com", "@sina.cn", "@hotmail.com", "@gmail.com", "@sohu.com", "@yahoo.cn", "@139.com", "@wo.com.cn", "@189.cn"];
接下来就是面向对象的内容,中间都有注释;插件
var email={ init:function(){ var that=this; $("#email").focus(function(){ if($(this).val()==""){ that.hint(); }else{ $("#closeuser").css({"display": "block"});//消除按钮显示 } }) }, bindeven:function(){ this.chose(); this.delet(); this.miss(); }, miss:function(){//失去焦点删除按钮隐藏 下拉选项消失 判断是否为邮箱格式 $("#email").blur(function(){ $("#closeuser").css({"display": "none"}); $("#sele").css({"display": "none"}); var filter = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;//邮箱正则表达式 if(filter.test($("#email").val())){//是邮箱格式 $("#email").css({"border":"0.1rem solid #0cbd19"}) }else{//不是邮箱格式 $("#email").css({"border":"0.1rem solid #ff072f"}) } }) }, hint:function(){//初始输入出现邮箱选项 消除按钮出现 var that=this; $("#email").on("input",function(){ if($(this).val()!=""){ if($(this).val().indexOf("@")==-1){//是否输入到@ $("#sele").html("");//每次输入初始化 $("#sele").css({"display": "block"}); for(var i=0;i<emailsorce.length;i++){//把集合的邮箱加入li中 var li=$("<li>"+$(this).val()+emailsorce[i]+"</li>"); $("#sele").append(li); } $("#closeuser").css({"display": "block"});//消除按钮显示 }else{ var arr=$(this).val().split("@"); if(arr[1]!=""){//筛选@以后的内容 $("#sele").html("");//每次输入初始化 for(var i=0;i<emailsorce.length;i++){ var temp=emailsorce[i].split(".")[0]; if(temp.indexOf(arr[1])!=-1){//筛选选项是否含有输入的内容 有显示 没有隐藏 var li=$("<li>"+arr[0]+emailsorce[i]+"</li>"); $("#sele").append(li); } } } } }else{ //单框内没内容消除按钮隐藏 下拉选项隐藏 $("#closeuser").css({"display": "none"}); $("#sele").css({"display": "none"}); } }) }, chose:function(){ $(document).on("touchstart","#sele li",function(){ //点击下拉框选项 框内内容为点击选项 下拉框消失 删除按钮消失 $("#email").val($(this).html()); $("#closeuser").css({"display": "none"}); $("#sele").css({"display": "none"}); }) }, delet:function(){ //框内内容删除 下拉框隐藏 $(document).on("touchstart","#closeuser",function(){ //点击消除按钮事件 $("#email").val(""); $("#sele").css({"display": "none"}); $("#closeuser").css({"display": "none"}); }) } }
下面只要调用就ok了;
email.init(); email.bindeven();
1、功能分析: 1.input输入框的值,发生变化时,显示提示的下拉层; 2.input输入框的值,发生变化时,显示提示的下拉层,会根据输入的内容自动往“@”前面添加; 3.input输入框的值,发生变化时,显示提示的下拉层,会根据输入的内容对下拉层“@”后面的内容进行筛选; 4.点击下拉层里面的提示内容,会将其值,填充到输入框; 5.按下鼠标回车键会将其选中的下拉层里的内容,填充到输入框; 6.按键盘的“向上”或“向下”的方向键,能够在下拉层的选项中移动(循环移动,改变当前LI的背景色); 7.鼠标悬停在下拉层的LI上面时,会有一个背景色。 2、功能实现: 1.input输入框的值,发生变化时的事件是:propertychange(IE)或input(标准); 2.在发生propertychange事件的时候,取其输入框的值,再取其“@”前面的值,并赋值给下拉层里面的LI加上LI的email属性值; 3.在发生propertychange事件的时候, 3.1取其输入框的值,再取其“@”后面的值, 3.2并将这个值与下拉层里面的LI的email属性值进行正则匹配; 这里要注意,正则字面量方法,是不能用变量的。因此这里用的是new方式。 这里的正则是取的输入框“@”后面的值,因此正则,是变化的。而LI的EMAIL属性值是不变的 4.这里用了一个事件委托方式,将点击事件绑定给document,而后经过判断,点击时最初触发的DOM元素,是什么。来决定, 4.1否隐藏下拉提示层? 4.2仍是须要将下拉层,选中的值,赋给输入框 (这里不能直接使用,当输入框失去焦点时,隐藏下拉提示层,由于会与点击下拉层,将其值填入输入框,这个功能有逻辑上的矛盾;) 5.和上面第4条差很少; 6.就是要注意,在鼠标悬停时,把当前的LI索引存入一个全局变量当中,这样就能够告诉“向上”或“向下”按键时,的起始位置了;