1. 程式人生 > >JQUERY仿百度谷歌智慧提示

JQUERY仿百度谷歌智慧提示

   若使用jquery智慧提示,則主要使用Ajax動態呼叫後臺。   仿百度谷歌智慧提示,說實話,本篇部落格仿的不太縝密,有待繼續完善。   仿百度谷歌智慧提示,思路主要如下:   1.後臺根據前臺傳遞的引數進行匹配,提供資料列表。   2.前臺美觀智慧展示選擇資料列表      宣告:此篇部落格的後臺是假資料,沒有搭建資料庫進行匹配。      來一張目前功能截圖:   滑鼠控制:   
  鍵盤控制:      選中之後:     思路:【重點前臺】
  1.  監聽輸入框值變化,然後動態生成顯示列表【仿】
  2.  顯示列表中繫結各種事件(滑鼠移近、移除、單擊【仿】
  3.  文字框聚焦以及失焦狀態【仿】
  4.  文字框單擊狀態【仿】
  5.  文字框對方向鍵的控制【仿】
 詳細的說明都在js註釋中。    後臺servlet程式碼:
package com.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class SearchServlet extends HttpServlet {

	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
        response.setContentType("text/xml;charset=utf-8");
        request.setCharacterEncoding("utf-8");
        PrintWriter out = response.getWriter();
        String key = request.getParameter("key");
        	System.out.println(key+"----------->");
            StringBuilder results = new StringBuilder();
            results.append("<results>");
            results.append("<result key='a1' count='07' ></result>");
            results.append("<result key='a2' count='11' ></result>");
            results.append("<result key='a3' count='18' ></result>");
            results.append("<result key='a4' count='19' ></result>");
            results.append("<result key='a5' count='21' ></result>");
            results.append("<result key='a6' count='31' ></result>");
            results.append("<result key='a7' count='41' ></result>");
            results.append("<result key='a8' count='51' ></result>");
            results.append("</results>");
            out.print(results.toString());
        out.flush();
        out.close();
	}
}
  模擬訪問程式碼:
package com.servlet;

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class AccessServlet extends HttpServlet {

	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
	 String jspkey=request.getParameter("key");
	 System.out.println("jsp..param..key..."+jspkey);
	 PrintWriter ps=response.getWriter();
	 ps.println("successful,you put the key is "+jspkey);
	}
}
  前臺QUERY程式碼:
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<style type="text/css">

#kw1 {
	width: 529px;
	height: 20px;
	padding: 11px 7px 7px;
	font: 16px arial;
	border: 1px solid #b8b8b8;
	outline: none
}

.btn {
	width: 105px;
	height: 40px;
	padding: 0;
	padding-top: 2px;
	border: 0;
	background-position: -464px -42px;
	background-color: #e6e6e6;
	cursor: pointer;
	font-size: 16px
}
.showresult{
   border: 1px solid #b8b8b8;
   padding: 11px 7px 7px;
   width: 529px;
   margin-left:100px;
   display:none;
   font: 16px arial;
}
.showresultnew{
   border: 1px solid #b8b8b8;
   padding: 11px 7px 7px;
   width: 529px;
   margin-left:99.9px;
   display:block;
   font: 16px arial;
}
input::-ms-clear{display:none;}
</style>
<script type="text/javascript" src="JS/jquery-1.4.2.min.js"></script>
</head>
<script type="text/javascript">
var line = 0;
var oldvalue=$("#kw1").val();//保留最初的輸入值
$(function(){
	    // 38 上  40下 13 回車
	  $("#kw1").keydown(function(){
		  if(event.keyCode==13){
			  //若選擇的結果與最初輸入的結果一致則
			  //模糊匹配框收起來,是通過css樣式顯示隱藏控制,並且把顯示結果的div清空,每次都再重新建立
			  hideresult();
			  clearresult();
			  if($("#kw1").val()==""){
				  alert("warning,the key can't be empty");
				  return;
			  }
			  //隨意的查詢url,模擬百度或谷歌搜尋具體的東西
			  $.get("access",{key:$("#kw1").val()},function(responseinfo){
				  $("#responseinfo").html(responseinfo);
			  });
		  }else if(event.keyCode == 40){  //方向鍵下移
              $("table tbody tr").eq(line)
                  .css("backgroundColor", "gray") 
                  .css("color", "white");  //這是選中狀態、白字藍底
              $("table tbody tr").eq(line < 0 ? 0 : line - 1)
                  .css("backgroundColor", "white")
                  .css("color", "black");  //非選中狀態、 黑字白底
              if(line==$("table tbody tr").length){
            	  $("#kw1").val(oldvalue);
            	  line=0;
            	  return;                //若下移鍵移動到最後一個,那麼搜尋框中的值恢復成原來的輸入值,類似百度谷歌
            	                         //若下移鍵移動到最後一個,那麼把下次line值從頭再來,即line=0
            	                         //注意必須有個return,否則程式繼續前進,顯示結果有誤
              }else{
            	  line=line+1;          //若下移鍵沒有移動到最後一個,那麼記錄下一個line值
              }
              $("#kw1").val($("table tbody tr").eq(line-1).find("td").eq(0).html());//搜尋框中值跟著下移鍵選擇而變化,類似百度谷歌
          }else if(event.keyCode==38){  //方向鍵上移
        	  if(line==0){                       //若上移到第一個,那麼搜尋框中的值恢復到原來的輸入值,類似百度谷歌
                  $("table tbody tr").eq(line)
                  .css("backgroundColor", "white")  //其實就是把已經選中的記錄恢復成非選中狀態,否則變成搜尋框值=原來值,但是第一條依然處於選中狀態
                  .css("color", "black");
            	  $("#kw1").val(oldvalue);
            	  line=$("table tbody tr").length;  //若上移到第一個,那麼把下移line值變成table最後一個tr,即line=table tr .length
            	  return;
        	  }else{
        		  line=line-1;
        	  }
              $("table tbody tr").eq(line)
                  .css("backgroundColor", "gray")
                  .css("color", "white");           //選中狀態
              $("table tbody tr").eq(line > $("table tbody tr").length ? 0 : line + 1)
                  .css("backgroundColor", "white")
                  .css("color", "black");          //非選中狀態

              $("#kw1").val($("table tbody tr").eq(line).find("td").eq(0).html());//搜尋框中值跟著下移鍵選擇而變化,類似百度谷歌
          }
	  });
	  //確定搜尋、button事件
	  $("#su1").click(function(){
		  if($("#kw1").val()==""){
			  alert("warning,the key can't be empty");
			  return;
		  }
		  $.get("access",{key:$("#kw1").val()},function(responseinfo){
			  $("#responseinfo").html(responseinfo);
		  });
	  });
	  //不斷監聽文字框事件,注意:必須寫input,否則ie11不執行,以為propertychange不相容導致的
	  $("#kw1").bind("input propertychange", function(){
		  oldvalue=$("#kw1").val();
		  clearresult();
		  if($("#kw1").val()==""){
			  //模糊匹配框收起來
			  hideresult();
		  }else{
			  showresult();//顯示框
			  //動態生成table
			  dymictable();
	  }
	  });
	  //文字框失去焦點
	  $("#kw1").blur(function(){
		  //模糊匹配框收起來
          hideresult();
		  clearresult();
	  });
	  //文字框focus事件
	 $("#kw1").focus(function(){
		  clearresult();
		  //若文字框沒有內容,則模糊匹配框收起來,否則顯示模糊匹配結果
		  if($("#kw1").val()==""){
			  //模糊匹配框收起來
			  hideresult();
		  }else{
			  //顯示模糊匹配框
			  showresult();
			  //動態生成table
			  dymictable();
			  }
	  });
	  //文字框點選事件,類似百度、谷歌
	  $("#kw1").click(function(){
		  clearresult();
		  //若文字框沒有內容,則模糊匹配框收起來,否則顯示模糊匹配結果
		  if($("#kw1").val()==""){
			  //模糊匹配框收起來
			  hideresult();
		  }else{
			  //顯示模糊匹配框
			  showresult();
			  //動態生成table
		      dymictable();
			  }
	  });
	  
});
/**
 * 清空div中顯示後臺結果的table,程式中每次都是重新建立生成的
 */
