Wie kann ich ein Ereignis im Eingabetext auslösen, nachdem ich mit dem Tippen/Schreiben aufgehört habe?

Lesezeit: 7 Minuten

Ich möchte ein Ereignis auslösen, kurz nachdem ich aufgehört habe, Zeichen in mein Eingabetextfeld einzugeben (nicht während der Eingabe).

Ich habe es versucht mit:

$('input#username').keypress(function() {
    var _this = $(this); // copy of this object for further usage

    setTimeout(function() {
        $.post('/ajax/fetch', {
            type: 'username',
            value: _this.val()
        }, function(data) {
            if(!data.success) {
                // continue working
            } else {
                // throw an error
            }
        }, 'json');
    }, 3000);
});

Aber dieses Beispiel erzeugt eine Zeitüberschreitung für jedes eingegebene Zeichen und ich bekomme ungefähr 20 AJAX-Anfragen, wenn ich 20 Zeichen eintippe.

Auf dieser Geige Ich demonstriere das gleiche Problem mit einer einfachen Warnung anstelle eines AJAX.

Gibt es dafür eine Lösung oder verwende ich dafür nur einen schlechten Ansatz?

  • Ich fürchte, dass Javascript kein Ereignis bereitstellt, mit dem Sie benachrichtigt werden können, wenn der Benutzer aufhört, in ein Eingabefeld einzugeben. Warum brauchst du das?

    – Darin Dimitrow

    26. Dezember 2012 um 14:51 Uhr

  • geht das aus dem beispiel nicht hervor? Ich möchte ein Ereignis auslösen, “wenn der Endbenutzer aufhört, es einzugeben”, anstatt 20 Anfragen zu senden

    Benutzer1386320

    26. Dezember 2012 um 14:52 Uhr

  • Es gibt keine Möglichkeit festzustellen, wann der Benutzer tatsächlich mit der Eingabe fertig ist, es sei denn, er sendet oder ändert Felder manuell. Woher wissen Sie, ob der Benutzer mitten im Satz pausiert und 5 Minuten wartet, bevor er weiter tippt? Eine mögliche Lösung wäre, .blur() zu verwenden und zu senden, wenn der Fokus des Benutzers das Feld verlässt.

    – Kevin M

    26. Dezember 2012 um 14:53 Uhr


  • Die Kommentare oben sind dumm. Dies ist ein häufiger Anwendungsfall: Ich möchte ein Ereignis, wenn der Benutzer die Größe seines Fensters geändert, die Karte gezoomt, gezogen, eingegeben hat … im Grunde muss jede kontinuierliche Aktion des Benutzers in unser digitales Universum übersetzt werden. Sogar ein einzelner Tastendruck leidet unter diesem Problem: Wenn Sie eine Taste drücken, „springt“ sie tatsächlich und erzeugt nicht nur 1 Tastendruckereignis, sondern viele. Die Hardware oder das Betriebssystem Ihres Computers entfernt diese zusätzlichen Ereignisse, und deshalb haben wir die Illusion diskreter Tastendruckereignisse. Dies wird als “Entprellen” bezeichnet, und das ist es, was das OP benötigt.

    – Ziggy

    6. November 13 um 9:40 Uhr

  • Warnung für reagierende Benutzer: stackoverflow.com/a/28046731/57883

    – Maslow

    8. Dezember 16 um 22:32 Uhr

Wie kann ich ein Ereignis im Eingabetext auslosen nachdem ich
Brad Christie

Sie müssen a verwenden setTimeout (wie Sie), sondern speichern Sie auch die Referenz, damit Sie das Limit immer wieder zurücksetzen können. Etwas wie:

