仿百度輸入框智能提示的js代碼
最近客戶需求老是變更,不過(guò)有些是因?yàn)榭蛻舸叩眉?,我沒(méi)有那么快能完成,所以先做了一個(gè)雛形給他們,后來(lái)再慢慢改。比如雛形那里我做了一個(gè)下拉列表給他們,事實(shí)上他們的數(shù)據(jù)有200多條,用個(gè)下拉列表的話很不現(xiàn)實(shí),你能找那么多?而且那個(gè)下拉列表該有多長(zhǎng)???所以很自然的,我想到了百度那個(gè)智能提示的功能。
參考了一下之前忘記是哪位大俠寫(xiě)的東西,他的是使用百度api的,為了簡(jiǎn)單起見(jiàn),我把數(shù)據(jù)都定在了js那里,這樣看官們?nèi)菀桌斫庖恍?/P>
還是整個(gè)代碼考上來(lái)吧,代碼不長(zhǎng)。考了一下之前忘記是哪位大俠寫(xiě)的東西,他的是使用百度api的,為了簡(jiǎn)單起見(jiàn),我把數(shù)據(jù)都定在了js那里,這樣看官們?nèi)菀桌斫庖恍?BR>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title></title>
<style type="text/css">
.search
{
left: 0;
position: relative;
}
#auto_div
{
display: none;
width: 300px;
border: 1px #74c0f9 solid;
background: #FFF;
position: absolute;
top: 24px;
left: 0;
color: #323232;
}
</style>
<script src="jquery-1.7.2.min.js" type="text/javascript"></script>
<script type="text/javascript">
//測(cè)試用的數(shù)據(jù)
var test_list = ["小張", "小蘇", "小楊", "老張", "老蘇", "老楊", "老爺爺", "小妹妹", "老奶奶", "大鵬", "大明", "大鵬展翅", "你好", "hello", "hi"];
var old_value = "";
var highlightindex = -1; //高亮
//自動(dòng)完成
function AutoComplete(auto, search, mylist) {
if ($("#" + search).val() != old_value || old_value == "") {
var autoNode = $("#" + auto); //緩存對(duì)象(彈出框)
var carlist = new Array();
var n = 0;
old_value = $("#" + search).val();
for (i in mylist) {
if (mylist[i].indexOf(old_value) >= 0) {
carlist[n++] = mylist[i];
}
}
if (carlist.length == 0) {
autoNode.hide();
return;
}
autoNode.empty(); //清空上次的記錄
for (i in carlist) {
var wordNode = carlist[i]; //彈出框里的每一條內(nèi)容
var newDivNode = $("<div>").attr("id", i); //設(shè)置每個(gè)節(jié)點(diǎn)的id值
newDivNode.attr("style", "font:14px/25px arial;height:25px;padding:0 8px;cursor: pointer;");
newDivNode.html(wordNode).appendTo(autoNode); //追加到彈出框
//鼠標(biāo)移入高亮,移開(kāi)不高亮
newDivNode.mouseover(function () {
if (highlightindex != -1) { //原來(lái)高亮的節(jié)點(diǎn)要取消高亮(是-1就不需要了)
autoNode.children("div").eq(highlightindex).css("background-color", "white");
}
//記錄新的高亮節(jié)點(diǎn)索引
highlightindex = $(this).attr("id");
$(this).css("background-color", "#ebebeb");
});
newDivNode.mouseout(function () {
$(this).css("background-color", "white");
});
//鼠標(biāo)點(diǎn)擊文字上屏
newDivNode.click(function () {
//取出高亮節(jié)點(diǎn)的文本內(nèi)容
var comText = autoNode.hide().children("div").eq(highlightindex).text();
highlightindex = -1;
//文本框中的內(nèi)容變成高亮節(jié)點(diǎn)的內(nèi)容
$("#" + search).val(comText);
})
if (carlist.length > 0) { //如果返回值有內(nèi)容就顯示出來(lái)
autoNode.show();
} else { //服務(wù)器端無(wú)內(nèi)容返回 那么隱藏彈出框
autoNode.hide();
//彈出框隱藏的同時(shí),高亮節(jié)點(diǎn)索引值也變成-1
highlightindex = -1;
}
}
}
//點(diǎn)擊頁(yè)面隱藏自動(dòng)補(bǔ)全提示框
document.onclick = function (e) {
var e = e ? e : window.event;
var tar = e.srcElement || e.target;
if (tar.id != search) {
if ($("#" + auto).is(":visible")) {
$("#" + auto).css("display", "none")
}
}
}
}
$(function () {
old_value = $("#search_text").val();
$("#search_text").focus(function () {
if ($("#search_text").val() == "") {
AutoComplete("auto_div", "search_text", test_list);
}
});
$("#search_text").keyup(function () {
AutoComplete("auto_div", "search_text", test_list);
});
});
</script>
</head>
<body>
<div class="search">
<input type="text" id="search_text" />
<div id="auto_div">
</div>
</div>
</body>
</html>
大家復(fù)制代碼的時(shí)候記得把jquery帶上,不然出錯(cuò)了又要來(lái)罵娘了……
說(shuō)說(shuō)主要的思路吧。
首先,把數(shù)據(jù)弄成一個(gè)js數(shù)組,然后遍歷這個(gè)數(shù)組,每一條數(shù)據(jù)生成一個(gè)div,然后添加到auto_div這個(gè)div里,還要設(shè)置一下鼠標(biāo)移過(guò)高亮,移開(kāi)恢復(fù)正常,以及點(diǎn)擊的時(shí)候自動(dòng)填上文本框里,還有鼠標(biāo)在網(wǎng)頁(yè)點(diǎn)擊的時(shí)候列表框會(huì)消失——當(dāng)然還有更多細(xì)節(jié)要注意,這里只是舉個(gè)例子。怎樣讓文本框里的文本改變的時(shí)候就觸發(fā)AutoComplete事件呢?用onchange?錯(cuò),onchange是文本框失去光標(biāo)的時(shí)候才會(huì)觸發(fā),所以使用keyup事件會(huì)好一點(diǎn)。
別的不多說(shuō),代碼也不難看懂,原理也很簡(jiǎn)單。我要強(qiáng)調(diào)的一點(diǎn)是,像這種智能提示功能可能有些新手會(huì)想到用模糊搜索,當(dāng)文本框里的文本改變的時(shí)候就去查一下數(shù)據(jù)庫(kù),把返回的數(shù)據(jù)列出來(lái)——這是不好的做法,我不說(shuō)他錯(cuò)誤因?yàn)檫@樣確實(shí)可行,但是這會(huì)給服務(wù)器造成太大的負(fù)擔(dān),每改變一下文本就查一下數(shù)據(jù)庫(kù),就好像我每要一樣?xùn)|西就要向你問(wèn)一下一樣,倒不如你一次把它們?nèi)o我,我要什么自己選。當(dāng)然凡事都有兩面性,把所有數(shù)據(jù)一次性查出來(lái)的后果是耗內(nèi)存,大數(shù)據(jù)不建議這樣做,這種做法適用于大部分情況,因?yàn)榇蟛糠智闆r都不是大數(shù)據(jù)——大數(shù)據(jù)的,另想它法。
最后說(shuō)說(shuō)我的感受:之前面試過(guò)前端工程師,那時(shí)候人家覺(jué)得我還嫩,確實(shí)那時(shí)候特嫩?,F(xiàn)在,我在前端的領(lǐng)域正開(kāi)始慢慢強(qiáng)大起來(lái),雖然公司沒(méi)有前端工程師,但是我還是覺(jué)得前端很重要,我要合理運(yùn)用前端來(lái)解決一些用前端很簡(jiǎn)單就能解決的問(wèn)題,而不是丟給后臺(tái)來(lái)處理。
在公司做著做著,雖然跟別人學(xué)到的東西不多,但是需求來(lái)了,自己想辦法以及在網(wǎng)上找一些解決方案,自己也學(xué)到不少東西。繼續(xù)做,加油!
- js文本框輸入內(nèi)容智能提示效果
- jQuery在vs2008及js文件中的無(wú)智能提示的解決方法
- 頁(yè)面版文本框智能提示JS代碼
- JS實(shí)現(xiàn)仿google、百度搜索框輸入信息智能提示的實(shí)現(xiàn)方法
- VSCode中如何利用d.ts文件進(jìn)行js智能提示
- JS實(shí)現(xiàn)搜索關(guān)鍵詞的智能提示功能
- asp.net 頁(yè)面版文本框智能提示JSCode (升級(jí)版)
- 利用jsonp跨域調(diào)用百度js實(shí)現(xiàn)搜索框智能提示
- 百度搜索框智能提示案例jsonp
- 如何為你的JS項(xiàng)目添加智能提示與類型檢查詳解
相關(guān)文章
有趣的思路~~JS仿 WINXP 注銷(xiāo)桌面漸隱效果
有趣的思路~~JS仿 WINXP 注銷(xiāo)桌面漸隱效果...2006-10-10javaScript中定義類或?qū)ο蟮奈宸N方式總結(jié)
下面小編就為大家?guī)?lái)一篇javaScript中定義類或?qū)ο蟮奈宸N方式總結(jié)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-12-12cnblogs 代碼高亮顯示后的代碼復(fù)制問(wèn)題解決實(shí)現(xiàn)代碼
cnblogs是比較有名的技術(shù)博客基地,很多技術(shù)達(dá)人都在里面發(fā)布技術(shù)文章, 不過(guò)由于代碼不利于復(fù)制,因?yàn)轫?yè)面里面有pre標(biāo)簽等問(wèn)題2011-12-12JavaScript二叉搜索樹(shù)構(gòu)建操作詳解
這篇文章主要介紹了JavaScript二叉搜索樹(shù)構(gòu)建操作詳解,文章圍繞主題展開(kāi)二叉搜索樹(shù)的性質(zhì)以及二叉搜索樹(shù)的構(gòu)建、查找和刪除等內(nèi)容,需要的小伙伴可以參考一下2022-07-07使用JS將字符串保存成文件到本地(.txt、.json、.md)
工作中有時(shí)需要通過(guò)JavaScript保存文件到本地,下面這篇文章主要給大家介紹了關(guān)于使用JS將字符串保存成文件到本地的相關(guān)資料,分別包括生成.txt、.json、.md等文件,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-06-06關(guān)于JavaScript中的this指向問(wèn)題總結(jié)篇
在小編面試過(guò)程中經(jīng)常會(huì)遇到j(luò)avascript中this指向問(wèn)題,可以說(shuō)是前端面試必問(wèn),下面小編給大家總結(jié)了一下js中this的指向,感興趣的朋友一起學(xué)習(xí)吧2017-07-07JavaScript模擬可展開(kāi)、拖動(dòng)與關(guān)閉的聊天窗口實(shí)例
這篇文章主要介紹了JavaScript模擬可展開(kāi)、拖動(dòng)與關(guān)閉的聊天窗口,實(shí)例分析了javascript實(shí)現(xiàn)可拖動(dòng)的div層相關(guān)技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-05-05