自动提示 版本1.1中由于发送的是同步请求,经fiddler低网速测试,发现在查询数据返回之前,浏览器会卡死,体验很不好,昨晚修改了下,改为发送异步请求,不会出现卡死的情况了。
JavaScript代码
/* * author: realwall * email: realwall@126.com */ (function(window){ var autoClue = { clue : function(getContentUrl, txt, clue, txtInitValue, txtEnterAction){ /* * getContentUrl 提示数据的请求地址 * txt 文本框dom对象 * clue ul无序列表dom对象 * txtInitValue 文本框初始化文本 * txtEnterAction 用户输入完成,按enter键后触发的函数 */ var isInit = false; clue.style.display = "none"; var cluestr = clue.id; var createList = function(data){ var i, str='', len = data.length; for(i = 0; i < len && i < 10; i++){ str += '<li id="list' + cluestr + i +'">' + decodeURIComponent(data.pop()); +'</li>'; } return str; }; if(!isInit){ txt.value = txtInitValue; } txt.onfocus = function(){ if(!isInit || txt.value == txtInitValue){ txt.value = ""; } }; txt.onblur = function(){ if(txt.value == ''){ txt.value = txtInitValue; } }; txt.onkeyup = function(event){ event = event || window.event; var input = encodeURIComponent(txt.value); var result = new Array(); var i, len = input.length, resultLen; if(input == null || input == ''){ isInit = true; return false; } if(event.keyCode == 40 && clue.innerHTML){ var listLen = clue.children.length, i, curIndex = -1; for(i = 0; i < listLen; i++){ var tmp = clue.childNodes[i].style.backgroundColor; if(tmp != "" && tmp != null && tmp != "none"){ curIndex = i; var curList = document.getElementById("list" + cluestr + i); if(navigator.appName =="Microsoft Internet Explorer"){ curList.style.backgroundColor = ""; }else{ curList.style.backgroundColor = null; } if(i == listLen-1){ curIndex = -1; } break; }; } var nextList = document.getElementById("list"+cluestr+(curIndex+1)); nextList.style.backgroundColor = "#D1E5FC"; txt.value = nextList.innerHTML; txt.focus(); return false; } if(event.keyCode == 38 && clue.innerHTML){ var listLen = clue.children.length, i, curIndex = 0; for(i = 0; i < listLen; i++){ var tmp = clue.childNodes[i].style.backgroundColor; if(tmp != "" && tmp != null && tmp != "none"){ curIndex = i; var curList = document.getElementById("list" + cluestr + i); if(navigator.appName =="Microsoft Internet Explorer"){ curList.style.backgroundColor = ""; }else{ curList.style.backgroundColor = null; } if(i == listLen-1){ curIndex = -1; } break; }; } var preList=document.getElementById("list"+cluestr+((curIndex-1+listLen)%listLen)); preList.style.backgroundColor = "#D1E5FC"; txt.value = preList.innerHTML; txt.focus(); return false; } if(event.keyCode == 13 && clue.innerHTML){ var listLen = clue.children.length, i, curIndex = -1, submitFlag = true; for(i = 0; i < listLen; i++){ var tmp = clue.childNodes[i].style.backgroundColor; if(tmp != "" && tmp != null && tmp != "none"){ submitFlag = false; curIndex = i; var curList = document.getElementById("list" + cluestr + i); txt.value = curList.innerHTML; clue.innerHTML = ""; clue.style.display = "none"; break; }; } if(submitFlag){ txtEnterAction(); } return false; } if(event.keyCode == 13 && clue.innerHTML == ''){ txtEnterAction(); return false; } if(txt.value != ''){ $.post(getContentUrl,{'input':txt.value},function(data){ if(data == null){//data格式:[{name:'realwall'},{name:'可以是中文'}] clue.style.display = "none"; return; } var i, len = data.length, content = []; for(i = 0; i < len; i++){ content.push(encodeURIComponent(data[i].name)); } var ilen = input.length; for(i = 0; i < content.length; i++){ if(input == content[i].substring(0, ilen)){ result.push(content[i]); } } resultLen = result.length; resultStr = createList(result); clue.innerHTML = resultStr; clue.style.display = "block"; for(i = 0; i < resultLen && i < 10; i++){ var list = document.getElementById("list" + cluestr + i); list.onclick = function(){ txt.value = this.innerHTML; clue.style.display = "none"; }; } }, 'json'); } }; document.body.onclick = function(){ if(clue.style.display != "none"){ clue.style.display = "none"; } }; } }; window.autoClue = autoClue; })(window);
HTML代码
<div id="inputclue"> <input type="text" id="txt" class=""> <ul id="clue" style="display: none;"> </ul> </div>
调用autoComplete的js代码
var clue = document.getElementById("clue"); var search = document.getElementById("txt"); autoClue.clue('getDataUrl', search, clue, "请输入", function(){searchQuery();}); function searchQuery(){ var query = encodeURIComponent(search.value); if(query != ''){ window.location.href = 'result_list.html?query=' + query; } }