2017-09-07 2 views
1

Ich stoße auf eine Situation in Chrome, wo ein einzelner Ajax-Anruf mehrmals ausgeführt wird (20 Mal, um genau zu sein).jQuery Ajax-Anruf mehrmals ausgeführt - Chrome-Browser

Ich habe ein Eingabefeld, das ausgelöst wird, wenn Sie 5 Ziffern in das zip-Feld eingeben.

Ich versuche, eine Postleitzahl/Statusüberprüfung in meinem Ajax-Anruf durchzuführen.

Ich kreuze Domains.

Der Code funktioniert in Firefox korrekt. Es macht den einzelnen Anruf und führt die richtige Wartung durch (siehe Code). Die Wartung ist nicht wichtig. Es weist einen Titelwert zu oder ändert eine Klasse. Nichts, was dazu führen sollte, dass mein Ajax-Ruf mehrmals ausgeführt wird.

Ich habe meinen Code überprüft. Es wird nicht 20 Mal aufgerufen.

Ich habe Zähler in meinen Code gesetzt, um zu sehen, ob die Funktion mehrmals aufgerufen wird und nur einmal ausgeführt wird.

Der Grund für die onKeyUp und onInput war zu behandeln, wenn jemand in das Feld eingegeben, oder doppelklicken Sie darauf und einen zwischengespeicherten Wert verwendet.

In der Chrome-Version 60.0.3112.113 wird der Ajax-Aufruf also 20 Mal ausgeführt, und am 21. wird er selbst abgebrochen.

Ich benutze auch jQuery anstelle von $ weil es anderen Code gibt, den ich habe keine Kontrolle über.

Alle und alle Hilfe wäre willkommen. Wenn ich etwas vermisse, lass es mich wissen.

Hier ist das Eingabefeld Code:

<input id="zipPostal" name="zipPostal" type="text" placeholder="Postal Code" onkeyup="zipValid1()" oninput="zipValid1()" /> 

Hier ist der jQuery-Code:

 function zipValid1(){ 

     var x = jQuery("#zipPostal").val(); 
     if (x != '00000' && x.length == 5){ 
      jQuery.ajax({ 
       url: 'https://myurl/getzip.cfm', 
       type:'POST', 
       crossDomain:true, 
       data: {zipcode: x}, 
       success: function(data){ 
        if (data.trim() == 'Invalid'){ 
        (perform CSS and JS maintenance) 
        }      
        else{ 
        (perform CSS and JS maintenance) 
        } 
       } // closes Success 
      }); // ajax 
     } 
     else{ 
      (perform CSS and JS maintenance) 
     } 
    }; 
+0

Interessant. Haben Sie versucht, die Tasten mit '$ (document) .unbind ('keypress') erneut zu binden. Bind ('keypress', function (e) {});'? Siehe [** dieser Beitrag **] (https://stackoverflow.com/questions/7987454/input-fires-keypress-event-twice) und auch [** dieser ** **] (https://stackoverflow.com/questions/2387316/jquery-textbox-keyup-feuernd-zweimal). –

Antwort

0

Ihre Funktion zipValid1 auf jedem keyup und Eingabe aufgerufen wird, die bei der Eingabe zweimal für jedes Zeichen genannt wird Sie tippen in die Eingabe ein.

Ein Standardansatz zur Behebung dieses Problems besteht darin, die aufgerufene Funktion zu entprellen, bis der Benutzer die Eingabe beendet hat.

Dies ist eine beliebte jQuery-Bibliothek, um mit diesem Problem zu helfen. http://benalman.com/projects/jquery-throttle-debounce-plugin/

Hier ist ein einfaches Beispiel der Entprellung der Funktion und warten bis 500ms, nachdem der Benutzer die Eingabe beendet hat.

var timeout; 

function zipValid1() { 
    clearTimeout(timeout); 
    timeout = setTimeout(function() { 
    var x = jQuery("#zipPostal").val(); 
    if (x != '00000' && x.length == 5) { 
     jQuery.ajax({ 
     url: 'https://myurl/getzip.cfm', 
     type: 'POST', 
     crossDomain: true, 
     data: { 
      zipcode: x 
     }, 
     success: function(data) { 
      if (data.trim() == 'Invalid') { 
       // (perform CSS and JS maintenance) 
      } else { 
       // (perform CSS and JS maintenance) 
      } 
      } // closes Success 
     }); // ajax 
    } else { 
     // (perform CSS and JS maintenance) 
    } 
    }, 500); 
} 
+0

Hallo Itodd - Danke für den Vorschlag, es zu ändern. Ich mache mir keine Sorgen, dass es viel läuft, einfach weil die Person nur eine 5-stellige Postleitzahl eingeben muss und die Funktion nur ausgeführt wird, wenn 5 Ziffern eingegeben werden. Das Gewicht eines anderen JS-Skripts im Vergleich zu einer Funktion wird 5-mal getroffen und nur einmal ausgeführt ist vernachlässigbar. Aber ich werde Ihren Entprellt-Skript-Vorschlag in meiner Toolbox behalten. Irgendwelche Ideen, was dazu führen würde, dass Chrome den Ajax-Teil 20-mal laufen lässt? – Doug

Verwandte Themen