2016-10-05 3 views
0

Ich habe lange gekämpft, um meinen Code zum Laufen zu bringen, und habe verschiedene Antworten auf StackOverflow versucht, die alle im Allgemeinen die gleiche Form annahmen. Irgendwann habe ich auf diese angesiedelt:Warum ist dieser Code nicht zum Erfassen/Verhindern von STRG + S in jquery/javascript funktioniert?

$(window).bind('keydown',function(e) { 
    if ((e.which=='115' || e.which=='83') && (e.ctrlKey || e.metaKey)){ 
     e.preventDefault(); 
     saveForm(); // Uses AJAX to save all the data in my form 
     return false; 
    } 
} 

Das Problem ist, dass egal, was ich so weit wie Kombinationen der Bindung an Fenster versucht, ein Dokument keydown, keypress, nichts funktioniert, und der Dialog speichern kommt sowieso auf.

Antwort

1

Da ich die Funktion saveForm() Funktion beim Auslagern der Seite verwenden, um sicherzustellen, dass Daten vor der Navigation gespeichert werden, musste ich die Ajax-Funktion asynchron festlegen. Dies bedeutete, dass es eine Race-Bedingung zwischen dem Speichern und dem Erreichen der return false-Anweisung gab, die, als ich den saveForm()-Aufruf auskommentierte, das Ding zu sein schien, das funktioniert (ich weiß nicht, warum preventDefault es nicht aufhörte, aber es tat es nicht).

die Race-Bedingung zu lösen, als ich eine Variable Einstellung zu wählen, wenn die synchron oder asynchron zu tun, speichern aber erkannte ich durch Verzögerung der bis nach dem ich voll und ganz die CTRL + abgesagt hatte speichern völlig die Race-Bedingung vermeiden könnte S Tastenkombination. Hier ist die letzte Version von meinem Code, das funktioniert:

$(window).bind('keydown',function(e) { 
    if ((e.which=='115' || e.which=='83') && (e.ctrlKey || e.metaKey)){ 
     e.preventDefault(); 
     setTimeout(function(){saveForm();},200); 
     return false; 
    } 
} 

Damit die preventDefault und return false beide sofort ausführen und meine speichern Pops in wenigen Millisekunden später.

Verwandte Themen