Ankündigung

Einklappen
Keine Ankündigung bisher.

Autocomplete

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Autocomplete

    Hallo,

    ich bin grad dabei für eine Seite ein Autocomplete Element zu bauen.
    Das funktioniert auch soweit ganz gut.
    Nur habe ich das Problem, dass die Daten aus einer ziemlich großen Datenbank kommen. Das heißt, es dauert ca. 2 - 3 sek bis es mit die Daten zur Vervollständigung anzeigt. Wenn ich innerhalb dieser 2 - 3 Sekunden eine neue Eingabe mache kommt das Script irgendwie durcheinander.. Vielleicht kann mir ja jemand helfen :/

    PHP-Code:
    var logg=0;

    function 
    lookup(inputString) {
        if (
    logg==0){
        
    setTimeout(function() {
            if(
    inputString.length <= 3) {
                $(
    '#suggestions').hide();
            } else {
                
    logg=1;
            $(
    '#load').html('<center><img src="config/img/loader_1.gif"></center>');
                $.
    post("rpc.php", {q""+inputString+""}, 
                function(
    data){
                    if(
    data.length 0) {
                        $(
    '#suggestions').show();
                        $(
    '#autoSuggestionsList').html(data);
                        $(
    '#load').html('');
                        
    logg=0;
                    }
                });
            }
        }, 
    1500);    
        }
        


  • #2
    Also wenn die Datenbank 2-3 Sekunden brauch um was zurück zu liefern, solltest du dir um das Query gedanken machen. Möglicherweise ist es nicht ganz so sinnvoll für Suggestions 5 mio Einträge dem Client zu zuwerfen. Ein Limit und Indexes wären vielleicht ganz Sinnvoll.
    [URL="https://gitter.im/php-de/chat?utm_source=share-link&utm_medium=link&utm_campaign=share-link"]PHP.de Gitter.im Chat[/URL] - [URL="https://raindrop.io/user/32178"]Meine öffentlichen Bookmarks[/URL] ← Ich habe dir geholfen ? [B][URL="https://www.amazon.de/gp/wishlist/348FHGUZWTNL0"]Beschenk mich[/URL][/B].

    Kommentar


    • #3
      Wenn ich im Query ein Limit setze dauert es aber genauso lange.

      Kommentar


      • #4
        Dann schau wo der Flaschenhals ist.

        http://dev.mysql.com/doc/refman/5.0/...g-explain.html
        [URL="https://gitter.im/php-de/chat?utm_source=share-link&utm_medium=link&utm_campaign=share-link"]PHP.de Gitter.im Chat[/URL] - [URL="https://raindrop.io/user/32178"]Meine öffentlichen Bookmarks[/URL] ← Ich habe dir geholfen ? [B][URL="https://www.amazon.de/gp/wishlist/348FHGUZWTNL0"]Beschenk mich[/URL][/B].

        Kommentar


        • #5
          Im Grunde möchte ich nur, dass er den Request abbricht, wenn ich einen weiteren Buchstabe eingebe und dann neu sucht.

          Aber ich habe keine Ahnung wie ich das anstellen soll

          Kommentar


          • #6
            Zitat von sebl89 Beitrag anzeigen
            Im Grunde möchte ich nur, dass er den Request abbricht, wenn ich einen weiteren Buchstabe eingebe und dann neu sucht.

            Aber ich habe keine Ahnung wie ich das anstellen soll
            edit: und es soll auch geprüft werden, ob im Timeout eine weitere Eingabe erfolgt ist.

            Kommentar


            • #7
              http://stackoverflow.com/questions/4...y-ajax-request

              Was das feststellen von änderungen pre-/post-request angeht, speicher es halt ( global - oder besser als data-attribut) zwischen )
              [URL="https://gitter.im/php-de/chat?utm_source=share-link&utm_medium=link&utm_campaign=share-link"]PHP.de Gitter.im Chat[/URL] - [URL="https://raindrop.io/user/32178"]Meine öffentlichen Bookmarks[/URL] ← Ich habe dir geholfen ? [B][URL="https://www.amazon.de/gp/wishlist/348FHGUZWTNL0"]Beschenk mich[/URL][/B].

              Kommentar


              • #8
                Das Script braucht 2-3 Sekunden und dann setzt du noch ein Timeout von 1,5 Sekunden? Was soll den das für ein Autocomplete sein?
                Was mir jetzt auf die schnell aufgefallen ist das du logg nur auf 0 setzt wenn etwas gefunden wurde. Das dürfte schonmal zu Problemen führen.

                und es soll auch geprüft werden, ob im Timeout eine weitere Eingabe erfolgt ist.
                Was ist das Problem? Speichere die Eingabe beim setzen des Timeouts und vergleich sie bei erreichen des Timeouts mit dem aktuellen Wert. Alternativ kannst du auch das aktive Timeout löschen wenn ein neuer Wert eingegeben wurde und ein neues setzen. "window.clearTimeout(...);"

                Kommentar


                • #9
                  Leider sehe ich da noch zu wenig durch..

                  Kannst du mir evtl. zu meinem Code ein kleinen "Denkanstoß" geben?

                  Kommentar


                  • #10
                    Zitat von erc Beitrag anzeigen
                    Das Script braucht 2-3 Sekunden und dann setzt du noch ein Timeout von 1,5 Sekunden? Was soll den das für ein Autocomplete sein?
                    Das soll verhindern, dass die Suche sofort beginnt.

                    Kommentar


                    • #11
                      Aber klar:

                      http://jqueryui.com/autocomplete/
                      http://getbootstrap.com/2.3.2/javascript.html#typeahead

                      Aber ganz wichtig: DB-API optimieren. 3 sekunden response zeit sind ein klares no-go für autocomplete mechaniken.
                      [URL="https://gitter.im/php-de/chat?utm_source=share-link&utm_medium=link&utm_campaign=share-link"]PHP.de Gitter.im Chat[/URL] - [URL="https://raindrop.io/user/32178"]Meine öffentlichen Bookmarks[/URL] ← Ich habe dir geholfen ? [B][URL="https://www.amazon.de/gp/wishlist/348FHGUZWTNL0"]Beschenk mich[/URL][/B].

                      Kommentar


                      • #12
                        Zitat von sebl89 Beitrag anzeigen
                        Das soll verhindern, dass die Suche sofort beginnt.
                        Das ist mir schon klar... aber wenn man zwischen Tippen und Autocomplete anzeigen quasi noch ein Kaffee hollen gehen kann ist das schon ein wenig am Ziel vorbei?!

                        Kommentar


                        • #13
                          Das Problem ist, wenn die Abfrage der DB ca 3 sek dauert und ich in den 3 sek einen neuen Buchstaben eingebe dann das Ergebnis in der Autovervollständigung nicht dem entspricht was ich eingegeben habe.

                          Kommentar


                          • #14
                            Bei der DB Abfrage sollte erst einmal deine Baustelle sein.

                            Stell dir vor dict.cc würde mit seinen 11 mrd dictionary requests würde 3 sekunden beim autocomplete brauchen.. dict.cc wäre längst dicht.
                            [URL="https://gitter.im/php-de/chat?utm_source=share-link&utm_medium=link&utm_campaign=share-link"]PHP.de Gitter.im Chat[/URL] - [URL="https://raindrop.io/user/32178"]Meine öffentlichen Bookmarks[/URL] ← Ich habe dir geholfen ? [B][URL="https://www.amazon.de/gp/wishlist/348FHGUZWTNL0"]Beschenk mich[/URL][/B].

                            Kommentar


                            • #15
                              Hallöchen,

                              Zitat von sebl89 Beitrag anzeigen
                              Das Problem ist, wenn die Abfrage der DB ca 3 sek dauert und ich in den 3 sek einen neuen Buchstaben eingebe dann das Ergebnis in der Autovervollständigung nicht dem entspricht was ich eingegeben habe.
                              Damit eine AutoComplete-Funktion sich auch nützlich und sinnvoll anfühlt, sollten die Vorschläge so schnell wie möglich geliefert werden. Alles andere fühlt sich nur an wie der verzweifelte Versuch dem Nutzer die Eingabe zu vereinfachen. Selbst Google schafft es passende Suchvorschläge in unter 50ms zu liefern. Und da reden wir von exorbitanten Datenmengen.

                              Wie tr0y also bereits mehrfach angedeutet hat, solltest du dringend deine Datenbank-Abfrage oder gar das Design überdenken und überarbeiten.

                              Viele Grüße,
                              lotti
                              [SIZE="1"]Atwood's Law: any application that can be written in JavaScript, will eventually be written in JavaScript.[/SIZE]

                              Kommentar

                              Lädt...
                              X