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