Rumah hujung hadapan web tutorial js 让input框实现类似百度的搜索提示(基于jquery事件监听)_jquery

让input框实现类似百度的搜索提示(基于jquery事件监听)_jquery

May 16, 2016 pm 05:01 PM
input oninput Petua carian

挺炫的一个效果,百度和谷歌好像已实现好多年了,我以为在网上能轻易找到代码来实现这个效果。真正遇到这个需求,发现还真找不到。于是自己动手写这个效果,由于我是把效果整合到我的整套框架里,所以没有进行单独的封装。

需求:
实现带提示的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('让input框实现类似百度的搜索提示(基于jquery事件监听)_jquery');
    $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="";
        for(var i=0;i            //这里我需要用到value和title两项,所以用data-value传递多一个参数,在回车或鼠标点击后赋值到相应的地方,以此完美地替代select
            htmlcode+='
';
        }
        htmlcode+="
'+json.datas[i][1]+'
请务必在此下拉框中选择";
        //把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这里就不放出了,我的实现效果如下:

让input框实现类似百度的搜索提示(基于jquery事件监听)_jquery

复制代码 代码如下:

//禁用chrome和firefox浏览器自带的自动提示
$this.attr("autocomplete","off");
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Bagaimana untuk merangkum komponen input dan data borang bersatu dalam vue3 Bagaimana untuk merangkum komponen input dan data borang bersatu dalam vue3 May 12, 2023 pm 03:58 PM

Penyediaan Gunakan vuecreateexample untuk mencipta projek Parameternya adalah seperti berikut: gunakan input asli terutamanya nilai dan perubahan. App.tsx adalah seperti berikut: import{ref}from'vue';exportdefault{setup(){//username is the data constusername=ref('Zhang San');//Apabila kotak input berubah, segerakkan data constonInput =;kembali( )=>({

Bagaimana untuk melaksanakan medan tersembunyi input laravel Bagaimana untuk melaksanakan medan tersembunyi input laravel Dec 12, 2022 am 10:07 AM

Cara melaksanakan medan tersembunyi input laravel: 1. Cari dan buka fail templat Blade 2. Gunakan kaedah method_field dalam templat Blade untuk mencipta medan tersembunyi Sintaks penciptaan ialah "{{ method_field('DELETE') }} ".

Pembangunan PHP: Bagaimana untuk melaksanakan gesaan kata kunci carian dan fungsi penyiapan automatik Pembangunan PHP: Bagaimana untuk melaksanakan gesaan kata kunci carian dan fungsi penyiapan automatik Sep 21, 2023 pm 01:01 PM

Pembangunan PHP: Melaksanakan gesaan kata kunci carian dan fungsi penyiapan automatik Dalam era Internet hari ini, enjin carian telah menjadi salah satu saluran penting untuk orang ramai mendapatkan maklumat. Dalam pembangunan laman web, kepentingan fungsi carian adalah jelas. Untuk meningkatkan pengalaman pengguna dan hasil carian, melaksanakan gesaan kata kunci carian dan fungsi penyiapan automatik adalah tugas pembangunan yang sangat berharga dan perlu. Artikel ini akan memperkenalkan cara melaksanakan gesaan kata kunci carian dan fungsi penyiapan automatik dalam pembangunan PHP, dan menyediakan contoh kod khusus. Gesaan kata kunci carian merujuk kepada apabila pengguna memasukkan

Dalam JavaScript, apakah tujuan acara 'oninput'? Dalam JavaScript, apakah tujuan acara 'oninput'? Aug 26, 2023 pm 03:17 PM

Apabila nilai ditambah pada kotak input, peristiwa oninput berlaku. Anda boleh cuba menjalankan kod berikut untuk memahami cara melaksanakan acara oninput dalam JavaScript - Contoh<!DOCTYPEhtml><html> <body> <p>Tulis di bawah:</p> <inputtype="text&quot

Apa yang perlu dilakukan jika tiada kursor apabila mengklik pada kotak input Apa yang perlu dilakukan jika tiada kursor apabila mengklik pada kotak input Nov 24, 2023 am 09:44 AM

Penyelesaian untuk mengklik kotak input tanpa kursor: 1. Sahkan fokus kotak input 2. Kosongkan cache penyemak imbas 4. Gunakan JavaScript 5. Semak input; sifat kotak; 7. Menyahpepijat kod JavaScript; 8. Semak elemen lain halaman;

Penjelasan terperinci tentang peristiwa mengikat kotak input dalam dokumen Vue Penjelasan terperinci tentang peristiwa mengikat kotak input dalam dokumen Vue Jun 21, 2023 am 08:12 AM

Vue.js ialah rangka kerja JavaScript ringan yang mudah digunakan, cekap dan fleksibel Ia merupakan salah satu rangka kerja bahagian hadapan yang paling popular pada masa ini. Dalam Vue.js, peristiwa mengikat kotak input adalah keperluan yang sangat biasa Artikel ini akan memperkenalkan peristiwa mengikat kotak input dalam dokumen Vue secara terperinci. 1. Konsep asas Dalam Vue.js, peristiwa pengikatan kotak input merujuk kepada pengikatan nilai kotak input kepada objek data bagi contoh Vue, dengan itu mencapai pengikatan dua hala input dan respons. Dalam Vue.j

Cara menggunakan acara pemulangan pengangkutan kotak input dan fungsi pengesahan dalam dokumen Vue Cara menggunakan acara pemulangan pengangkutan kotak input dan fungsi pengesahan dalam dokumen Vue Jun 20, 2023 am 09:13 AM

Vue ialah rangka kerja bahagian hadapan JavaScript yang popular dengan pengikatan data responsif dan sistem komponen pada terasnya. Dalam aplikasi Vue, kotak input ialah salah satu elemen UI yang paling biasa digunakan. Apabila pengguna memasukkan teks, kami berharap untuk mendengar acara pemulangan pengangkutan dan mengesahkan input sebelum menyerahkan. Artikel ini akan memperkenalkan acara masukkan kotak input dan penggunaan fungsi pengesahan dalam dokumen Vue. 1. Acara pemulangan gerabak kotak input dalam Vue Memantau peristiwa pemulangan gerabak kotak input dalam Vue adalah sangat mudah.

Bagaimana untuk melarang input dalam input html5 Bagaimana untuk melarang input dalam input html5 Feb 03, 2023 am 10:02 AM

Cara melaksanakan input melumpuhkan dalam input HTML5: 1. Tentukan medan input sebagai baca sahaja dan boleh salin melalui baca sahaja 2. Gunakan disable untuk menyedari bahawa elemen input yang dilumpuhkan boleh disalin, tetapi tidak boleh menerima fokus; panjang maksimum input kepada 0 ;4. Gunakan "οnfοcus="this.blur();"" untuk menghalang teks daripada menjadi input.

See all articles