2016-07-19 22 views
0

Dies ist eine komplette Überarbeitung meiner Ausgangsfrage, alle nicht benötigten Ressourcen und Referenzen gelöscht wurdenein prevent Verwenden Sie aus der Schleife zu erhalten, nachdem drücken Enter-Taste

Ich binden das gleiche Ereignis-Listener 2 verschiedene Elemente : eine Taste und Enter-Taste, und es sieht wie folgt aus:

var funcelement = function(){ 
    //function code 
}; 


$('#buttonID').click(funcelement); 


$('#inputID').keyup(function() { 
    if (event.which == 13) { 
     $('#buttonID').trigger('click'); 
    } 
}) 

Was Ausbreitung der Enter-Taste drücken zu tun, ich versuche zu verhindern, ist, wenn der Fokus auf der Submit-Button (#buttonID) unter Verwendung von prevent ist().

Also habe ich verschiedene Kombinationen ausprobiert, damit es funktioniert. Hier finden Sie das neueste Ergebnis auf meinen Versuchen

$('#inputID').keyup(function() { 
    var hasfocus = $('#buttonID').is(':focus') || false; 

    if (event.which == 13) { 
     if (!hasfocus) { 
     event.preventDefault(); 
     $('#buttonID').trigger('click'); 
     //hasfocus = true; 
     } 

     else { 
     //event.preventDefault(); 
     //$('#buttonID').trigger('click'); 
    } 

    } 
}) 

Nachdem ich einen Text in ein Eingabefeld eingeben, und drücken Sie Enter-Taste, um ein Bestätigungsfenster mit Ja/Abbrechen Tasten erscheint mit Fokus auf Ja. Sobald ich erneut die Eingabetaste drücke, erscheint ein weiteres Fenster, in dem bestätigt wird, dass die Änderungen vorgenommen wurden, mit der Ok-Taste, die darauf fokussiert ist. Sobald ich wieder Enter drücke, wird alles gemacht, was ich brauche.

Es gibt jedoch ein Problem: nach dem letzten Schritt gehe ich zurück zur if (! Hasfocus) Zeile.

Wie verhindere ich das? Sobald das Zeug, das ich brauche, fertig ist - will ich nicht noch einmal in diese Zeile gehen.

+0

Ich finde, dass 'stopPropagation' ist fast immer eine schlechte Wahl. Es tötet die Ereignisdelegation und verbirgt viele Probleme, die zu Wettlaufbedingungen führen könnten. – zzzzBov

+0

@zzzzBov Dann sollte ich nach Alternativen suchen, wie StopBubble? –

+0

.focus() ist eine Funktion, die den Fokus auf dieses Element setzt. Um einfach zu prüfen, ob der Fokus auf einem Element liegt, hat jquery den ": focus" -Selektor. Benutze es so: $ ('# buttonID'). Is (': focus') – Cameron637

Antwort

1

Sie einen Parameter an die Funktion übergeben können und die Ausbreitung dort stoppen, wie so:

var funcelement = function(event, wasTriggeredByEnterKey){ 
    if (wasTriggeredByEnterKey && $('#buttonID').is(':focus')) { 
     event.stopPropagation; 
    } 

    //function code 
}; 


$('#buttonID').click(funcelement); 



$('#inputID').keyup(function() { 
    if (event.which == 13) { 
     $('#buttonID').trigger('click', [true]); 
    } 
    } 
) 

UPDATE

Um Ihre überarbeitete Ausgabe zu beantworten, sollten Sie die „keydown“ verwenden Ereignis statt "keyup" bei der Arbeit mit Warnungen. Dies liegt daran, dass Alerts mit dem "keydown" -Ereignis schließen, aber Sie immer noch das "keyup" -Ereignis auslösen, wenn Sie die Eingabetaste loslassen. Ändern Sie einfach das eine Wort wie folgt:

$('#inputID').keydown(function() { 
    var hasfocus = $('#buttonID').is(':focus') || false; 

    if (event.which == 13) { 
     if (!hasfocus) { 
     event.preventDefault(); 
     $('#buttonID').trigger('click'); 
     //hasfocus = true; 
     } 

     else { 
     //event.preventDefault(); 
     //$('#buttonID').trigger('click'); 
    } 

    } 
}) 
+0

Musste für ein bisschen ausgehen, Entschuldigung für die späte Antwort. Ich ging genau so wie du gezeigt hast, aber es blockiert die Eingabetaste. –

+0

Ich habe meine Antwort bearbeitet, lassen Sie mich wissen, ob das für Sie funktioniert. – Cameron637

+0

Ich habe es versucht, es geht nie in event.stopPropagation; –