簡書搜索自動匹配功能

寫在前面

今天周六,我又來分享知識啦。最近一直在忙項目,所以趁著這個周末,喝著咖啡,聽著音樂,敲著代碼就把做項目的知識點總結給大家,簡直不要太愜意,哈哈。

先從我做的功能界面開始說起:

本篇主要介紹的就是圖中紅框標記的搜索自動匹配功能。仔細想一想,有木有很熟悉,對,這功能其實就是跟你每天百度、谷歌這樣的搜索功能一樣。所以下面我會分享一些知識點并寫個例子來實現這樣的功能。

每天都用到的搜索自動匹配功能

百度的搜索框(默認顯示四條數據)

美團搜索框

美團.jpg

淘寶搜索框

首先,大概過程肯定是這樣的:先從輸入框中輸入關鍵字,然后根據關鍵字在緩存或數據庫取數據返回顯示在下方區域。

重點知識匯總

要實現此功能,JQuery+ajax是必備。這個功能需要服務端配合。客戶端通過ajax從服務端取得的數據。下面,我寫個簡書搜索自動匹配的例子,數據是事先定義好在腳本里的,當然,如果我有訪問簡書數據庫的權限和賬號密碼,就可以動態的獲取實時數據了。

開始之前,先給大家普及一下例子中用到的重點知識。

知識點一

keydown(function(e){}

這個keydown函數是當按下按鍵時觸發事件,比如改變文本域的顏色。
比如這段代碼:

<html>
<head>
<script type="text/javascript" src="/jquery/jquery.js"></script>
<script type="text/javascript">
$(document).ready(function(){
  $("input").keydown(function(){
    $("input").css("background-color","#FFFFCC");
  });
  $("input").keyup(function(){
    $("input").css("background-color","#D6D6FF");
  });
});
</script>
</head>
<body>
Enter your name: <input type="text" />
<p>當發生 keydown 和 keyup 事件時,輸入域會改變顏色。請試著在其中輸入內容。</p>
</body>
</html>

變量e表示發生擊鍵事件,尋找是哪個鍵被按下,要使用which這個屬性。

知識點二

 var keycode = e.which ? e.which : e.keyCode;

這句代碼是為了兼容瀏覽器按鍵事件對象的按鍵碼屬性, 如IE中,只有keyCode屬性,而FireFox中有which和charCode屬性,Opera中有keyCode和which屬性等。

知識點三

if(keycode == 38){}

常用按鍵碼與按鍵關系對應表

知識點四

onKeyUp 事件:onkeyup 事件會在鍵盤按鍵被松開時發生。

知識點五

blur() 方法:當失去焦點 (blur) 時觸發事件,比如輸入域失去焦點改變其顏色。
removeClass() 方法:從被選元素移除一個或多個類。
addClass()方法:向被選元素添加一個或多個類。

整體思路及完整代碼:

首先在輸入框上注冊keyup事件,然后在事件中獲取我實現定義的data對象數組(一般實時數據通過ajax獲取json對象)。取得數據后,在下方區域就可以顯示數據了,當我們點擊每一項的時候,就可以響應事件。同時根據索引值來調整背景高亮。

html代碼:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
 <head>
  <title>簡書自動搜索功能例子</title>
  <meta name="Author" content="wblearn">
  <meta name="Keywords" content="http://www.lxweimin.com/users/48599dc7ef1b/latest_articles">
  <meta name="Description" content="簡書自動搜索功能例子">
  <meta http-equiv="content-type" content="text/html; charset=UTF-8" />
  <link rel="stylesheet" media="all" >
  <link rel="stylesheet" media="all" >
  <link rel="stylesheet" media="all" >
  <script type="text/javascript" src="http://code.jquery.com/jquery-1.8.3.js"></script>
  <script src="http://cdn-qn0.jianshu.io/assets/modernizr-613ea63b5aa2f0e2a1946e9c28c8eedb.js"></script>
  <style type="text/css">
    #container{
        position:absolute;
        left:50%;
        top: 40%;
    }
    #content{
        float:left;
        position:relative;
        right:50%;
    }
    input{
        border:0;
        width:288px;
        height:30px;
        font-size:16px;
        padding:0 5px;
        line-height:30px;
    }
    .item{
        padding:3px 5px;
        cursor:pointer;
    }
    .addbg{
        background:#87A900;
    }
    .first{
        border:solid #87A900 2px;
        width:300px;
    }
    #append{
        border:solid #87A900 2px;
        border-top:0;
        display:none;
    }

img {
    max-width: 100%;
    width: 40px;
    height: 40px;
    vertical-align: middle;
    border: 0;
    -ms-interpolation-mode: bicubic;
}

font{
    margin-left: 20px;
    margin: 10px 0;
    font-family: inherit;
    font-weight: bold;
    line-height: 20px;
    color: inherit;
    text-rendering: optimizelegibility;
}
  </style>
 </head>
 <body>
    <div id="container">
    <div id="content">
        <div class="first"><input id="kw" onKeyup="getContent(this);" /></div>
        <div id="append"></div>
    </div>
    </div>
 </body>
</html>

js代碼:

