欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

讓input框?qū)崿F(xiàn)類似百度的搜索提示(基于jquery事件監(jiān)聽)

 更新時(shí)間:2014年01月31日 11:33:16   作者:  
讓input框?qū)崿F(xiàn)類似百度的搜索提示,oninput和onpropertychange事件監(jiān)聽,通過ajax獲取json數(shù)據(jù)

挺炫的一個(gè)效果,百度和谷歌好像已實(shí)現(xiàn)好多年了,我以為在網(wǎng)上能輕易找到代碼來實(shí)現(xiàn)這個(gè)效果。真正遇到這個(gè)需求,發(fā)現(xiàn)還真找不到。于是自己動(dòng)手寫這個(gè)效果,由于我是把效果整合到我的整套框架里,所以沒有進(jìn)行單獨(dú)的封裝。

需求:
實(shí)現(xiàn)帶提示的input框,類似百度搜索,有改動(dòng)的時(shí)候去獲取常用關(guān)鍵詞,數(shù)據(jù)來源于系統(tǒng)數(shù)據(jù)庫(kù),支持鼠標(biāo)選擇或鍵盤選擇

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

實(shí)現(xiàn)代碼:

復(fù)制代碼 代碼如下:

//By COoL

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

//監(jiān)聽改動(dòng)或得到焦點(diǎn)事件

//禁用chrome和firefox瀏覽器自帶的自動(dòng)提示
$('.getsearchjson').attr("autocomplete","off");
$('.getsearchjson').bind("propertychange input focus",function(event){
    $this=$(this);
    if(event.type!='focus'){
        //如果有改變,則狀態(tài)定為必須重新選擇,因?yàn)榧內(nèi)耸州斎霑?huì)導(dǎo)致value無法插入
        $this.data('ok',false);
    }

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

    //重建儲(chǔ)存提示層并讓其在適當(dāng)位置顯示
    $(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動(dòng)態(tài)圖
    $liketips.append('<img src="/images/loading.gif" border="0" />');
    $liketips.appendTo($this.parent());
    $liketips.show();

    //定義ajax去獲取json,type參數(shù)通過data-type設(shè)置,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兩項(xiàng),所以用data-value傳遞多一個(gè)參數(shù),在回車或鼠標(biāo)點(diǎn)擊后賦值到相應(yīng)的地方,以此完美地替代select
            htmlcode+='<tr data-value="'+json.datas[i][0]+'"><td>'+json.datas[i][1]+'</td></tr>';
        }
        htmlcode+="</tbody></table><span>請(qǐng)務(wù)必在此下拉框中選擇</span>";
        //把loading動(dòng)態(tài)圖替換成內(nèi)容
        $liketips.html(htmlcode);
    },"json");
});

//焦點(diǎn)消失時(shí)確保數(shù)據(jù)來自選項(xiàng),隱藏提示框體
$('.getsearchjson').blur(function(){
    //因?yàn)槭髽?biāo)點(diǎn)擊時(shí)blur動(dòng)作結(jié)算在click之前,setTimeout是為了解決這個(gè)問題
    $oldthis=$(this);
    setTimeout(function(){
        if($oldthis.data('ok'))
            $(liketips).fadeOut('fast');
        else{
            alert('為保證數(shù)據(jù)準(zhǔn)確性,請(qǐng)務(wù)必在下拉提示中選擇一項(xiàng),謝謝合作');
            $oldthis.focus();
        }
    },200);
});

