仿百度搜索自動提示技術

在百度搜索中,我們在輸入框中鍵入關鍵字,搜索引擎會自動在輸入框的下方,以列表的形式將匹配的關鍵詞展現出來,供用戶選擇,這樣的實現大大提高了用戶的體驗,本文就帶領大家一步步去實現這樣的效果。

先看一下完成後的效果:



 

 

一、首先創建一個JSP頁面,內部包含一個查詢輸入框,並在輸入框的正下方創建一個<div>,用於智能提示信息列表的展現。

<tr>

       <td nowrap="nowrap">關鍵字</td>

       <td><input type="text" id="title" name="title" value="" size="55"onkeyup="sendRequest()" onclick="hiddenSuggest()" >  </td>

</tr>

<tr><td></td>

<td><div id="suggest" style="display:none;width:100%" ></div>

</td>

</tr>

在title文本查詢輸入框上註冊onkeyup和onclick事件,當鍵盤的按鍵按下時,執行sendRequest()函數,該函數主要負責向服務器端發送請求,並將服務器端返回的數據在文本框下方的div中展現。當在文本框中執行鼠標單擊時,則執行hiddenSuggest()函數,使div隱藏。

二、創建js文件,並將js文件引入到第一步創建的JSP文件中。

   

//發送ajax請求,並將服務器端返回的數據在suggest DIV中展現。

    function sendRequest() {

       clearSuggest();//清除智能提示列表suggest DIV中的所有元素

       //取得查詢輸入框中的數據

var info = trim(document.getElementById('title').value);

       //校驗查詢輸入框中的數據是否爲空,如果爲空,則不再往服務器端發送請求。

if(info==""){

            hiddenSuggest();

           return;

       }

//獲取XMLHttpRequest對象,用於和服務器端交互。

       var req = getXmlHttpObject();

//請求的url,將查詢文本框中的數據發送到服務器端執行查詢。

       var url = "knowdo.do?method=suggest&info="+info;

       req.onreadystatechange = function() {

           if (req.readyState == 4) {

              if (req.status == 200) {

//解析服務器端返回的XML格式的數據,並將解析出來的數據放到智能提示DIV中。

                  var tips = req.responseXML.getElementsByTagName("res");

                  if(tips.length!=0){

                     for(var i=0;i<tips.length;i++){

//解析每一個node節點中的value值,並將該value放到一個新的DIV中,併爲該DIV設置一些事件:當鼠標滑過該DIV時,該DIV在高亮顯示;當鼠標點擊該DIV時,則將該DIV中的value值設置到查詢文本框title中。

                         var title=tips[i].firstChild.nodeValue;

                         var sDiv = "<div class='out' οnmοuseοver='mover(this);' οnmοuseοut='mout(this);' οnclick='setSuggest(this)'>"+title+"</div>";

//將服務器端所有的返回值value,及相匹配的DIV,全部放到智能提示列表DIV中。    

       document.getElementById('suggest').innerHTML+=sDiv;

                         }

                         displaySuggest();//設置智能提示列表可見

                     }else{

                          hiddenSuggest();//設置智能提示列表不可見

                     }

              }

           }

       };

       req.open("POST", url, true);

       req.send(null);

    }

//點擊某個value值時,將該value值設置到查詢文本框中。

    function setSuggest(para){

    document.getElementById('title').value=para.firstChild.nodeValue;

       hiddenSuggest();

    }

 

//設置智能提示列表不可見

function hiddenSuggest(){

       document.getElementById('suggest').style.display="none";        }

//清除suggest DIV中的所有元素

    function clearSuggest(){

       document.getElementById('suggest').innerHTML="";

       }

//鼠標滑過某個value值時,設置當前value值所在DIV高亮顯示。

    function mover(para){

       para.className="over";

       }

//鼠標離開某個value值時,設置當前value值所在DIV恢復初始顯示樣式。

    function mout(para){

       para.className="out";

       }

    //設置智能提示列表可見

    function displaySuggest(){

       document.getElementById('suggest').style.display="block";

       }

    //獲取XMLHttpRequest對象,用於和服務器端交互。

    function getXmlHttpObject() {

       var xmlHttp = null;

       try {

           // Firefox, Opera 8.0+, Safari

           xmlHttp = new XMLHttpRequest();

       } catch (e) {

           // Internet Explorer

           try {

              xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");

           } catch (e) {

              xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");

           }

       }

       return xmlHttp;

    }

三、交互層Java代碼,詳細信息參加代碼註釋。

   

//接收客戶端傳遞過來的數據,然後調用Dao層執行數據庫查詢操作,

//並將查詢結果以XML格式的數據樣式返回給客戶端。

    private String suggest(HttpServletRequest request,HttpServletResponse response) {

       //接收客戶端傳遞過來的數據

       String title = request.getParameter("info");

       //爲確保數據的及時刷新,此處進行清除瀏覽器緩存操作

response.setContentType("text/xml");

       response.setHeader("Cache-Control""no-store");

       response.setHeader("Pragma","no-cache");

       response.setDateHeader("Expires",0);

   

       try {

           PrintWriter out = response.getWriter();

           out.write("<?xml version=\"1.0\" encoding=\"GBK\"?>");

           out.write("<response>");

          

            //調用Dao層接口,執行數據庫查詢操作。

           List<String> list =  knowDao.suggest(title);

           //將查詢出的所有匹配的記錄,以標準的XML文件的格式發送到客戶端。

           for(int i=0;i<list.size();i++){   

              out.write("<res>");

              out.write(list.get(i));

              out.write("</res>");

           }     

           out.write("</response>");      

           out.flush();

           out.close();

       } catch (IOException e) {

           log.error("出錯了-"+e);

       }

       return null;

    }

 

四、Dao層Java代碼,詳細信息參加代碼註釋。

 

//按照指定條件,執行數據庫查詢操作,並將查詢結果以List列表的形式返回。

public List<String> suggest(String title) {

           Connection conn=pool.getConnection();

           List<String> list = new ArrayList<String>(); 

           StringBuffer sql = new StringBuffer();

//組裝查詢SQL語句,按照關鍵字進行模糊查詢,並最多返回前十條記錄。

           sql.append("select top 10 blob_name from t_know where 1=1 ");

              if(!"".equals(title)&&title!=null){      

              sql.append(" and title like '%");

              sql.append(title);

              sql.append("%'");

           }

//按照指定字段進行排序

           sql.append(" order by last_update_time desc");

           try {

              ps = conn.prepareStatement(sql.toString());

              rs = ps.executeQuery(); 

//將查詢結果集中的數據放入List中。     

              while(rs.next()){                 

                  list.add(rs.getString("blob_name"));  

              }

           }catch (Exception e) {

              log.error(Tool.getStackTrace(e));

              log.error(sql);

           }finally{

              Tool.closeConnection(rsps, conn); //關閉連接

           }     

           return list; //返回查詢結果。

       }

 

到此,一個仿百度智能搜索提示的開發就算完成了,實際效果就是開篇的看到的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章