//
// $('#element').donetyping(callback[, timeout=1000])
// Fires callback when a user has finished typing. This is determined by the time elapsed
// since the last keystroke and timeout parameter or the blur event--whichever comes first.
//   @callback: function to be called when even triggers
//   @timeout:  (default=1000) timeout, in ms, to to wait before triggering event if not
//              caused by blur.
// Requires jQuery 1.7+
//
;(function($){
    $.fn.extend({
        donetyping: function(callback,timeout){
            timeout = timeout || 1e3; // 1 second default timeout
            var timeoutReference,
                doneTyping = function(el){
                    if (!timeoutReference) return;
                    timeoutReference = null;
                    callback.call(el);
                };
            return this.each(function(i,el){
                var $el = $(el);
                // Chrome Fix (Use keyup over keypress to detect backspace)
                // thank you @palerdot
                $el.is(':input') && $el.on('keyup keypress paste',function(e){
                    // This catches the backspace button in chrome, but also prevents
                    // the event from triggering too preemptively. Without this line,
                    // using tab/shift+tab will make the focused element fire the callback.
                    if (e.type=='keyup' && e.keyCode!=8) return;
                    
                    // Check if timeout has been set. If it has, "reset" the clock and
                    // start over again.
                    if (timeoutReference) clearTimeout(timeoutReference);
                    timeoutReference = setTimeout(function(){
                        // if we made it here, our timeout has elapsed. Fire the
                        // callback
                        doneTyping(el);
                    }, timeout);
                }).on('blur',function(){
                    // If we can, fire the event since we're leaving the field
                    doneTyping(el);
                });
            });
        }
    });
})(jQuery);

