DIV CSS 佈局教程網

 DIV+CSS佈局教程網 >> 網頁腳本 >> JavaScript入門知識 >> jQuery入門知識 >> JQuery特效代碼 >> jquery 模擬類搜索框自動完成搜索提示功能(改進)
jquery 模擬類搜索框自動完成搜索提示功能(改進)
編輯:JQuery特效代碼     
autopoint.js代碼:
代碼如下:
/*
* @date: 2010-5-22 21:42:15
* @author: 胡靈偉
* Depends:
* jquery.js
*
* function:類似GOOGLE搜索框提示功能
*/
(function($) {
$.fn.autopoint = function (options) {
defaults = {
url:options.url,
keyLeft : 37,//向左方向鍵
keyUp : 38,//向上方向鍵
keyRight : 39,//向右方向鍵
keyDown : 40,//向下方向鍵
keyEnter : 13,//回車鍵
listHoverCSS : 'jhover',//提示框列表鼠標懸浮的樣式
tpl : '<div class="list"><div class="word">{word}</div><div class="view">約{view}條記錄</div></div>',
topoffset:options.topoffset||5
};
var options = $.extend(defaults, options);
var dropDiv = $('<div></div>').addClass('dropDiv').appendTo('body');
var isOver = false;
dropDiv.hover(function(){
isOver = true;
}, function(){
isOver = false;
});
return this.each(function(){
var pa = $(this);
$(this).bind('keydown', function(event){
if (dropDiv.css('display') != 'none') {//當提示層顯示時才對鍵盤事件處理
var currentList = dropDiv.find('.' + options.listHoverCSS);
if (event.keyCode == options.keyDown) {//如果按的是向下方向鍵
if (currentList.length == 0) {
//如果提示列表沒有一個被選中,則將列表第一個選中
$(this).val(getPointWord(dropDiv.find('.list:first')
.mouseover()));
} else if (currentList.next().length == 0) {
//如果是最後一個被選中,則取消選中,即可認為是輸入框被選中
unHoverAll();
} else {
unHoverAll();
//將原先選中列的下一列選中
if (currentList.next().length != 0)
$(this).val(getPointWord(currentList.next()
.mouseover()));
}
return false;
} else if (event.keyCode == options.keyUp) {//如果按的是向上方向鍵
if (currentList.length == 0) {
$(this).val(getPointWord(dropDiv.find('.list:last')
.mouseover()));
} else if (currentList.prev().length == 0) {
unHoverAll();
} else {
unHoverAll();
if (currentList.prev().length != 0)
$(this).val(getPointWord(currentList.prev()
.mouseover()));
}
return false;
}else if(event.keyCode == options.keyEnter) dropDiv.empty().hide();
}
//當按下鍵之前記錄輸入框值,以方便查看鍵彈起時值有沒有變
$(this).attr('alt', $(this).val());
}).bind('keyup', function(event){
//如果彈起的鍵是向上或向下方向鍵則返回
if(event.keyCode == options.keyDown||event.keyCode == options.keyUp) return;
if($(this).val() == ''){
dropDiv.empty().hide();
return;
}
//若輸入框值沒有改變或變為空則返回
if ($(this).val() == $(this).attr('alt'))
return;
getData(pa, $(this).val());
}).bind('blur', function(){
if(isOver&&dropDiv.find('.' + options.listHoverCSS)!=0) return;
//文本輸入框失去焦點則清空並隱藏提示層
dropDiv.empty().hide();
});
/**處理ajax返回成功的方法**/
handleResponse = function(parent, json) {
var isEmpty = true;
for(var o in json){
if(o == 'data') isEmpty = false;
}
if(isEmpty) {
showError("返回數據格式錯誤,請檢查請求URL是否正確!");
return;
}
if(json['data'].length == 0) {
//返回數據為空
return;
}
refreshDropDiv(parent, json);
dropDiv.show();
}
/**處理ajax失敗的方法**/
handleError = function(error) {
//showError("由於url錯誤或超時請求失敗!");
}
showError = function(error){
alert(error);
}
/**通過ajax返回json格式數據生成用來創建dom的字符串**/
render = function(parent, json) {
var res = json['data'] || json;
var appendStr = '';
//用json對象中內容替換模版字符串中匹配/\{([a-z]+)\}/ig的內容,如{word},{view}
for ( var i = 0; i < res.length; i+=1) {
appendStr += options.tpl.replace(/\{([a-z]+)\}/ig, function(m, n) {
return res[i][n];
});
}
jebind(parent, appendStr);
}
/**將新建dom對象插入到提示框中,並重新綁定mouseover事件監聽**/
jebind = function(parent, a) {
dropDiv.append(a);
dropDiv.find('.list').each(function() {
$(this).unbind('mouseover').mouseover(function() {
unHoverAll();
$(this).addClass(options.listHoverCSS);
}).unbind('click').click(function(){
parent.val(getPointWord($(this)));
dropDiv.empty().hide();
parent.focus();
});
});
}
/**將提示框中所有列的hover樣式去掉**/
unHoverAll = function() {
dropDiv.find('.list').each(function() {
$(this).removeClass(options.listHoverCSS);
});
}
/**在提示框中取得當前選中的提示關鍵字**/
getPointWord = function(p) {
return p.find('div:first').text()
}
/**刷新提示框,並設定樣式**/
refreshDropDiv = function(parent, json) {
var left = parent.offset().left;
var height = parent.height();
var top = parent.offset().top + options.topoffset + height;
var width = options.width || parent.width() + 'px';
dropDiv.empty();
dropDiv.css( {
'border' : '1px solid #FE00DF',
'left' : left,
'top' : top,
'width' : width
});
render(parent, json);
//防止ajax返回之前輸入框失去焦點導致提示框不消失
parent.focus();
}
/**通過ajax向服務器請求數據**/
getData = function(parent, word) {
$.ajax( {
type : 'GET',
data : "word="+ word,
url : options.url,
dataType : 'json',
timeout : 1000,
success : function(json){handleResponse(parent, json);},
error : handleError
});
}
});
}
})(jQuery);

