<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />
<title>登录</title>
<style type="text/css">
.input-content {
width: 200px;
}
.input {
width: inherit;
padding: 0;
height: 30px;
line-height: 30px;
border: 1px solid #BBBBBB;
}
.layer {
margin-top: 2px;
width: 200px;
border: 1px solid #BBBBBB;
}
.layer-list {
margin: 0;
padding: 0;
}
.layer-list li {
margin: 0;
padding: 5px;
list-style-type: none;
}
.hide {
display: none;
}
.show {
display: block;
}
</style>
</head>
<body>
<div class="input-content">
<input class="input" type="text" placeholder="输入账号" id="account" />
</div>
<div class="layer hide">
<ul class="layer-list">
<li class="layer-list-item" data-action="sina.com">sina.com</li>
</ul>
</div>
<script type="text/javascript">
/**
* autoCompleteTextview
* 类似新浪微博登录
* 输入账号时出现@后关联出邮箱后缀信息
*/
var RE_ECHO = new RegExp('@');
var RE_ECHO_VAL = new RegExp('.*@');
var CLASS_SHOW = 'show';
var CLASS_HIDE = 'hide';
// 邮箱的后缀
var emailList = [
'sina.com', '163.com', 'qq.com', '126.com', 'vip.sina.com',
'sina.cn', 'hotmail.com', 'gmail.com', 'sohu.com', '139.com',
'wo.com', '189.com', '21cn.com'
];
// 过滤账号的值
var getSuffixList = function(value) {
var filter = value.split('@')[1];
if(filter) {
var arr = [];
for(var i = 0, len = emailList.length; i < len; i++) {
var item = emailList[i];
if(item.indexOf(filter) === 0) {
arr.push(item);
}
}
return arr;
}
return emailList;
};
// 邮箱后缀
var createEmail = function(value) {
var itemTpl = '<li class="layer-list-item">{{value}}{{action}}</li>';
var ITEM_ACTION = '{{action}}';
var ITEM_VALUE = '{{value}}';
var listHtml = '';
var suffixList = getSuffixList(value);
if(suffixList.length) {
for(var i = 0, len = suffixList.length; i < len; i++) {
listHtml += itemTpl.replace(ITEM_ACTION, suffixList[i]).replace(ITEM_VALUE, value.match(RE_ECHO_VAL)[0]);
}
}
return listHtml;
};
var layerEL = document.querySelector('.layer');
var listEl = layerEL.querySelector('.layer-list');
var inputEL = document.getElementById('account');
var inputChange = function(e) {
var value = e.target.value;
if(RE_ECHO.test(value)) {
var html = createEmail(value);
if(html) {
listEl.innerHTML = createEmail(value);
showLayer();
} else {
hideLayer();
}
}
};
var showLayer = function() {
var className = layerEL.className;
if(~className.indexOf(CLASS_HIDE)) {
className = className.replace(CLASS_HIDE, CLASS_SHOW);
layerEL.className = className;
}
};
var hideLayer = function() {
var className = layerEL.className;
if(~className.indexOf(CLASS_SHOW)) {
className = className.replace(CLASS_SHOW, CLASS_HIDE);
layerEL.className = className;
}
};
// 输入
inputEL.addEventListener('input', inputChange);
// 获取焦点,显示;
inputEL.addEventListener('focus', inputChange);
// 点击其它区域,隐藏列表区域;
document.addEventListener('click', function(e) {
var target = e.target;
if(target !== inputEL && target.tagName !== 'DIV' && !~target.className.indexOf('layer')) {
hideLayer();
}
}, false);
// 选择
layerEL.addEventListener('click', function(e) {
var target = e.target;
if(target.tagName === 'LI') {
var text = target.innerText;
inputEL.value = text;
hideLayer();
}
}, false);
</script>
</body>
</html>