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

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

May 16, 2016 pm 05:01 PM
input oninput 搜索提示

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

需求:
实现带提示的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");
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
2 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
Repo: Wie man Teamkollegen wiederbelebt
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Abenteuer: Wie man riesige Samen bekommt
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

So implementieren Sie ein verstecktes Laravel-Eingabefeld So implementieren Sie ein verstecktes Laravel-Eingabefeld Dec 12, 2022 am 10:07 AM

So implementieren Sie das ausgeblendete Laravel-Eingabefeld: 1. Suchen und öffnen Sie die Blade-Vorlagendatei. 2. Verwenden Sie die method_field-Methode in der Blade-Vorlage, um ein ausgeblendetes Feld zu erstellen. ".

So kapseln Sie Eingabekomponenten und einheitliche Formulardaten in vue3 So kapseln Sie Eingabekomponenten und einheitliche Formulardaten in vue3 May 12, 2023 pm 03:58 PM

Vorbereitung Verwenden Sie vuecreateexample, um ein Projekt zu erstellen. Die Parameter lauten ungefähr wie folgt: Verwenden Sie native Eingaben, bei denen es sich hauptsächlich um Werte und Änderungen handelt. App.tsx lautet wie folgt: import{ref}from'vue';exportdefault{setup(){//username is the data constusername=ref('Zhang San');//Wenn sich das Eingabefeld ändert, synchronisieren Sie die Daten constonInput =;return( )=>({

PHP-Entwicklung: So implementieren Sie Eingabeaufforderungen für Suchbegriffe und automatische Vervollständigungsfunktionen PHP-Entwicklung: So implementieren Sie Eingabeaufforderungen für Suchbegriffe und automatische Vervollständigungsfunktionen Sep 21, 2023 pm 01:01 PM

PHP-Entwicklung: Implementierung von Eingabeaufforderungen für Suchbegriffe und Funktionen zur automatischen Vervollständigung. Im heutigen Internetzeitalter sind Suchmaschinen zu einem der wichtigsten Kanäle geworden, über die Menschen Informationen erhalten. Bei der Website-Entwicklung liegt die Bedeutung der Suchfunktion auf der Hand. Um das Benutzererlebnis und die Suchergebnisse zu verbessern, ist die Implementierung von Suchbegriff-Eingabeaufforderungen und automatischen Vervollständigungsfunktionen eine sehr wertvolle und notwendige Entwicklungsaufgabe. In diesem Artikel wird erläutert, wie Eingabeaufforderungen für Suchbegriffe und automatische Vervollständigungsfunktionen in der PHP-Entwicklung implementiert werden, und es werden spezifische Codebeispiele bereitgestellt. Eingabeaufforderungen für Suchbegriffe beziehen sich auf die

Was ist in JavaScript der Zweck des „oninput'-Ereignisses? Was ist in JavaScript der Zweck des „oninput'-Ereignisses? Aug 26, 2023 pm 03:17 PM

Wenn dem Eingabefeld ein Wert hinzugefügt wird, tritt das oninput-Ereignis auf. Sie können versuchen, den folgenden Code auszuführen, um zu verstehen, wie Oninput-Ereignisse in JavaScript implementiert werden – Beispiel<!DOCTYPEhtml><html> <body> <p>Writebelow:</p> <inputtype="text&quot

Detaillierte Erläuterung der Eingabefeld-Bindungsereignisse in Vue-Dokumenten Detaillierte Erläuterung der Eingabefeld-Bindungsereignisse in Vue-Dokumenten Jun 21, 2023 am 08:12 AM

Vue.js ist ein leichtes JavaScript-Framework, das einfach zu verwenden, effizient und flexibel ist. Es ist derzeit eines der beliebtesten Front-End-Frameworks. In Vue.js sind Eingabefeld-Bindungsereignisse eine sehr häufige Anforderung. In diesem Artikel werden die Eingabefeld-Bindungsereignisse im Vue-Dokument ausführlich vorgestellt. 1. Grundkonzepte In Vue.js bezieht sich das Eingabefeld-Bindungsereignis auf die Bindung des Werts des Eingabefelds an das Datenobjekt der Vue-Instanz, wodurch eine bidirektionale Bindung von Eingabe und Antwort erreicht wird. In Vue.j

Was tun, wenn beim Klicken auf das Eingabefeld kein Cursor angezeigt wird? Was tun, wenn beim Klicken auf das Eingabefeld kein Cursor angezeigt wird? Nov 24, 2023 am 09:44 AM

Lösungen zum Anklicken des Eingabefelds ohne Cursor: 1. Bestätigen Sie den Browser-Cache. 3. Aktualisieren Sie den Browser. 6. Überprüfen Sie die Eingabe Box-Eigenschaften; 7. Debuggen von JavaScript-Code; 8. Überprüfen Sie andere Elemente der Seite. 9. Berücksichtigen Sie die Browserkompatibilität.

So verwenden Sie das Wagenrücklauf-Ereignis und die Überprüfungsfunktion des Eingabefelds im Vue-Dokument So verwenden Sie das Wagenrücklauf-Ereignis und die Überprüfungsfunktion des Eingabefelds im Vue-Dokument Jun 20, 2023 am 09:13 AM

Vue ist ein beliebtes JavaScript-Frontend-Framework mit einem reaktionsfähigen Datenbindungs- und Komponentensystem im Kern. In Vue-Anwendungen ist das Eingabefeld eines der am häufigsten verwendeten UI-Elemente. Wenn der Benutzer Text eingibt, hoffen wir, auf das Wagenrücklaufereignis zu warten und die Eingabe vor dem Absenden zu validieren. In diesem Artikel werden das Eingabeereignis des Eingabefelds und die Verwendung der Überprüfungsfunktion im Vue-Dokument vorgestellt. 1. Das Wagenrücklaufereignis des Eingabefelds in Vue ist sehr einfach.

Was ist das Eingabeelement in jquery? Was ist das Eingabeelement in jquery? Jun 06, 2023 pm 02:18 PM

In jquery ist die Eingabe ein Selektor, der Formularelemente auswählt: 1. Die Eingabe wird zum Sammeln von Benutzerinformationen verwendet. Das Eingabefeld kann ein Textfeld sein Kontrollkästchen oder eine Maske. Die Textsteuerelemente, Optionsfelder, Schaltflächen usw. nach den anklickbaren Bildern und Senden-Schaltflächen usw.

See all articles