常用组件系列(2),邮箱输入自动提示后缀。

146 阅读1分钟

直接上效果

邮箱自动提示.gif

逻辑

html部分,一个input框,一个用来放提示内容的ul标签。

<label value="Your Email" class="emailPosition place_text-max">
    <ul class="emailSuggestions"></ul>
    <input type="email" placeholder="" class="email emailInput" autocomplete="off">
</label>

css部分,设置提示内容的显示样式,以及位置

 .emailPosition {
        position: relative;
    }
 
.emailSuggestions {
    position: absolute;
    z-index: 1;
    background: #ffffff;
    width: 100%;
    left: 0;
    top: 50px;
    height: 300px;
    overflow: auto;
    border: 1px solid #DDDDDD;
    display: none;
}

.emailSuggestions li {
    padding: 7px 10px;
}

.emailSuggestions li:hover {
    cursor: pointer;
    background-color: #660099;
    color: #ffffff;
}

js部分,创建一个后缀数组

 var emailSuffixes = [
    "gmail.com",
    "icloud.com",
    "outlook.com",
    "outlook.jp",
    "hotmail.com",
    "yahoo.com",
    "yahoo.com.cn",
    "live.com",
    "sohu.com",
    "sina.cn",
    "sina.com",
    "aol.com",
    "126.com",
    "139.com",
    "yandex.com",
    "zoho.com",
    "mail.com",
    "mail.ru",
    "protonmail.com",
    "gmx.com"
];

设置邮箱输入框的输入事件,判断如果输入框为空,隐藏提示列表,反之显示

$(".emailInput").on("input", function () {
    var inputText = $(this).val();
    var suggestions = [];
    //console.log(inputText)
    if (inputText == "") {
        $(this).siblings("#emailSuggestions").hide();
    } else {
      //显示逻辑
      displaySuggestions(suggestions, $(this).siblings(".emailSuggestions"));
    }
});

对输入内容进行处理,如果输入中包含'@',则根据 '@' 将内容分为前缀和后缀,并筛选匹配的邮箱后缀进行补全;否则,将所有后缀与输入内容拼接。

if (inputText.includes("@")) { ... } else { ... }

监听提示内容点击事件,并进行赋值

$(".emailSuggestions").on("click", "li", function () {
    var selectedEmail = $(this).text();
    //console.log(selectedEmail)
    $(this).parents().siblings(".emailInput").val(selectedEmail);
    $(this).parents().siblings(".emailInput").attr('value', selectedEmail);
    $(this).parents(".emailSuggestions").hide();
});

点击页面其他地方隐藏提示内容列表

$(document).on("click", function (event) {
    if (
        !$(event.target).closest(".emailSuggestions").length &&
        !$(event.target).is(".emailInput")
    ) {
        $(".emailSuggestions").hide();
    }
});

提示内容显示函数

function displaySuggestions(suggestions, $html) {
    $html.empty();
    suggestions.forEach(function (suggestion) {
        var listItem = $("<li>").text(suggestion);
        $html.append(listItem);
    });
    $html.show();
}

完整js代码

$(document).ready(function () {
        // 邮箱后缀列表
        var emailSuffixes = [
            "gmail.com",
            "icloud.com",
            "outlook.com",
            "outlook.jp",
            "hotmail.com",
            "yahoo.com",
            "yahoo.com.cn",
            "live.com",
            "sohu.com",
            "sina.cn",
            "sina.com",
            "aol.com",
            "126.com",
            "139.com",
            "yandex.com",
            "zoho.com",
            "mail.com",
            "mail.ru",
            "protonmail.com",
            "gmx.com"
        ];
        $(".emailInput").on("input", function () {
            var inputText = $(this).val();
            var suggestions = [];
            //console.log(inputText)
            if (inputText == "") {
                $(this).siblings("#emailSuggestions").hide();
            } else {
    
                if (inputText.includes("@")) {
                    var prefix = inputText.split("@")[0];
                    var suffix = inputText.split("@")[1];
    
                    suggestions = emailSuffixes
                        .filter(function (suffix) {
                            return suffix.startsWith(suffix);
                        })
                        .map(function (suffix) {
                            return prefix + "@" + suffix;
                        });
                } else {
                    suggestions = emailSuffixes.map(function (suffix) {
                        return inputText + "@" + suffix;
                    });
                }
                displaySuggestions(suggestions, $(this).siblings(".emailSuggestions"));
            }
    
        });
        $(".emailSuggestions").on("click", "li", function () {
            var selectedEmail = $(this).text();
            //console.log(selectedEmail)
            $(this).parents().siblings(".emailInput").val(selectedEmail);
            $(this).parents().siblings(".emailInput").attr('value', selectedEmail);
            $(this).parents(".emailSuggestions").hide();
        });
    
        $(document).on("click", function (event) {
            if (
                !$(event.target).closest(".emailSuggestions").length &&
                !$(event.target).is(".emailInput")
            ) {
                $(".emailSuggestions").hide();
            }
        });
    });
    function displaySuggestions(suggestions, $html) {
        $html.empty();
        suggestions.forEach(function (suggestion) {
            var listItem = $("<li>").text(suggestion);
            $html.append(listItem);
        });
        $html.show();
    }