網頁上主要樣式:
代碼如下:
<style type="text/css">
.dropDiv {
position: absolute;
z-index: 10;
display: none;
cursor: hand;
}
.dropDiv .jhover {
background-color: #00FEDF;
}
.dropDiv .list {
float:left;
width:100%;
}
.dropDiv .word {
float:left;
}
.dropDiv .view {
float:right;
color: gray;
text-align: right;
font-size: 10pt;
}
</style>

調用方法:
代碼如下:
<script type="text/javascript" src="../js/jquery-1.4.2.min.js"></script>
<script type="text/javascript" src="../js/autopoint-1.0.1.js"></script>
<script type="text/javascript">
$(function(){
  $("input").autopoint({url:'http://localhost/xun/ajax.svl?method=getsearchhelp'});
});
</script>
<body>
  <input type="text" size="50" />
  <input type="text" size="50" />
</body>

servlet主要部分:
代碼如下:
response.setContentType("text/html");
response.setHeader("Cache-Control", "no-cache");
response.setCharacterEncoding("UTF-8");
String word = request.getParameter("word");
if(Utils.isBlank(word)) return;
JSONObject json = new JSONObject();
JSONArray array = new JSONArray();
Map<String, Object> map1 = new HashMap<String, Object>();
map1.put("word", word + "a1");
map1.put("view", 10);
Map<String, Object> map2 = new HashMap<String, Object>();
map2.put("word", word + "a2");
map2.put("view", 15);
Map<String, Object> map3 = new HashMap<String, Object>();
map3.put("word", word + "a3");
map3.put("view", 2);
array.add(JSONObject.fromObject(map1));
array.add(JSONObject.fromObject(map2));
array.add(JSONObject.fromObject(map3));
json.put("data", array);
PrintWriter out = response.getWriter();
out.print(json.toString());
out.close();

其中JSONObject和JSONArray類來自json-lib.jar,為了測試方便,是直接返回數據的,實際應用中可以替換為
從數據源查取數據.
XML學習教程| jQuery入門知識| AJAX入門| Dreamweaver教程| Fireworks入門知識| SEO技巧| SEO優化集錦|
Copyright © DIV+CSS佈局教程網 All Rights Reserved