function clearresult(){
	$("#showresult").html("");
	line=0; //主要是用來控制方向鍵選擇記錄的
}
/**
 * 通過css來隱藏查詢的結果,並且程式中每次都是重新建立生成查詢結果的
 */
function hideresult(){
	 $("#showresult").removeClass("showresultnew");
	 $("#showresult").addClass("showresult");
}
/**
 * 通過css來顯示查詢的結果,並且程式中每次都是重新建立生成查詢結果的
 */
function showresult(){
	  $("#showresult").removeClass("showresult");
	  $("#showresult").addClass("showresultnew");
	  clearinfo();//清空介面返回提示資訊
}
/**
 * 動態生成table,顯示結果
 */
function dymictable(){
	  var d_table=$("<table id='testtable' width='100%'</table>")//動態顯示結果
	  .attr("cellspacing","0");
	  $.get("testinstant.do",{key:$("#kw1").val()},function(xml){
	        $(xml).find("results result").each(function(){
	        	var d_key=$(this).attr("key");
	        	var d_count=$(this).attr("count");
	        	var d_tr=$("<tr></tr>").css("cursor","pointer").mouseover(function(){
	        		$(this).css("backgroundColor", "gray").css("color", "white");
	        	}).mouseout(function(){
	        		$(this).css("backgroundColor", "white").css("color", "black");
	        	}).mousedown(function(){ //滑鼠選中,則銀行顯示框以及直接搜尋,類似百度谷歌
	        		$("#kw1").val(d_key);
	        		//收縮
	                hideresult();
	                clearresult();
	                //直接搜尋,類似百度谷歌
	  			    $.get("access",{key:$("#kw1").val()},function(responseinfo){
					  $("#responseinfo").html(responseinfo);
				  });
	        	});
	        	var d_td_key=$("<td></td>")
	        	.attr("width","20%")
	        	.attr("style","text-align:left")
	        	.html(d_key);
	        	var d_td_count=$("<td></td>")
	        	.attr("width","80%")
	        	.attr("style","text-align:right")
	        	.html("查詢出個數:"+d_count+"記錄");
	            d_tr.append(d_td_key);
	            d_tr.append(d_td_count);
	            d_table.append(d_tr);
	            $("#showresult").append(d_table);
	        });
  });
}
/**
 * clear response info
 */
function clearinfo(){
	$("#responseinfo").html("");
}
</script>
<body>
自動搜尋框:
<input name="wd" id="kw1"  type="text" maxlength="100"  >
<input class="btn" id="su1" type="button" value="搜搜" ><span id="responseinfo"></span>
<div id="showresult" class="showresult">
</div>
</body>
</html>
  至於web.xml配置servlet就不再贅述了,下載程式碼測試,歡迎拍磚。