jq邮箱自动补全提示

需要输入内容和@才会显示的邮箱补全提示,方便可以输入(手机号/用户名/邮箱)的input输入框

 

html

<div class="emails">
    <input type="text" class="email" placeholder="请输入手机号/用户名/邮箱"/>
    <ul class="autocomplete"></ul>
</div>

 

css

.emails{position:relative;}
.email{padding:0;width:300px;height:30px;text-align:center;border:1px solid #ccc;outline:none;}
.autocomplete{margin:0;padding:0;list-style:none;display:none;position:absolute;left:0;top:31px;text-align:center;border:1px solid #ccc;color:#666;width:300px;}
.autocomplete li{padding:8px 10px;cursor:pointer;}
.autocomplete .active{background: #f37ea2 !important;color:#fff;}
.autocomplete li:hover{background: #fdb3cb;color:#fff;}

 

js

$(function(){
    var reEmail = /^\w+@$/, sLi = '',vsName = '.autocomplete li:visible',email=$('.email'),autocomplete= $('.autocomplete');
    var aSuffix = ['qq.com', '163.com', '126.com', 'sina.com', 'aliyun.com', 'hotmail.com', 'sohu.com', 'gmail.com', 'sina.cn', 'yahoo.com'];
    $.each(aSuffix, function () {
        sLi += '<li></li>';
    });
    email.bind('input propertychange', function () {  // input监听事件
        var emailText = email.val(), newText = '';
        var prefix = emailText.substring(0, emailText.indexOf('@') + 1);//prefix(前缀)= 截取@以及之前的文本
        autocomplete.html(sLi);
        $('.autocomplete li').each(function (i, item) {
            if (reEmail.test(prefix)) { // 如果正则匹配成功prefix,则prefix(@以及之前的文本)+ aSuffix(后缀)
                autocomplete.show();
                $(item).html(prefix + aSuffix[i]);
            }
            if ($(item).html().indexOf(emailText) != -1) { //筛选成功的补全提示显示否则隐藏
                $(item).show();
            } else {
                $(item).hide();
            }
        }).mousedown(function () { // 鼠标按下选取邮箱
            email.val($(this).html());
            autocomplete.hide();
        });
        if (emailText.indexOf('@') <= 0 || $(vsName).length == 0) { // 没有输入@和输入的第一个是@,或全部匹配失败,则隐藏邮箱的补全提示
            autocomplete.hide();
        }
        $(vsName).first().addClass('active').siblings().removeClass('active');
    });
    email.keydown(function (e) {
        if (e.keyCode == 13&&autocomplete.is(':visible')) {  // 回车Enter 选取邮箱
            email.val($('.autocomplete li').filter('.active').text());
            autocomplete.hide();
            e.preventDefault();  // 为了阻止回车Enter默认提交表单
        }
        if (e.keyCode == 38) { // 向上↑
            if ($(vsName).first().is('.active')) {
                $(vsName).last().addClass('active').siblings().removeClass('active');
            } else {
                $(vsName).filter('.active').prevAll(':visible:first').addClass('active').siblings().removeClass('active');
            }
        }
        if (e.keyCode == 40) { // 向下↓
            if ($(vsName).last().is('.active')) {
                $(vsName).first().addClass('active').siblings().removeClass('active');
            } else {
                $(vsName).filter('.active').nextAll(':visible:first').addClass('active').siblings().removeClass('active');
            }
        }
    });
});

 

如果需要input离开焦点后隐藏邮箱补全提示,获得焦点再显示则用以下js

$(function(){
    var reEmail = /^\w+@$/, sLi = '',vsName = '.autocomplete li:visible',email=$('.email'),autocomplete= $('.autocomplete');
    var aSuffix = ['qq.com', '163.com', '126.com', 'sina.com', 'aliyun.com', 'hotmail.com', 'sohu.com', 'gmail.com', 'sina.cn', 'yahoo.com'];
    $.each(aSuffix, function () {
        sLi += '<li></li>';
    });
    email.bind('input propertychange', function () {  // input监听事件
        var emailText = email.val(), newText = '';
        var prefix = emailText.substring(0, emailText.indexOf('@') + 1);//prefix(前缀)= 截取@以及之前的文本
        autocomplete.html(sLi);
        $('.autocomplete li').each(function (i, item) {
            emailFilter(emailText);
            function emailFilter(text) {
                if (reEmail.test(prefix)) { // 如果正则匹配成功prefix,则prefix(@以及之前的文本)+ aSuffix(后缀)
                    autocomplete.show();
                    $(item).html(prefix + aSuffix[i]);
                }
                if ($(item).html().indexOf(text) != -1) { //筛选成功的补全提示显示否则隐藏
                    $(item).show();
                } else {
                    $(item).hide();
                }
            }

            email.focus(function () { //input获得焦点时,newText有输入@ 与 第一个不是@,并且匹配成功,则显示邮箱的补全提示
                if (newText.indexOf('@') > 0) {
                    emailFilter(newText);
                }
                if (newText == $(vsName).text() || $(vsName).length == 0) { //文本框内容和补全提示相等或全部匹配失败,则隐藏补全提示
                    autocomplete.hide();
                }
            }).blur(function () {  // input 离开焦点时,给newText赋值离开焦点时的文本内容,然后隐藏邮箱的补全提示。
                newText = email.val();
                autocomplete.hide();
            });

        }).mousedown(function () { // 鼠标按下选取邮箱
            email.val($(this).html());
        });
        if (emailText.indexOf('@') <= 0 || $(vsName).length == 0) { // 没有输入@和输入的第一个是@,或全部匹配失败,则隐藏邮箱的补全提示
            autocomplete.hide();
        }
        $(vsName).first().addClass('active').siblings().removeClass('active');
    });
    email.keydown(function (e) {
        if (e.keyCode == 13&&autocomplete.is(':visible')) {  // Enter 选取邮箱
            email.val($('.autocomplete li').filter('.active').text());
            autocomplete.hide();
            e.preventDefault();  // 为了阻止Enter默认提交表单
        }
        if (e.keyCode == 38) { // 向上↑
            if ($(vsName).first().is('.active')) {
                $(vsName).last().addClass('active').siblings().removeClass('active');
            } else {
                $(vsName).filter('.active').prevAll(':visible:first').addClass('active').siblings().removeClass('active');
            }
        }
        if (e.keyCode == 40) { // 向下↓
            if ($(vsName).last().is('.active')) {
                $(vsName).first().addClass('active').siblings().removeClass('active');
            } else {
                $(vsName).filter('.active').nextAll(':visible:first').addClass('active').siblings().removeClass('active');
            }
        }
    });
});

 

 

如需转载,请注明出处 https://my.oschina.net/u/3545669/blog/1377346

                

                                                         

                                                                                                            世界以痛吻我,要我回报以歌。

                                                                                                            加油~我一定可以的!

 

转载于:https://my.oschina.net/u/3545669/blog/1377346

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值