2017-12-31 111 views
1

Ich habe es mit einem seltsamen Problem zu tun, wo ich einen Event-Handler bei Instanziierung eines Moduls binden muss, aber wenn das Modul mit einem Klick oder einem Tastendruck beendet wird, möchte ich das nicht mehr globale Ereignisgrenze Ich habe das Click-Ereignis erhalten, um die Beendigung des Moduls an anderer Stelle im Code zu registrieren, und das funktioniert, aber das Problem ist die Escape-Taste, dass ich das Modul global beenden möchte, unabhängig davon, wo sich mein Benutzer gerade in der App befindet.Fenster Ereignishandler nach einmaligem Auslösen entfernen

Mein Problem ist, dass die .off() scheint nicht unter den gegebenen Umständen zu arbeiten.

let tools = {}; 
//how can i eliminate this next line of code after escape has been triggered? 
$(window).on('keydown', (e)=>escape(e, tools)); 
function escape(e, tools){ 
    if (e.which==27){ 
     //do some stuff with tools, etc 
     $(window).off('keydown', $(window), escape); //this line doesn't seem to work 
     alert('alert triggered, but next time escape is pressed it wont.'); 
    } 
} 

Bin ich über diesen Ansatz falsch? Ich habe versucht, es an das div-Element selbst zu binden, aber das hat viel mehr mit der Fokussierung des Div zu tun, um die Tasten zu erhalten, und wenn der Benutzer zu einem anderen Modul navigiert, wird die Flucht nicht mehr ausgelöst, weil dieses Modul nicht mehr Fokus haben, und gut, usw. usw. usw.

Danke!

Hier Geige: https://jsfiddle.net/rbfebL5y/1/

+0

Um zusätzliche Informationen hinzuzufügen, sollte die Warnung nur einmal ausgelöst werden, aber im obigen Beispiel wird weiterhin ausgelöst. Das ist das Problem, vor dem ich stehe. – simon

Antwort

2

Verwenden Sie nur Handler-Funktion als Argument nach documentation:

let tools = {}; 
//how can i eliminate this next line of code after escape has been triggered? 
$(window).on('keydown', escape); 
function escape(e){ 
    if (e.which==27){ 
     //do some stuff with tools, etc 
     $(window).off('keydown', escape); 
     alert('alert triggered, but next time escape is pressed it wont.'); 
    } 
} 
+1

Sie könnten in Betracht ziehen, die '// Diese Zeile scheint nicht zu arbeiten' Bit, wie es Ihre Antwort eher verwirrend macht – DelightedD0D

+0

Antwort für diese funktioniert. Aktualisieren Sie das jsFiddle nur, wenn Sie es auf den gleichen Code aktualisiert haben. –

+0

Entfernen meiner akzeptierten Antwort. – simon

1

Sie könnten localstorage verwenden:

// check key pressed and whether we've done this before 
if (e.which==27 && !localStorage.getItem('hasLoggedEscape')){ 
    // set the local storage value saying we've done this before 
    localStorage.setItem('hasLoggedEscape', 1); 
    //do some stuff with tools, etc 
} 

später, wenn Sie diese zurücksetzen wollen, tun

localStorage.removeItem('hasLoggedEscape');

+0

Ihre Antwort zu verbessern, aber ich vermeide lokalen Speicher für jetzt. Wenn dies meine einzige Route ist, akzeptiere ich. Grund dafür ist, dass ich ein staatlicher Nazi bin und der Umgang mit der lokalen Speicherung einen Staat anderswo hält. Ich bin verwirrt, warum $ (window) .off scheint nicht zu arbeiten. oder wenn das eine Einschränkung von .off() selbst ist. – simon

+1

@simon, wenn der Benutzer die Escape-Taste drückt und dann die Seite neu lädt. und drückt dann wieder die Flucht, sollte das Ereignis das zweite Mal feuern, oder nein? – DelightedD0D

+0

ja @ DelightedD0D – simon

Verwandte Themen