亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

讓input框實現類似百度的搜索提示(基于jquery事件監聽)

2019-11-20 21:10:36
字體:
來源:轉載
供稿:網友

挺炫的一個效果,百度和谷歌好像已實現好多年了,我以為在網上能輕易找到代碼來實現這個效果。真正遇到這個需求,發現還真找不到。于是自己動手寫這個效果,由于我是把效果整合到我的整套框架里,所以沒有進行單獨的封裝。

需求:
實現帶提示的input框,類似百度搜索,有改動的時候去獲取常用關鍵詞,數據來源于系統數據庫,支持鼠標選擇或鍵盤選擇

思路:
框架一貫思路,通過class作為監聽入口,通過data作為數據傳遞;
通過監聽input和propertychange事件實現實時的改動監聽,input是主流,propertychange是ie,你懂的;
通過ajax實現post動作,把返回內容顯示成類似選框的形式;
監聽鍵盤的上鍵(38)、下鍵(40)、回車鍵(13),通過綁定keydown,判斷event.keycode實現;
監聽鼠標的mouseover和click事件,與鍵盤動作要完美結合;
若input內容要求與已知選項必須一致,則監聽blur事件,判斷是否允許換焦點;

實現代碼:

復制代碼 代碼如下:

//By COoL

//定義全局變量用于儲存提示層
var liketips;

//監聽改動或得到焦點事件

//禁用chrome和firefox瀏覽器自帶的自動提示
$('.getsearchjson').attr("autocomplete","off");
$('.getsearchjson').bind("propertychange input focus",function(event){
    $this=$(this);
    if(event.type!='focus'){
        //如果有改變,則狀態定為必須重新選擇,因為純人手輸入會導致value無法插入
        $this.data('ok',false);
    }

    //獲取input框位置并計算提示層應出現的位置
    var top=1*$this.offset().top+25;
    var left=1*$this.offset().left;
    var width=1*$this.width()+12;

    //重建儲存提示層并讓其在適當位置顯示
    $(liketips).remove();
    liketips=document.createElement('div');
    $liketips=$(liketips);
    //class樣式這里不提供,最主要是position:absolute
    $liketips.addClass("liketips");
    $liketips.css({top:top+'px',left:left+'px',width:width+'px'});

    //加載前先顯示loading動態圖
    $liketips.append('<img src="/images/loading.gif" border="0" />');
    $liketips.appendTo($this.parent());
    $liketips.show();

    //定義ajax去獲取json,type參數通過data-type設置,keyword則是目前已輸入的值
    //返回值以table形式展示
    $.post('/data/search.do',{type:$this.data('type'),keyword:$this.val()},function(json){
        $liketips.empty();
        var htmlcode="<table cellspacing='0' cellpadding='2'><tbody>";
        for(var i=0;i<json.datas.length;i++){
            //這里我需要用到value和title兩項,所以用data-value傳遞多一個參數,在回車或鼠標點擊后賦值到相應的地方,以此完美地替代select
            htmlcode+='<tr data-value="'+json.datas[i][0]+'"><td>'+json.datas[i][1]+'</td></tr>';
        }
        htmlcode+="</tbody></table><span>請務必在此下拉框中選擇</span>";
        //把loading動態圖替換成內容
        $liketips.html(htmlcode);
    },"json");
});

//焦點消失時確保數據來自選項,隱藏提示框體
$('.getsearchjson').blur(function(){
    //因為鼠標點擊時blur動作結算在click之前,setTimeout是為了解決這個問題
    $oldthis=$(this);
    setTimeout(function(){
        if($oldthis.data('ok'))
            $(liketips).fadeOut('fast');
        else{
            alert('為保證數據準確性,請務必在下拉提示中選擇一項,謝謝合作');
            $oldthis.focus();
        }
    },200);
});