//監(jiān)聽鍵盤動(dòng)作
$('.getsearchjson').keydown(function(event){
    //console.log(event.keyCode);
    $this=$(this);
    if(event.keyCode==40){
        //按鍵是向下
        $nowtr=$('tr.selectedtr');
        //如果已存在選中,則向下,否則,選中選單中第一個(gè)
        if($nowtr.length>0){
            $nexttr=$nowtr.next('tr')
            //如果不是最后選項(xiàng),向下個(gè)tr移動(dòng),否則跳到第一個(gè)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');
        //如果已存在選中,則向下,否則,選中選單中第一個(gè)
        if($nowtr.length>0){
            $prevtr=$nowtr.prev('tr')
            //如果不是最后選項(xiàng),向下個(gè)tr移動(dòng),否則跳到第一個(gè)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){
            //設(shè)置value值到input框通過參數(shù)data-valueto配置的value值存儲(chǔ)項(xiàng)中去,一般是hidden項(xiàng)
            $valuefield=$('input[name='+$this.data('valueto')+']');
            $valuefield.val($nowtr.data('value'));
            $this.val($nowtr.text());
            //設(shè)置狀態(tài)是從選項(xiàng)中選擇,允許blur
            $this.data('ok',true);
        }
        $(liketips).fadeOut('fast');
        return false;
    }
    //console.log(event.keyCode);
    return true;
});

//監(jiān)聽鼠標(biāo)動(dòng)作,mouseover改變選中項(xiàng)
$(document).delegate('.liketips td','mouseover',function(){
    $nowtr=$(this).parent();
    $nowtr.siblings('tr').removeClass();
    $nowtr.addClass('selectedtr');
});

//監(jiān)聽鼠標(biāo)動(dòng)作,click選定
$(document).delegate('.liketips td','click',function(){
    $nowtr=$(this).parent();
    if($nowtr.length==1){
        //取得該提示層對(duì)應(yīng)的input框
        $inputfield=$nowtr.parent().parent().parent().siblings('input.getsearchjson');

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

CSS這里就不放出了,我的實(shí)現(xiàn)效果如下:



復(fù)制代碼 代碼如下:

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

相關(guān)文章

  • jQuery判斷元素上是否綁定了指定事件的方法

    jQuery判斷元素上是否綁定了指定事件的方法

    這篇文章主要介紹了jQuery判斷元素上是否綁定了指定事件的方法,涉及jQuery綁定事件的判斷技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-03-03
  • 基于jQuery實(shí)現(xiàn)滾動(dòng)切換效果

    基于jQuery實(shí)現(xiàn)滾動(dòng)切換效果

    這篇文章主要為大家詳細(xì)介紹了基于jQuery實(shí)現(xiàn)滾動(dòng)切換效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-12-12
  • jQuery使用animate實(shí)現(xiàn)ul列表項(xiàng)相互飄動(dòng)效果示例

    jQuery使用animate實(shí)現(xiàn)ul列表項(xiàng)相互飄動(dòng)效果示例

    這篇文章主要介紹了jQuery使用animate實(shí)現(xiàn)ul列表項(xiàng)相互飄動(dòng)效果,結(jié)合實(shí)例形式分析了jQuery使用animate動(dòng)畫切換的操作技巧,需要的朋友可以參考下
    2016-09-09
  • jQuery插件DataTables分頁開發(fā)心得體會(huì)

    jQuery插件DataTables分頁開發(fā)心得體會(huì)

    這篇文章主要為大家分享了jQuery插件DataTables分頁開發(fā)心得體會(huì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • jquery阻止冒泡事件使用模擬事件

    jquery阻止冒泡事件使用模擬事件

    當(dāng)點(diǎn)擊span的時(shí)候div和body的事件全部觸發(fā)了。要阻止這種發(fā)生并使用模擬事件。具體實(shí)現(xiàn)如下,感興趣的朋友可以參考下
    2013-09-09
  • 淺談jQuery中的checkbox問題

    淺談jQuery中的checkbox問題

    下面小編就為大家?guī)硪黄獪\談jQuery中的checkbox問題。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-08-08
  • jquery.pagination.js分頁使用教程

    jquery.pagination.js分頁使用教程

    這篇文章主要為大家詳細(xì)介紹了jquery.pagination.js分頁使用教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-10-10
  • jQuery實(shí)現(xiàn)頁面倒計(jì)時(shí)并刷新效果

    jQuery實(shí)現(xiàn)頁面倒計(jì)時(shí)并刷新效果

    頁面倒計(jì)時(shí)小編在很多網(wǎng)站都有這樣的需求,今天小編給大家分享一段jq代碼實(shí)現(xiàn)頁面倒計(jì)時(shí)并刷新效果,代碼簡(jiǎn)單易懂,非常不錯(cuò),需要的的朋友參考下
    2017-03-03
  • 關(guān)于jQuery庫(kù)沖突的完美解決辦法

    關(guān)于jQuery庫(kù)沖突的完美解決辦法

    在使用jQuery開發(fā)的時(shí)候,可能還會(huì)使用到其他的JS庫(kù),比如Prototype,但多庫(kù)共存時(shí)可能會(huì)發(fā)生沖突,下面這篇文章主要給大家介紹了關(guān)于jQuery庫(kù)沖突的完美解決辦法,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-05-05
  • jquery實(shí)現(xiàn)多屏多圖焦點(diǎn)圖切換特效的方法

    jquery實(shí)現(xiàn)多屏多圖焦點(diǎn)圖切換特效的方法

    這篇文章主要介紹了jquery實(shí)現(xiàn)多屏多圖焦點(diǎn)圖切換特效的方法,涉及jQuery插件jquery.kinMaxShow實(shí)現(xiàn)焦點(diǎn)圖的相關(guān)技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2015-05-05

最新評(píng)論