jQuery Autocomplete自動(dòng)完成插件
更新時(shí)間:2010年07月17日 20:21:00 作者:
jQuery Autocomplete plugin 寫的比較滿意,拿出來分享,歡迎大家找BUG。
相對(duì)于同類插件,他的特色有3點(diǎn)。
1、可緩存查詢結(jié)果 (二次查詢速度快)
2、非keyup監(jiān)聽方式 (解決某些系統(tǒng)/情況下無法觸發(fā)keyxxx事件的問題)
3、簡(jiǎn)潔的參數(shù) (好看?)
插件性能尚好,我的E6500、2G內(nèi)存,30秒內(nèi)一共發(fā)生了4469次調(diào)用,耗時(shí)94.65毫秒;百度的是2432次調(diào)用,80.24毫秒。
接近1倍的調(diào)用是jQuery中的問題,但具體原因我還沒弄明白,如果那位兄弟知道的還請(qǐng)不吝賜教。
調(diào)用方法
jQuery("#kw").suggest({
url:siteConfig.suggestionUrl,
params:{
kw:function(){return jQuery("#kw").val()},
n:10
}
});
參數(shù)url:baseUrl,例如http://www.target.com/search.php
參數(shù)params:url的后綴列表,范例中拼合的url為:http://www.target.com/search.php?kw=xxx&n=10&callback=?(默認(rèn)加入callback)
參數(shù)delay:輸入間隔時(shí)間,主要是為了降低負(fù)載,數(shù)值越大,負(fù)載越低,查詢速度越慢。
參數(shù)cache:是否實(shí)用緩存,默認(rèn)為true,例如當(dāng)搜索“test”時(shí),程序會(huì)將對(duì)應(yīng)的查詢結(jié)果緩存,當(dāng)?shù)诙嗡阉鱰est時(shí)直接從緩存中讀取。
參數(shù)formId:必須填寫,form表單的id
參數(shù)callback:是否使用jsonp以便處理跨域問題。
核心代碼:
suggest.js
(function($){
$.tools = $.tools || {version: '1.0'};
$.tools.suggest = {};
$.tools.suggest.defaults = {
url : null,
params : null,
delay : 100,
cache : true,
formId : '#search_form',
focus:null,
callback : true
}
$.tools.suggest.borderKey = {
UP: 38,
DOWN: 40,
TAB: 9,
ESC: 27,
ENTER:13
}
$.fn.suggest=function(options,fn){
var options,key = $.tools.suggest.borderKey;
if($.isFunction(options)){
fn=options;
options = $.extend({}, $.tools.suggest.defaults, key);
}else{
options = $.extend({}, $.tools.suggest.defaults, key, options);
}
return this.each(function(){
var
self = $(this),
url = options.url,
params = options.params,
searchUrl = null,
searchtimer = 0,
delay = options.delay,
cache = options.cache,
callback = options.callback,
formobj = $(options.formId),
focus = options.focus,
rebox = $('<ul/>').attr("id","suggest"),
htmlLi = null,
litop = null,
lileft = null,
liwth = null,
tip = false,
val = null,
rlen = null,
UP = options.UP,
DOWN = options.DOWN,
TAB = options.TAB,
ESC = options.ESC,
ENTER = options.ENTER,
index = -1,
choseKey = null,
backval = null,
hidden = false,
locksuggest = false
//init
if(focus){
self.focus();
searchtimer = setInterval(getKey, delay);
}
self.bind("focus",function(){
searchtimer = setInterval(getKey, delay);
// 觸發(fā)焦點(diǎn)時(shí)初始化backval的值
backval = (backval=$.trim(self.val()))==''?null:backval;
})
.bind("blur",function(){
clearInterval(searchtimer);
searchtimer = 0;
hideResult();
})
.bind("keydown",function(e){
// 少于10項(xiàng)不使用switch
if(e.keyCode == UP){
clearInterval(searchtimer);
searchtimer = 0;
if($('#suggest').css('display') == 'none'){
reSet();
return false;
}
index--;
if(index<0){
index=Math.abs(rlen)-1;
}
changeSelect(index);
e.preventDefault();
return false;
}else if(e.keyCode == DOWN){
clearInterval(searchtimer);
searchtimer = 0;
if($('#suggest').css('display') == 'none'){
reSet();
return false;
}
index++;
if(index>=rlen){
index=0;
}
changeSelect(index);
e.preventDefault();
return false;
}else if(e.keyCode == TAB){
clearInterval(searchtimer);
searchtimer = 0;
hideResult();
}else if(e.keyCode == ESC){
clearInterval(searchtimer);
searchtimer = 0;
hideResult();
return false;
}else if(e.keyCode == ENTER){
clearInterval(searchtimer);
searchtimer = 0;
}else if(searchtimer == 0){
searchtimer = setInterval(getKey, delay);
}
});
// 獲取關(guān)鍵詞
function getKey(){
val = $.trim(self.val());
// 關(guān)鍵詞不為空且關(guān)鍵詞不重復(fù)
if(!!val && val!=backval){
backval = val;
// 如不需要緩存結(jié)果,設(shè)cache為false
if(cache && !!$.tools.suggest[val]){
index = -1;
rlen = $.tools.suggest[val][1];
appendSuggest($.tools.suggest[val][0]);
}else{
searchurl = url+'?'+$.param(params);
getResult(searchurl,function(htmltemp,htmllen){
index = -1;
rlen = htmllen;
appendSuggest(htmltemp);
});
}
}
// 關(guān)鍵詞為空
if(!!!val && !hidden){
hideResult();
}
}
// 獲取提示數(shù)據(jù)
function getResult(searchurl,fn){
if(callback){searchurl = searchurl+'&callback=?';}
$.getJSON(searchurl,function(data){
var htmltemp = '',
htmllen = 0,
inputWord = self.val()
$.each(data.list,function(i,n){
if(n.word != inputWord){
htmltemp += '<li>'+n.word+'</li>';
htmllen++;
}
});
if(cache && !!!$.tools.suggest[val]){$.tools.suggest[val]=[htmltemp,htmllen];}
fn.call(document,htmltemp,htmllen)
});
}
// 插入提示數(shù)據(jù)
function appendSuggest(result){
locksuggest = hidden = false;
if(!!result){
if(!tip){
litop = self.offset().top+self.outerHeight()-1;
lileft = self.offset().left;
liwth = self.outerWidth()-2;
rebox.css({'position':'absolute','top':litop,'left':lileft,'width':liwth}).html(result).appendTo('body').show();
tip = true;
}else{
rebox.html(result).show();
}
rebox.find('li').bind('mouseover',function(){
// 鎖定提示層,保證不因冒泡關(guān)閉提示層
locksuggest = true;
index = $(this).index();
changeSelect(index,false);
})
.bind('click',function(){
changeSelect(index);
searchSubmit();
});
rebox.bind('mouseout',function(){
locksuggest = false;
})
}else{
// 如果檢索結(jié)果為空,清空提示層
rebox.hide();
}
}
function changeSelect(index,v){
v=v==false?false:true;
var obj = rebox.find('li').eq(index);
rebox.find('li.mo').removeClass('mo');
obj.addClass("mo");
if(v){
choseKey = backval = obj.html();
self.val(choseKey);
}
}
function reSet(){
if(!!self.val()){
index = -1;
$('#suggest').css('display','block');
rebox.find('li.mo').removeClass('mo');
// 根據(jù)html結(jié)構(gòu)重新計(jì)算提示結(jié)果長(zhǎng)度
rlen = rebox.find('li').size();
}
}
function hideResult(){
if(!locksuggest){
choseKey = backval = null;
hidden = true;
rebox.hide();
}
}
function searchSubmit(){
self.val(choseKey);
hideResult();
clearInterval(searchtimer);
formobj.submit();
}
});
}
})(jQuery);
代碼打包下載
1、可緩存查詢結(jié)果 (二次查詢速度快)
2、非keyup監(jiān)聽方式 (解決某些系統(tǒng)/情況下無法觸發(fā)keyxxx事件的問題)
3、簡(jiǎn)潔的參數(shù) (好看?)
插件性能尚好,我的E6500、2G內(nèi)存,30秒內(nèi)一共發(fā)生了4469次調(diào)用,耗時(shí)94.65毫秒;百度的是2432次調(diào)用,80.24毫秒。
接近1倍的調(diào)用是jQuery中的問題,但具體原因我還沒弄明白,如果那位兄弟知道的還請(qǐng)不吝賜教。
調(diào)用方法
復(fù)制代碼 代碼如下:
jQuery("#kw").suggest({
url:siteConfig.suggestionUrl,
params:{
kw:function(){return jQuery("#kw").val()},
n:10
}
});
參數(shù)url:baseUrl,例如http://www.target.com/search.php
參數(shù)params:url的后綴列表,范例中拼合的url為:http://www.target.com/search.php?kw=xxx&n=10&callback=?(默認(rèn)加入callback)
參數(shù)delay:輸入間隔時(shí)間,主要是為了降低負(fù)載,數(shù)值越大,負(fù)載越低,查詢速度越慢。
參數(shù)cache:是否實(shí)用緩存,默認(rèn)為true,例如當(dāng)搜索“test”時(shí),程序會(huì)將對(duì)應(yīng)的查詢結(jié)果緩存,當(dāng)?shù)诙嗡阉鱰est時(shí)直接從緩存中讀取。
參數(shù)formId:必須填寫,form表單的id
參數(shù)callback:是否使用jsonp以便處理跨域問題。
核心代碼:
suggest.js
復(fù)制代碼 代碼如下:
(function($){
$.tools = $.tools || {version: '1.0'};
$.tools.suggest = {};
$.tools.suggest.defaults = {
url : null,
params : null,
delay : 100,
cache : true,
formId : '#search_form',
focus:null,
callback : true
}
$.tools.suggest.borderKey = {
UP: 38,
DOWN: 40,
TAB: 9,
ESC: 27,
ENTER:13
}
$.fn.suggest=function(options,fn){
var options,key = $.tools.suggest.borderKey;
if($.isFunction(options)){
fn=options;
options = $.extend({}, $.tools.suggest.defaults, key);
}else{
options = $.extend({}, $.tools.suggest.defaults, key, options);
}
return this.each(function(){
var
self = $(this),
url = options.url,
params = options.params,
searchUrl = null,
searchtimer = 0,
delay = options.delay,
cache = options.cache,
callback = options.callback,
formobj = $(options.formId),
focus = options.focus,
rebox = $('<ul/>').attr("id","suggest"),
htmlLi = null,
litop = null,
lileft = null,
liwth = null,
tip = false,
val = null,
rlen = null,
UP = options.UP,
DOWN = options.DOWN,
TAB = options.TAB,
ESC = options.ESC,
ENTER = options.ENTER,
index = -1,
choseKey = null,
backval = null,
hidden = false,
locksuggest = false
//init
if(focus){
self.focus();
searchtimer = setInterval(getKey, delay);
}
self.bind("focus",function(){
searchtimer = setInterval(getKey, delay);
// 觸發(fā)焦點(diǎn)時(shí)初始化backval的值
backval = (backval=$.trim(self.val()))==''?null:backval;
})
.bind("blur",function(){
clearInterval(searchtimer);
searchtimer = 0;
hideResult();
})
.bind("keydown",function(e){
// 少于10項(xiàng)不使用switch
if(e.keyCode == UP){
clearInterval(searchtimer);
searchtimer = 0;
if($('#suggest').css('display') == 'none'){
reSet();
return false;
}
index--;
if(index<0){
index=Math.abs(rlen)-1;
}
changeSelect(index);
e.preventDefault();
return false;
}else if(e.keyCode == DOWN){
clearInterval(searchtimer);
searchtimer = 0;
if($('#suggest').css('display') == 'none'){
reSet();
return false;
}
index++;
if(index>=rlen){
index=0;
}
changeSelect(index);
e.preventDefault();
return false;
}else if(e.keyCode == TAB){
clearInterval(searchtimer);
searchtimer = 0;
hideResult();
}else if(e.keyCode == ESC){
clearInterval(searchtimer);
searchtimer = 0;
hideResult();
return false;
}else if(e.keyCode == ENTER){
clearInterval(searchtimer);
searchtimer = 0;
}else if(searchtimer == 0){
searchtimer = setInterval(getKey, delay);
}
});
// 獲取關(guān)鍵詞
function getKey(){
val = $.trim(self.val());
// 關(guān)鍵詞不為空且關(guān)鍵詞不重復(fù)
if(!!val && val!=backval){
backval = val;
// 如不需要緩存結(jié)果,設(shè)cache為false
if(cache && !!$.tools.suggest[val]){
index = -1;
rlen = $.tools.suggest[val][1];
appendSuggest($.tools.suggest[val][0]);
}else{
searchurl = url+'?'+$.param(params);
getResult(searchurl,function(htmltemp,htmllen){
index = -1;
rlen = htmllen;
appendSuggest(htmltemp);
});
}
}
// 關(guān)鍵詞為空
if(!!!val && !hidden){
hideResult();
}
}
// 獲取提示數(shù)據(jù)
function getResult(searchurl,fn){
if(callback){searchurl = searchurl+'&callback=?';}
$.getJSON(searchurl,function(data){
var htmltemp = '',
htmllen = 0,
inputWord = self.val()
$.each(data.list,function(i,n){
if(n.word != inputWord){
htmltemp += '<li>'+n.word+'</li>';
htmllen++;
}
});
if(cache && !!!$.tools.suggest[val]){$.tools.suggest[val]=[htmltemp,htmllen];}
fn.call(document,htmltemp,htmllen)
});
}
// 插入提示數(shù)據(jù)
function appendSuggest(result){
locksuggest = hidden = false;
if(!!result){
if(!tip){
litop = self.offset().top+self.outerHeight()-1;
lileft = self.offset().left;
liwth = self.outerWidth()-2;
rebox.css({'position':'absolute','top':litop,'left':lileft,'width':liwth}).html(result).appendTo('body').show();
tip = true;
}else{
rebox.html(result).show();
}
rebox.find('li').bind('mouseover',function(){
// 鎖定提示層,保證不因冒泡關(guān)閉提示層
locksuggest = true;
index = $(this).index();
changeSelect(index,false);
})
.bind('click',function(){
changeSelect(index);
searchSubmit();
});
rebox.bind('mouseout',function(){
locksuggest = false;
})
}else{
// 如果檢索結(jié)果為空,清空提示層
rebox.hide();
}
}
function changeSelect(index,v){
v=v==false?false:true;
var obj = rebox.find('li').eq(index);
rebox.find('li.mo').removeClass('mo');
obj.addClass("mo");
if(v){
choseKey = backval = obj.html();
self.val(choseKey);
}
}
function reSet(){
if(!!self.val()){
index = -1;
$('#suggest').css('display','block');
rebox.find('li.mo').removeClass('mo');
// 根據(jù)html結(jié)構(gòu)重新計(jì)算提示結(jié)果長(zhǎng)度
rlen = rebox.find('li').size();
}
}
function hideResult(){
if(!locksuggest){
choseKey = backval = null;
hidden = true;
rebox.hide();
}
}
function searchSubmit(){
self.val(choseKey);
hideResult();
clearInterval(searchtimer);
formobj.submit();
}
});
}
})(jQuery);
代碼打包下載
您可能感興趣的文章:
- jQuery UI AutoComplete 使用說明
- jQuery UI Autocomplete 體驗(yàn)分享
- jQuery UI AutoComplete 自動(dòng)完成使用小記
- jQuery UI Autocomplete 1.8.16 中文輸入修正代碼
- jQuery ui autocomplete選擇列表被Bootstrap模態(tài)窗遮擋的完美解決方法
- firefox下jQuery UI Autocomplete 1.8.*中文輸入修正方法
- jQuery.Autocomplete實(shí)現(xiàn)自動(dòng)完成功能(詳解)
- jQuery 插件autocomplete自動(dòng)完成應(yīng)用(自動(dòng)補(bǔ)全)(asp.net后臺(tái))
- jquery autocomplete自動(dòng)完成插件的的使用方法
- jQuery autoComplete插件兩種使用方式及動(dòng)態(tài)改變參數(shù)值的方法詳解
- jquery UI實(shí)現(xiàn)autocomplete在獲取焦點(diǎn)時(shí)得到顯示列表功能示例
相關(guān)文章
jQuery實(shí)現(xiàn)簡(jiǎn)單聊天室
這篇文章主要為大家詳細(xì)介紹了jQuery實(shí)現(xiàn)簡(jiǎn)單聊天室,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-02-02
jQuery實(shí)現(xiàn)點(diǎn)擊后高亮背景固定顯示的菜單效果【附demo源碼下載】
這篇文章主要介紹了jQuery實(shí)現(xiàn)點(diǎn)擊后高亮背景固定顯示的菜單效果,可實(shí)現(xiàn)鼠標(biāo)點(diǎn)擊菜單項(xiàng)后呈現(xiàn)出鼠標(biāo)滑過一樣的背景高亮顯示效果,同時(shí)該顯示效果固定不變,需要的朋友可以參考下2016-09-09
輕松使用jQuery雙向select控件Bootstrap Dual Listbox
這篇文章主要教大家如何輕松使用jQuery雙向select控件Bootstrap Dual Listbox,感興趣的小伙伴們可以參考一下2015-12-12
jQuery實(shí)現(xiàn)鼠標(biāo)經(jīng)過購(gòu)物車出現(xiàn)下拉框代碼(推薦)
在做web前端項(xiàng)目開發(fā)的時(shí)候,使用jquery庫(kù)的感觸頗多,下面小編通過寫購(gòu)物車的下拉框做法,把我的想法給大家分享一下,感興趣的朋友可以參考下2016-07-07
jQuery對(duì)val和atrr("value")賦值的區(qū)別介紹
jQuery中val和atrr(value),對(duì)瀏覽器的區(qū)別,有默認(rèn)值的情況下,如果用val()賦值了,那么當(dāng)修改這個(gè)值得時(shí)候,google不能獲取最新的值,但是ie可以2014-09-09
推薦6款基于jQuery實(shí)現(xiàn)圖片效果插件
這里給大家匯總了一下個(gè)人比較常用的基于jQuery實(shí)現(xiàn)的圖片特效的插件,個(gè)人感覺非常不錯(cuò),這里分享給大家2014-12-12
jQuery EasyUI API 中文文檔 - Calendar日歷使用
jQuery EasyUI API 中文文檔 - Calendar日歷使用,需要的朋友可以參考下。2011-10-10
jquery.mobile 共同布局遇到的問題小結(jié)
這篇文章主要介紹了jquery.mobile 共同布局遇到的問題小結(jié),需要的朋友可以參考下2015-02-02

