搜索框自動(dòng)補(bǔ)全(模糊匹配)功能實(shí)現(xiàn)

??本地實(shí)現(xiàn)了一個(gè)搜索框自動(dòng)補(bǔ)全的小功能,在JQuery UI的autocomplete插件的基礎(chǔ)上,加入了自己的業(yè)務(wù)代碼,貼出來回顧一下,同時(shí)可以給大家一個(gè)參考

??首先貼出的是JQuery Ui 的自動(dòng)補(bǔ)全插件部分的代碼,后面的功能都是在其基礎(chǔ)上追加的,直接拷貝到你的本地就可以直觀的看到運(yùn)行效果,也可以到官網(wǎng)上面體驗(yàn)和查看,為了方便,我這里是直接引入的JS鏈接點(diǎn)擊下載JQuery UI的源碼

<!doctype html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>jQuery UI Autocomplete - Default functionality</title>
  <link rel="stylesheet" >
  <link rel="stylesheet" href="/resources/demos/style.css">
  <script src="https://code.jquery.com/jquery-1.12.4.js"></script>
  <script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>
  <script>
  $( function() {
    var availableTags = [//這里要改成根據(jù)用戶的輸入,自動(dòng)更換詞庫的形式
      "ActionScript",
      "AppleScript",
      "Asp",
      "BASIC",
      "C",
      "C++",
      "Clojure",
      "COBOL",
      "ColdFusion",
      "Erlang",
      "Fortran",
      "Groovy",
      "Haskell",
      "Java",
      "JavaScript",
      "Lisp",
      "Perl",
      "PHP",
      "Python",
      "Ruby",
      "Scala",
      "Scheme"
    ];
    $( "#tags" ).autocomplete({//調(diào)用補(bǔ)全功能
      source: availableTags
    });
  } );
  </script>
</head>
<body>
 
<div class="ui-widget">
  <label for="tags">Tags: </label>
  <input id="tags">
</div>
 
 
</body>
</html>

運(yùn)行截圖

jquery-ui的自動(dòng)補(bǔ)全功能截圖

下面說下我追加的部分功能及實(shí)現(xiàn)思路,有可以改進(jìn)的地方還請(qǐng)指教:

  1. 首先,數(shù)據(jù)源要根據(jù)用戶輸入的內(nèi)容實(shí)時(shí)更新.
    輸入框的值隨著用戶的輸入會(huì)一直變動(dòng).所以,輸入框下方的推薦補(bǔ)全的內(nèi)容要輸入的值進(jìn)行變動(dòng),這里使用onkeyup屬性來監(jiān)聽鍵盤動(dòng)作,并傳遞此時(shí)input的value值到j(luò)s函數(shù)中.
    //html
    <input type="search" class="" id="tags" placeholder="搜索" required="" onkeyup="catch_keyword(this.value)">

    //js代碼
    function catch_keyword(word) {//這里接受并log出value
        console.log(word);
    }
  1. 第2步,考慮到數(shù)據(jù)庫中需要模糊檢索的字段都是中文的菜品名稱.所以,當(dāng)用戶輸入字母的時(shí)候,進(jìn)行了一下過濾,當(dāng)輸入的內(nèi)容中存在字母時(shí),不提交給后臺(tái)處理
    //字符串判斷函數(shù)
    //判斷一個(gè)字符串是否混有字母,全中文返回true
    function isChn(str) {
        var reg = /^[\u4E00-\u9FA5]+$/;
        if (!reg.test(str)) {
            return false;
        } else {
            return true;
        }
    }
  1. 發(fā)現(xiàn)當(dāng)字符串中含有空格的時(shí)候,上面的字符串判斷函數(shù),返回的內(nèi)容不符合預(yù)期,然后加入了一個(gè)去除字符串中所有空格的功能
    //去掉字符串中任意位置的空格,返回去除空格后的字符串
    function Trim(str, is_global) {
        var result;
        result = str.replace(/(^\s+)|(\s+$)/g, "");
        if (is_global.toLowerCase() == "g") {
            result = result.replace(/\s/g, "");
        }
        return result;
    }
  1. 處理結(jié)束用戶的輸入后,就是提交到后臺(tái),然后返回?cái)?shù)據(jù)源了,也就是availableTags;這里我把a(bǔ)vailableTags聲明為全局變量.并且用同步的Ajax方式取回?cái)?shù)據(jù),然后賦值給availableTags,然后在監(jiān)聽鍵盤的函數(shù)中,使用返回的數(shù)據(jù)調(diào)用自動(dòng)補(bǔ)全功能.
    //請(qǐng)求后端獲取數(shù)據(jù)源
    function get_source(word = null) {
        var url = "<?php echo base_url('admin/Demo/source');?>?keyword=" + word;
        $.get({
            type: 'GET',
            url: url,
            async: false,//改為同步
            dataType: 'json',
            success: function (response) {
                console.log('1');
                availableTags = response;
            }
        });
    }