$('#example').donetyping(function(){
  $('#example-output').text('Event last fired @ ' + (new Date().toUTCString()));
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>

<input type="text" id="example" />
<p id="example-output">Nothing yet</p>

Das wird ausgeführt, wenn:

  1. Das Timeout ist abgelaufen, oder
  2. Der Benutzer hat die Felder gewechselt (blur Veranstaltung)

(Welches auch immer zuerst kommt)

  • @Brad: Diese JQuery-Lösung funktioniert gut, außer dass die in das Eingabefeld eingegebene Rücktaste im neuesten Chrome (38.0.2125.111) nicht erkannt wird. Nur umstellen keyup funktioniert. Möglicherweise möchten Sie dies überprüfen und den Code entsprechend ändern.

    – heller Punkt

    30. Oktober 14 um 9:21 Uhr

  • Danke für dieses Plugin – funktioniert super. Ich musste eine Anpassung vornehmen, weil es nicht funktionierte, wenn jemand etwas in das Eingabefeld einfügte. Ich habe die folgende Zeile bearbeitet, um sie einzuschließen paste$el.is(':input') && $el.on('keyup keypress paste',function(e){

    – Matt

    30. Dezember 14 um 18:29 Uhr

  • @ Sangar82: Sollte jetzt (obwohl ich ein wenig verwirrt bin, sollte Strg + V durch Tastendruck erfasst werden – es sei denn, Sie klicken mit der rechten Maustaste -> Einfügen?

    – Brad Christie

    12. Januar 16 um 21:01 Uhr


  • @BradChristie Funktioniert nicht auf Android Chrome im Allgemeinen oder auf Desktop-Chrome, wenn Text mit der ENTF-Taste gelöscht wird

    – rwx

    5. Juni 17 um 14:49 Uhr

  • @KenIngram Semikolon ist, falls es mit anderen Modulen minimiert wird, vermeidet es ungültige Anweisungen (aus unvollständigen vorherigen Skripten). Was den Kontext betrifft, erweitert es die jQuery-Bibliothek, um a hinzuzufügen donetyping Erweiterungsmethode (ähnlich wie .click aus früheren Iterationen von jquery (vorher .on(click', ...) zum Standard werden). Hoffentlich hilft das.

    – Brad Christie

    22. September 17 um 19:23 Uhr


Wie kann ich ein Ereignis im Eingabetext auslosen nachdem ich
Ata ul Mustafa

LÖSUNG:

Hier ist die Lösung. Ausführen einer Funktion, nachdem der Benutzer für eine bestimmte Zeit mit der Eingabe aufgehört hat:

var delay = (function(){
  var timer = 0;
  return function(callback, ms){
  clearTimeout (timer);
  timer = setTimeout(callback, ms);
 };
})();

Verwendung

$('input').keyup(function() {
  delay(function(){
    alert('Hi, func called');
  }, 1000 );
});

  • Kann mir jemand erklären wie das funktioniert? Scheint, als ob das Ausdrucksbit für sofort aufgerufene Funktionen hier die Hauptsache ist, aber ich glaube nicht, dass ich verstehe, was passiert.

    – NulisDefo

    5. November 21 um 14:10 Uhr

  • Warten Sie eine Sekunde … Ist dies als IIFE eingerichtet, nur um die Timer-Variable in einer geschlossenen Weise einzurichten (im Gegensatz zu separat außerhalb der delay Variable? Und danach ist der Rest nur ein normaler Funktionsausdruck?

    – NulisDefo

    5. November 21 um 15:16 Uhr

Sie können underscore.js “debounce” verwenden

$('input#username').keypress( _.debounce( function(){<your ajax call here>}, 500 ) );

Das bedeutet, dass Ihr Funktionsaufruf nach 500 ms nach dem Drücken einer Taste ausgeführt wird. Wenn Sie jedoch vor den 500 ms eine andere Taste drücken (ein weiteres Tastendruckereignis wird ausgelöst), wird die vorherige Funktionsausführung ignoriert (entprellt) und die neue wird nach einem neuen 500-ms-Timer ausgeführt.

Für zusätzliche Informationen verwenden Sie _.debounce(func,timer,wahr) würde bedeuten, dass die erste Funktion ausgeführt wird und alle anderen Tastendruckereignisse innerhalb nachfolgender 500-ms-Timer ignoriert würden.

Sie brauchen Entprellung!

Hier ist ein jQuery-Pluginund hier ist alles, was Sie wissen müssen entprellen. Wenn Sie von Google hierher kommen und Underscore den Weg in die JSoup Ihrer App gefunden hat, hat es entprellt direkt hineingebacken!

Wie kann ich ein Ereignis im Eingabetext auslosen nachdem ich
Gibin Ealias

Sie sollten zuweisen setTimeout zu einer Variablen und verwenden clearTimeout um es auf Tastendruck zu löschen.

var timer="";

$('input#username').keypress(function() {
  clearTimeout(timer);
  timer = setTimeout(function() {
    //Your code here
  }, 3000); //Waits for 3 seconds after last keypress to execute the above lines of code
});

Geige

Hoffe das hilft.

gereinigte Lösung:

$.fn.donetyping = function(callback, delay){
  delay || (delay = 1000);
  var timeoutReference;
  var doneTyping = function(elt){
    if (!timeoutReference) return;
    timeoutReference = null;
    callback(elt);
  };

  this.each(function(){
    var self = $(this);
    self.on('keyup',function(){
      if(timeoutReference) clearTimeout(timeoutReference);
      timeoutReference = setTimeout(function(){
        doneTyping(self);
      }, delay);
    }).on('blur',function(){
      doneTyping(self);
    });
  });

  return this;
};

Es gibt einige einfache Plugin Ich habe genau das gemacht. Es erfordert viel weniger Code als vorgeschlagene Lösungen und ist sehr leicht (~0,6kb)

Zuerst erstellen Sie Bid Objekt als sein kann bumped Jederzeit. Jeden stoßen wird das Feuern verzögern Gebot Rückruf für die nächste angegebene Zeitspanne.

var searchBid = new Bid(function(inputValue){
    //your action when user will stop writing for 200ms. 
    yourSpecialAction(inputValue);
}, 200); //we set delay time of every bump to 200ms

Wann Bid Objekt ist fertig, wir müssen bump es irgendwie. Lassen Sie uns Stoßen anhängen keyup event.

$("input").keyup(function(){
    searchBid.bump( $(this).val() ); //parameters passed to bump will be accessable in Bid callback
});

Was hier passiert ist:

Jedes Mal, wenn der Benutzer die Taste drückt, wird das Gebot für die nächsten 200 ms „verzögert“ (angestoßen). Wenn 200 ms vergehen, ohne dass ein erneuter „Bumping“ erfolgt, wird ein Rückruf ausgelöst.

Außerdem haben Sie 2 zusätzliche Funktionen zum Stoppen des Gebots (wenn der Benutzer z. B. Esc gedrückt oder außerhalb der Eingabe geklickt hat) und zum Beenden und sofortigen Auslösen des Rückrufs (z. B. wenn der Benutzer die Eingabetaste drückt):

searchBid.stop();
searchBid.finish(valueToPass);

.

753350cookie-checkWie kann ich ein Ereignis im Eingabetext auslösen, nachdem ich mit dem Tippen/Schreiben aufgehört habe?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy