HTML5 datalist与动态邮箱地址演示实例页面

回到相关文章 »

代码:

HTML代码:
邮箱:<input type="email" id="email" list="emailList" name="off_autocomplete" />
<datalist id="emailList">
    <option value="*@qq.com">
    <option value="*@163.com">
    <option value="*@gmail.com">
    <option value="*@yahoo.com.cn">
    <option value="*@126.com">
</datalist>
                
JS代码:
var eleList = document.getElementById("emailList")
    , eleMail = document.getElementById("email")
    , htmlListInit = '', arrEmailList = [];
    
if (eleMail && eleList && (htmlListInit = eleList.innerHTML) !== '') {    
    // 得到类似["qq.com", "163.com", "gmail.com", ...]的数据
    arrEmailList = [].slice.call(eleList.getElementsByTagName("option")).map(function(option) {
        return option.value.replace("*@", "");    
    });

    eleMail.fnListReplace = function() {
        var arrValue = this.value.trim().split("@");
        // 修复FireFox浏览器下无限input问题
        // 如果值不完全匹配某option值,执行动态替换 
        if (arrValue.length !== 2 || arrEmailList.indexOf(arrValue[1]) === -1) {
            eleList.innerHTML = htmlListInit.replace(/\*/g, arrValue[0]);
        }        
        return this;
    };
    // 绑定输入事件侦听
    eleMail.addEventListener("input", function() {
        this.fnListReplace.call(this);        
    }, false);
    
    //  载入即匹配
    eleMail.fnListReplace.call(eleMail).focus();
} else {
    eleList = document.createElement("datalist");
    eleList.innerHTML = '<p class=sorry>抱歉,当前浏览器不支持HTML5 datalist.</p>';    
    eleMail.parentNode.appendChild(eleList);
}           
                

效果:

邮箱:

FireFox浏览器下(v19.0.2),datalist列表的HTML改变会触发列表的显示。因此,会出现下面的问题:当我们点击或回车确认datalist中我们需要的邮件项时候,文本框赋值——触发了"input"事件,HTML替换,于是datalist再次显示,于是,形成了一个死循环,点击列表列表永远存在,不会消失。在Opera以及Chrome浏览器下没有此问题。

不过问题可以解决,在JS代码中,arrEmailList获取以及eleMail.fnListReplace方法中的if判断就是为了解决这个问题的。