//監聽鍵盤動作
$('.getsearchjson').keydown(function(event){
    //console.log(event.keyCode);
    $this=$(this);
    if(event.keyCode==40){
        //按鍵是向下
        $nowtr=$('tr.selectedtr');
        //如果已存在選中,則向下,否則,選中選單中第一個
        if($nowtr.length>0){
            $nexttr=$nowtr.next('tr')
            //如果不是最后選項,向下個tr移動,否則跳到第一個tr
            if($nexttr.length>0){
                $('tr.selectedtr').removeClass();
                $nexttr.addClass('selectedtr');
            }
            else{
                $('tr.selectedtr').removeClass();
                $nowtr.parent().find('tr:first').addClass('selectedtr');
            }
        }
        else{
            $('.liketips').find('tr:first').addClass('selectedtr');
        }
    }
    else if(event.keyCode==38){
        //按鍵是向上
        $nowtr=$('tr.selectedtr');
        //如果已存在選中,則向下,否則,選中選單中第一個
        if($nowtr.length>0){
            $prevtr=$nowtr.prev('tr')
            //如果不是最后選項,向下個tr移動,否則跳到第一個tr
            if($prevtr.length>0){
                $('tr.selectedtr').removeClass();
                $prevtr.addClass('selectedtr');
            }
            else{
                $('tr.selectedtr').removeClass();
                $nowtr.parent().find('tr:last').addClass('selectedtr');
            }
        }
        else{
            $('.liketips').find('tr:last').addClass('selectedtr');
        }
    }
    else if(event.keyCode==13){
        //按鍵是回車,則確定返回并隱藏選框
        $nowtr=$('tr.selectedtr');
        if($nowtr.length==1){
            //設置value值到input框通過參數data-valueto配置的value值存儲項中去,一般是hidden項
            $valuefield=$('input[name='+$this.data('valueto')+']');
            $valuefield.val($nowtr.data('value'));
            $this.val($nowtr.text());
            //設置狀態是從選項中選擇,允許blur
            $this.data('ok',true);
        }
        $(liketips).fadeOut('fast');
        return false;
    }
    //console.log(event.keyCode);
    return true;
});

//監聽鼠標動作,mouseover改變選中項
$(document).delegate('.liketips td','mouseover',function(){
    $nowtr=$(this).parent();
    $nowtr.siblings('tr').removeClass();
    $nowtr.addClass('selectedtr');
});

//監聽鼠標動作,click選定
$(document).delegate('.liketips td','click',function(){
    $nowtr=$(this).parent();
    if($nowtr.length==1){
        //取得該提示層對應的input框
        $inputfield=$nowtr.parent().parent().parent().siblings('input.getsearchjson');

        //設置value值到input框通過參數data-valueto配置的value值存儲項中去,一般是hidden項
        $valuefield=$('input[name='+$inputfield.data('valueto')+']');
        $valuefield.val($nowtr.data('value'));
        $inputfield.val($nowtr.text());
        //設置狀態是從選項中選擇,允許blur
        $inputfield.data('ok',true);
    }
    $(liketips).fadeOut('fast');
});

CSS這里就不放出了,我的實現效果如下:



復制代碼 代碼如下:

