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判断就是为了解决这个问题的。