<script type="text/javascript">
var data = [
    "![](http://upload-images.jianshu.io/upload_images/2556999-22446bcad2b99d1b.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)"+"  <font>簡書IT·互聯網專題</font>",
    "![](http://upload-images.jianshu.io/upload_images/2556999-353d731adf3d34b5?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)"+"  <font>簡書IT·互聯網主編: 向右奔跑</font>",
    "![](http://upload-images.jianshu.io/upload_images/2556999-8d748c1a7d13141f.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)"+"  <font>簡書程序員專題</font>",
    "![](http://upload-images.jianshu.io/upload_images/2556999-3c4eb4a2985e9153.JPG?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)"+"  <font>簡書程序員主編: 小彤花園</font>",
    "![](http://upload-images.jianshu.io/upload_images/2556999-2a1db48c8c206301.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)"+"  <font>簡書連載小說專題</font>",
    "![](http://upload-images.jianshu.io/upload_images/2556999-7dc7674754b2227e?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)"+"  <font>簡書連載小說主編: 一鳴</font>",
    "![](http://upload-images.jianshu.io/upload_images/2556999-b4940e07ef6bbe3f.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)"+"  <font>簡書詩專題</font>",
    "![](http://upload-images.jianshu.io/upload_images/2556999-f90e0cb9a13c11db.jpeg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)"+"  <font>簡書詩主編:北海源</font>",
    "![](http://upload-images.jianshu.io/upload_images/2556999-bad95d5bf57a8399.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)"+"  <font>簡書其他專題</font>",
    "![](http://upload-images.jianshu.io/upload_images/2556999-90cdc692578d6c92?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)"+"  <font>簡書其他主編</font>"
];
$(document).ready(function(){
    $(document).keydown(function(e){
        e = e || window.event;
        var keycode = e.which ? e.which : e.keyCode;
        if(keycode == 38){
            if(jQuery.trim($("#append").html())==""){
                return;
            }
            movePrev();
        }else if(keycode == 40){
            if(jQuery.trim($("#append").html())==""){
                return;
            }
            $("#kw").blur();
            if($(".item").hasClass("addbg")){
                moveNext();
            }else{
                $(".item").removeClass('addbg').eq(0).addClass('addbg');
            }
           
        }else if(keycode == 13){
            dojob();
        }
    });

    var movePrev = function(){
        $("#kw").blur();
        var index = $(".addbg").prevAll().length;
        if(index == 0){
            $(".item").removeClass('addbg').eq($(".item").length-1).addClass('addbg');
        }else{
            $(".item").removeClass('addbg').eq(index-1).addClass('addbg');
        }
    }
   
    var moveNext = function(){
        var index = $(".addbg").prevAll().length;
        if(index == $(".item").length-1){
            $(".item").removeClass('addbg').eq(0).addClass('addbg');
        }else{
            $(".item").removeClass('addbg').eq(index+1).addClass('addbg');
        }
       
    }
   
    var dojob = function(){
        $("#kw").blur();
        var value = $(".addbg").text();
        $("#kw").val(value);
        $("#append").hide().html("");
    }
});
function getContent(obj){
    var kw = jQuery.trim($(obj).val());
    if(kw == ""){
        $("#append").hide().html("");
        return false;
    }
    var html = "";
    for (var i = 0; i < data.length; i++) {
        if (data[i].indexOf(kw) >= 0) {
            html = html + "<div class='item' onmouseenter='getFocus(this)' onClick='getCon(this);'>" + data[i] + "</div>"
        }
    }
    if(html != ""){
        $("#append").show().html(html);
    }else{
        $("#append").hide().html("");
    }
}
function getFocus(obj){
    $(".item").removeClass("addbg");
    $(obj).addClass("addbg");
}
function getCon(obj){
    var value = $(obj).text();
    $("#kw").val(value);
    $("#append").hide().html("");
}
</script>

寫在最后

以上就是我總結分享搜索自動匹配功能的全部內容,當然,界面我還可以做得更美觀,功能可以做的更完善。今天先到這里,下次見(持續更新中......)

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,001評論 6 537
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,786評論 3 423
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,986評論 0 381
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,204評論 1 315
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,964評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,354評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,410評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,554評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,106評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,918評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,093評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,648評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,342評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,755評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,009評論 1 289
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,839評論 3 395
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,107評論 2 375

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,681評論 25 708
  • ¥開啟¥ 【iAPP實現進入界面執行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個線程,因...
    小菜c閱讀 6,489評論 0 17
  • 昨晚失眠,輾轉反側方才入睡,卻也睡不安生。 貌似是看他來了請閉眼留下的后遺癥,有段時間睡夢中總是血腥場面,每每...
    二默菇涼閱讀 194評論 0 0
  • 前言:魏晉南北朝長達350年的歷史,比隋唐以來任何一個朝代的歷史都要長。漫漫長河,涌現了無數文人武將,但是歷史記載...
    木不周閱讀 1,969評論 5 10
  • 棄我去者,昨日之事不可留, 亂我心者,今日之事多煩憂。 往昔歷歷皆可數, 翻開幸福之路, 歡聲笑語幾度, 嘆匆匆那...
    化繭成蝶_219a閱讀 421評論 0 0