//禁用chrome和firefox瀏覽器自帶的自動提示
$this.attr("autocomplete","off");

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91av视频在线播放| 国产精品日韩欧美综合| 午夜免费在线观看精品视频| 精品一区二区亚洲| 亚洲色图校园春色| 91免费电影网站| 国产精品视频地址| 高潮白浆女日韩av免费看| 最近2019中文字幕在线高清| 久久91精品国产91久久久| 美女av一区二区三区| 91在线精品播放| 4k岛国日韩精品**专区| 精品成人av一区| 亚洲电影免费观看高清完整版在线| 日韩在线中文字| 亚洲永久在线观看| 亚州成人av在线| 清纯唯美日韩制服另类| 精品亚洲一区二区三区四区五区| 国产91色在线免费| 亚洲人成绝费网站色www| 成人精品久久av网站| 黄色精品一区二区| 国产欧美日韩亚洲精品| 亚洲网在线观看| 亚洲一级黄色av| 日韩av网站导航| 欧美激情在线观看| 色老头一区二区三区在线观看| 久久人91精品久久久久久不卡| 亚洲免费人成在线视频观看| 91亚洲va在线va天堂va国| 一区二区三区四区视频| 久久久999国产| 亚洲欧美中文在线视频| 亚洲免费影视第一页| 亚洲国产毛片完整版| 91色视频在线导航| 亚州国产精品久久久| 久久久久久久久久久av| 性日韩欧美在线视频| 久久精品在线视频| 国产精品国产福利国产秒拍| 亚洲人在线视频| 国产精品aaa| 亚洲一区二区中文字幕| 亚洲理论片在线观看| 中文字幕欧美日韩在线| 中文字幕欧美日韩va免费视频| 欧美亚洲另类在线| 亚洲情综合五月天| 91精品国产色综合| 欧美大片在线影院| 亚洲激情电影中文字幕| 2019中文字幕全在线观看| 国产精品jvid在线观看蜜臀| 8090理伦午夜在线电影| 久久69精品久久久久久国产越南| 国产激情999| 91精品啪aⅴ在线观看国产| 91精品视频观看| 热re91久久精品国99热蜜臀| 91欧美视频网站| 欧美精品免费播放| 亚洲新中文字幕| 91在线视频免费| 国产精品久久网| 日韩av中文字幕在线免费观看| 国产成人免费av| 亚洲成人av片| 国产精品自产拍在线观| 日韩免费不卡av| 97在线看免费观看视频在线观看| 韩剧1988在线观看免费完整版| 久久艳片www.17c.com| 日韩电影在线观看免费| 亚洲成人激情图| 少妇高潮 亚洲精品| 美女扒开尿口让男人操亚洲视频网站| 黄色成人在线播放| 中文字幕在线看视频国产欧美在线看完整| 欧美中文字幕视频在线观看| 91精品国产综合久久香蕉最新版| 911国产网站尤物在线观看| 亚洲激情在线观看| 最新国产精品拍自在线播放| 亚洲国产精品久久久久久| 欧美极品欧美精品欧美视频| 国产精品com| 亚洲精品福利免费在线观看| 精品日本美女福利在线观看| 欧美精品久久久久久久久久| 欧美日韩免费在线观看| 亚洲欧洲在线视频| 精品国产区一区二区三区在线观看| 亚洲精品一区av在线播放| 欧美成年人视频网站欧美| 亚洲天堂av在线免费观看| 亚洲国产成人精品女人久久久| 九九九久久国产免费| 91久久精品久久国产性色也91| 98精品国产高清在线xxxx天堂| 欧美猛交ⅹxxx乱大交视频| 久久成人精品一区二区三区| 日韩高清中文字幕| 最近2019中文字幕第三页视频| 国产精品影院在线观看| 国产精品久久久久av| 亚洲福利视频在线| 亚洲国产另类 国产精品国产免费| xxx欧美精品| 日韩综合视频在线观看| 欧美一区第一页| 日韩精品免费在线视频观看| 久久久国产精品一区| 欧美老妇交乱视频| 狠狠色狠色综合曰曰| 国产区精品在线观看| 精品magnet| 97精品一区二区视频在线观看| 成人在线一区二区| 欧美国产视频日韩| 啪一啪鲁一鲁2019在线视频| 日韩精品一二三四区| 久久久久久国产三级电影| 欧美自拍视频在线观看| 久久久久北条麻妃免费看| 亚洲va欧美va在线观看| 亚洲片在线资源| 中文字幕在线看视频国产欧美在线看完整| 亚洲天堂日韩电影| 国内精品视频在线| 欧美综合在线第二页| 26uuu日韩精品一区二区| 亚洲а∨天堂久久精品喷水| 91精品国产91久久| 欧美一级电影在线| 中文字幕国产精品久久| 精品五月天久久| 中文字幕免费国产精品| 亚洲qvod图片区电影| 国产欧美一区二区白浆黑人| 国产三级精品网站| 亚洲视频在线免费观看| 国产精品自产拍在线观看| zzjj国产精品一区二区| 国产精品高精视频免费| 亚洲精品女av网站| 欧美视频第一页| 亚洲精品一区二区三区不| 欧美日韩色婷婷| 中文在线不卡视频| 国产精品99免视看9| 亚洲国产第一页| 成人精品久久久| 懂色av影视一区二区三区| 日韩在线资源网| 亚洲欧美中文另类| 成人激情在线观看| 国产综合福利在线| 中文字幕亚洲欧美日韩在线不卡| 成人春色激情网| 午夜精品久久久久久99热软件|