?這里更新下最開始的接收監(jiān)聽鍵盤后的value值的函數(shù)

    //捕捉鍵入的關(guān)鍵字
    function catch_keyword(word = null) {
        if (isChn(Trim(word, 'g'))) {//去掉空格后檢查字符串,如果符合,繼續(xù)請(qǐng)求后臺(tái)
            get_source(word);
            $("#tags").autocomplete({
                source: availableTags //數(shù)據(jù)源
            });
        }
    }
  1. 到這里,這個(gè)功能已經(jīng)基本結(jié)束了,在測(cè)試過程中發(fā)現(xiàn)了一個(gè)小問題,每次第一次獲取用戶輸入的時(shí)候,自動(dòng)補(bǔ)全功能沒有觸發(fā),在用戶繼續(xù)輸入后,才觸發(fā)成功,經(jīng)過調(diào)試,我在頁面加載完成后,初始化一下自動(dòng)補(bǔ)全插件,解決了這個(gè)問題

6. 附:完整代碼
不知道如何在markdown中添加下載鏈接,只好把完整代碼放上來啦!

<!doctype html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title></title>
    <link rel="stylesheet" href="/jquery-weui-build/dist/lib/weui.min.css">
    <link rel="stylesheet" href="/jquery-weui-build/dist/css/jquery-weui.css">
    <link rel="stylesheet" href="/jquery-weui-build/demos/css/demos.css">
    <link rel="stylesheet" >

    <script src="https://code.jquery.com/jquery-1.12.4.js"></script>
    <script src="/static/jquery-weui-build/dist/lib/fastclick.js"></script>
    <script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>


    <script>
        $(function () {
            FastClick.attach(document.body);
        });
    </script>
    <script src="/jquery-weui-build/dist/js/jquery-weui.js"></script>
</head>
<body>

<div class="ui-widget">


    <div class="weui-search-bar" id="searchBar">
        <form class="weui-search-bar__form" action="#">
            <div class="weui-search-bar__box">
                <i class="weui-icon-search"></i>
                <input type="search" class="weui-search-bar__input" id="tags" placeholder="搜索" required=""
                       onkeyup="catch_keyword(this.value)">
                <a href="javascript:" class="weui-icon-clear" id="searchClear"></a>
            </div>
            <label class="weui-search-bar__label" id="searchText"
                   style="transform-origin: 0px 0px 0px; opacity: 1; transform: scale(1, 1);">
                <i class="weui-icon-search"></i>
                <span>搜索</span>
            </label>
        </form>
        <a href="javascript:" class="weui-search-bar__cancel-btn" id="searchCancel">取消</a>
    </div>
</div>

<script>
    var availableTags = [];//數(shù)據(jù)源

    //先初始化自動(dòng)補(bǔ)全功能
    $("#tags").autocomplete({
        source: availableTags //數(shù)據(jù)源
    });

    //去掉字符串中任意位置的空格
    function Trim(str, is_global) {
        var result;
        result = str.replace(/(^\s+)|(\s+$)/g, "");
        if (is_global.toLowerCase() == "g") {
            result = result.replace(/\s/g, "");
        }
        return result;
    }

    //判斷字符串是否全是中文
    function isChn(str) {
        var reg = /^[\u4E00-\u9FA5]+$/;
        if (!reg.test(str)) {
            return false;
        } else {
            return true;
        }
    }

    //捕捉鍵入的關(guān)鍵字
    function catch_keyword(word = null) {

        if (isChn(Trim(word, 'g'))) {
            get_source(word);
            $("#tags").autocomplete({
                source: availableTags //數(shù)據(jù)源
            });

        }
    }

    //請(qǐng)求后端獲取數(shù)據(jù)源
    function get_source(word = null) {
        var url = "<?php echo base_url('admin/Demo/source');?>?keyword=" + word;
        $.get({
            type: 'GET',
            url: url,
            async: false,//改為同步
            dataType: 'json',
            success: function (response) {
                console.log('1');
                availableTags = response;
            }
        });
    }

