2017-10-09 2 views
0

Ich habe ein Eingabefeld mit Ajax-Aufruf (füllen einige andere Eingabefelder) auf Blur und Schaltflächen mit Click-Ereignisse (einige der Click-Ereignisse setzen Eingabefelder auf eine leere Zeichenfolge). Zum BeispielSo vermeiden Sie Ajax Async bei Verwendung von Jquery-Ereignissen

$("#input_field1").on('blur', function() { 
       $.ajax({ 
        //async:false, 
        method: "GET", 
        url: "my_ajax.php", 
        cache: false, 
        dataType: "json", 
        data: { data1: $("#input_field1").val()}, 
        success: function(result){ 
         $("#some_other_input").val(result.data2); 
        } 
       }) 
      }); 
$("#button1").on('click', function() { 
       $("#input_field1").attr("readonly", true); 
       var form = $("#my_form"); 
       form.validate().resetForm(); 
       form[0].reset();//form contains #some_other_input 
      }); 

Wenn das Eingabefeld fokussiert wird und dann Benutzer klickt auf eine beliebige Taste, Unschärfe-Ereignis ausgelöst und natürlich nach dem entsprechenden Click-Ereignis. Wenn ich async: false nicht verwende, füllt ajax diese Eingabefelder, nachdem das click -Ereignis verarbeitet wurde und andere Eingaben gefüllt werden, anstatt leer zu sein.

Lesen über async: false sollte immer vermieden werden, ich brauche einen Weg für meine Klickereignisse zu warten, bis Ajax fertig ist, wenn es in diesem Moment einen Ajax-Aufruf gibt.

+0

Erster A in AJAX steht für Asynchronous. Was genau willst du machen? – Walk

+0

Sie müssen * async * umarmen, anstatt damit zu kämpfen. Dies könnte bedeuten, dass Sie überdenken, wie Ereignisse zusammenarbeiten, oder ob Sie während der Verarbeitung möglicherweise Tasten deaktivieren, oder dass Sie einen "Bitte warten" -Stilblock aufstellen müssen. –

+0

Das Deaktivieren der Schaltfläche während der Verarbeitung von Ajax führt dazu, dass das Klickereignis nicht ausgelöst wird. Ich brauche wirklich Benutzer in der Lage zu sein, auf einen Knopf zu klicken, gleich nachdem input_field1 gefüllt ist. –

Antwort

0

Sie benötigen eine Parallelitätsprüfung für Ihre Fälle. Auf Ihrer blur Aktion; Überprüfen und legen Sie einen Wert fest, um zu verhindern, dass die anderen Anrufe erneut eingegeben werden.

Auch während einer Ajax-Anfrage müssen Sie verhindern, dass Sie auf die Schaltflächen klicken.

Noch eine Sache: Was passiert, wenn der Benutzer nach dem Verwischen des Eingabefeldes die Eingabe neu fokussiert und neu fokussiert? In diesem Fall wird Ihre Aktion zweimal ausgelöst.

Als Ergebnis müssen Sie mit Nebenläufigkeit umgehen. Es gibt auch einige Javascript-Bibliotheken, um die Parallelität zu behandeln. Sie können sie entweder verwenden oder selbst behandeln.

Wie auch immer Ihren Fall zu behandeln, hier ist ein Beispielcode:

let hasCall = false; 

$("#input_field1").on('blur', function() { 
    if(hasCall){ 
    return; //there is an active call... 
    }else{ 
    hasCall = true; 
    $("#button1").prop('disabled', true);//prevent clicking on button 
    } 
    $.ajax({ 
    //async:false, 
    method: "GET", 
    url: "my_ajax.php", 
    cache: false, 
    dataType: "json", 
    data: { data1: $("#input_field1").val()}, 
    success: function(result){ 
     $("#some_other_input").val(result.data2); 
    } 
    }).always(()=>{ 
     //reset the state: 
     hasCall=false; 
    $("#button1").prop('disabled', false); 
    }); 
}); 
$("#button1").on('click', function() { 
    $("#input_field1").attr("readonly", true); 
    var form = $("#my_form"); 
    form.validate().resetForm(); 
    form[0].reset();//form contains #some_other_input 
}); 
+0

Vielen Dank für Ihre Antwort. Wenn das Eingabefeld direkt nach dem Bluring neu ausgerichtet wird, führt die erneute Fokussierung und erneute Fokussierung der Eingabe zu keinem Problem, da die Eingabe den gleichen Wert hat, sodass eine neue Ajax-Anfrage kein Problem darstellt. In Ihrem Code gibt es keinen Aktivierungsknopf und es ist unmöglich für den Benutzer auf eine Schaltfläche zu klicken, wenn input_field1 fokussiert wurde. In meinem Kommentar zu meiner eigenen Frage habe ich erklärt, wie ich diesen Konflikt lösen konnte, indem ich mousedown-Ereignis verwendete, das in irgendeiner Weise Logik zu Ihrem verwendet: Variable auf True setzen, aber nicht wenn es einen Ajax-Aufruf gibt oder nicht . –

+0

Es verhindert nicht das Klicken auf die Schaltfläche, während die Eingabe fokussiert wurde. Es verhindert das Klicken auf die Schaltfläche kurz bevor die Ajax-Anforderung gestartet wurde und aktiviert sie unmittelbar nachdem die Ajax-Anforderung beendet wurde. – ykaragol

Verwandte Themen