javascript 实现的智能邮箱后缀提示

by gothic

HTML

<div id="login_box" method="post">
	<div class="clearfix">
		<label for="email">电子邮箱:</label>
		<input type="text" id="email" autocomplete="off" />
		<button>提交</button>
	</div>
	<ul id="email_list">
		<li>请选择邮箱类型</li>
        <li></li>
		<li>@163.com</li>
		<li>@126.com</li>
		<li>@qq.com</li>
		<li>@yahoo.com.cn</li>
		<li>@gmail.com</li>
		<li>@sohu.com</li>
		<li>@hotmail.com</li>
	</ul>
</div>

CSS

#login_box { position:relative; }
.clearfix label { font-size:14px; float:left; }
.clearfix { height:30px; line-height:30px; }
.clearfix:after { height:0; visibility:hidden; content:"."; overflow:hidden; display:block; }
#email { width:180px; height:18px; border:1px solid #74c9e6; padding:5px 6px; background:#fff; margin-left:10px; -moz-border-radius:2px; border-radius:2px; font-family:arial; float:left; }
#email_list { padding-left: 0; width:192px; list-style:none; border:1px solid #74c9e6; -moz-border-radius:0 0 2px 2px; border-radius:2px; position:absolute; top:29px; left:80px; background:#fff; display:none; }
#email_list li { width:100%; height:30px; line-height:30px; text-indent:10px; cursor:pointer; overflow:hidden; }
#email_list li.first_li { cursor:default; }
#email_list .current { background:#baeafb; }

JavaScript

(function(){

		/* 初始化 */
		var emailInput = document.getElementById('email'),
			list = document.getElementById('email_list'),
			items = list.getElementsByTagName('li'),
			item1 = items[1],
			len = items.length,
			suffix = [],
			newSuffix, indexA, indexB,
			highlight = 'current',
			isIE = navigator.userAgent.toLowerCase().indexOf('msie') != -1,
			clearClassname = function(){
				for(var i = 1,el;i < len && (el = items[i]);i++){
					el.className = '';
				}
			};

		/* 将邮箱后缀存放到一个新数组中 */
		for(var j = 1,el;j < len && (el = items[j]);j++){
			suffix[suffix.length++] = el.innerHTML;
		}

		/* 邮箱输入框绑定keyup事件 */
		emailInput.onkeyup = suggest;

		/* suggest核心部分 */
		function suggest(event){
			var e = event || window.event,
				eCode = e.keyCode,
				val = this.value,
				index = val.indexOf('@'),
				isIndex = index !== -1;

			clearClassname();
			//输入框不为空
			if(val){
				item1.className = highlight;
				list.style.display = 'block';
				for(var i = 1,el;i < len && (el = items[i]);i++){
					el.onmouseover = function(){
						clearClassname();
						item1.className = '';
						this.className = highlight;
						indexA = 1;
						indexB = 0;
					}
					el.onmouseout = function(){
						this.className = '';
						item1.className = highlight;
					}
					el.onclick = function(){
						emailInput.value = this.innerHTML;
					}
				}
			}
			//输入框为空
			else{
				item1.className = '';
				for(var i = 1,el;i < len && (el = items[i]);i++){
					el.onmouseout = el.onmouseover = el.onclick = null;
				}
				if(eCode === 38 || eCode === 40 || eCode === 13) return;
			}

			item1.innerHTML = val;
			newSuffix = [];  //初始化空数组
			for(var i = 1, el ;i < len && (el = items[i]);i++){
				/* 以邮箱后缀和输入框中@标志符后是否
				   有相同的字符串来显示或隐藏该元素 */
				el.style.display = isIndex && el.innerHTML.indexOf(val.substring(index)) === -1 ? 'none' : 'block';
				if( i > 1 ) el.innerHTML = (isIndex ? val.substring(0,index) : val) + suffix[i-1];
				/* 出现@标志符时将新的元素的排列顺序
				   存放到空数组newSuffix中...