</script>
</body>
</html>

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末藕漱,一起剝皮案震驚了整個(gè)濱河市谢肾,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌间狂,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,104評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡浩嫌,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門补胚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來码耐,“玉大人,你說我怎么就攤上這事溶其∩龋” “怎么了?”我有些...
    開封第一講書人閱讀 168,697評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵瓶逃,是天一觀的道長(zhǎng)束铭。 經(jīng)常有香客問我,道長(zhǎng)厢绝,這世上最難降的妖魔是什么契沫? 我笑而不...
    開封第一講書人閱讀 59,836評(píng)論 1 298
  • 正文 為了忘掉前任,我火速辦了婚禮昔汉,結(jié)果婚禮上懈万,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好钞速,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,851評(píng)論 6 397
  • 文/花漫 我一把揭開白布贷掖。 她就那樣靜靜地躺著嫡秕,像睡著了一般渴语。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上昆咽,一...
    開封第一講書人閱讀 52,441評(píng)論 1 310
  • 那天驾凶,我揣著相機(jī)與錄音,去河邊找鬼掷酗。 笑死调违,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的泻轰。 我是一名探鬼主播技肩,決...
    沈念sama閱讀 40,992評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼浮声!你這毒婦竟也來了虚婿?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,899評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤泳挥,失蹤者是張志新(化名)和其女友劉穎然痊,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體屉符,經(jīng)...
    沈念sama閱讀 46,457評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡剧浸,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,529評(píng)論 3 341
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了矗钟。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片唆香。...
    茶點(diǎn)故事閱讀 40,664評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖吨艇,靈堂內(nèi)的尸體忽然破棺而出袋马,到底是詐尸還是另有隱情,我是刑警寧澤秸应,帶...
    沈念sama閱讀 36,346評(píng)論 5 350
  • 正文 年R本政府宣布虑凛,位于F島的核電站,受9級(jí)特大地震影響软啼,放射性物質(zhì)發(fā)生泄漏桑谍。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,025評(píng)論 3 334
  • 文/蒙蒙 一祸挪、第九天 我趴在偏房一處隱蔽的房頂上張望锣披。 院中可真熱鬧,春花似錦、人聲如沸雹仿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽胧辽。三九已至峻仇,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間邑商,已是汗流浹背摄咆。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留人断,地道東北人吭从。 一個(gè)月前我還...
    沈念sama閱讀 49,081評(píng)論 3 377
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像恶迈,于是被迫代替她去往敵國(guó)和親涩金。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,675評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • 1暇仲、通過CocoaPods安裝項(xiàng)目名稱項(xiàng)目信息 AFNetworking網(wǎng)絡(luò)請(qǐng)求組件 FMDB本地?cái)?shù)據(jù)庫組件 SD...
    陽明先生_X自主閱讀 15,988評(píng)論 3 119
  • 經(jīng)常從事文書(尤其是法律文書)寫作的人知道行文忌冗長(zhǎng)啰嗦步做,觀點(diǎn)須鮮明,條理須清晰熔吗,語言須簡(jiǎn)潔辆床,敘述時(shí)不要感情化。這...
    llccgao閱讀 388評(píng)論 0 0
  • 1.AVI格式 它的英文全稱為Audio Video Interleaved桅狠,即音頻視頻交錯(cuò)格式讼载。它于1992年被...
    落寒z閱讀 4,587評(píng)論 0 0
  • 生活中漩符,我們都有拖延的現(xiàn)象一喘,一項(xiàng)工作不到最后期限不動(dòng)手;健身計(jì)劃遲遲不實(shí)行嗜暴,很多心理學(xué)家都在分析凸克,我們?yōu)槭裁赐涎樱?..
    沐子2閱讀 296評(píng)論 0 0
  • 時(shí)隔兩年再次瀏覽簡(jiǎn)書和自己喜歡過的文章,回憶思緒沖在腦海...
    胡椒粉7閱讀 162評(píng)論 0 1