Wie kann ich den Pass Through-Modus in Pentadactyl beenden, wenn die Escape-Taste erfasst wird?

658
Doorknob

Schritte zum Reproduzieren:

  1. Besuchen Sie diese Seite . Es ist eine JSFiddle, die vollständig aus besteht

    window.onkeydown = function(e) { e.preventDefault(); }; 
  2. Klicken Sie in den grauen Bereich unter der weißen oberen Leiste, um den Hauptbereich zu aktivieren.

  3. Drücken Sie Ctrl+ Z, um den Durchleitungsmodus aufzurufen.

  4. Drücken Esc. Dies wird fehlschlagen, da der Schlüssel von JavaScript abgefangen und niemals an Pentadactyl gesendet wird.

Im Beispiel lässt sich dies leicht abmildern, indem Sie auf die obere Leiste klicken, um den Fokus vom Bereich weg zu verschieben, in dem onkeydownEscape den Passthrough-Modus durchläuft und beendet. Ich arbeite jedoch mit einer Website, die alle Tastendrücke (mit preventDefault) über abfängt window.onkeydown, so dass der Fokus nirgendwohin verlagert werden kann .

Die einzige Lösung, die ich finden konnte, ist, eine neue Registerkarte zu erstellen und sie dann zu schließen ( d). Dies erfordert jedoch die Verwendung der Maus (da die tVerknüpfung nicht mehr funktioniert, da wir uns im Durchreichmodus befinden), und es ist eine harte Workaround.

Gibt es eine Möglichkeit, den Pass-Through-Modus nur mit der Tastatur auf einer Website zu beenden, die alle Tastendrücke abfängt?

2

1 Antwort auf die Frage

2
pyrocrasty
  • Auf der JSFiddle verknüpfen Sie zumindest Ctrl- TABund Ctrl- Shift- TABnoch Funktion, so dass Sie auf den nächsten Reiter wechseln und Pass - Through - Modus zu beenden zurück. Aus irgendeinem Grund können Sie immer noch nicht auf die Befehlszeile zugreifen, aber andere Tasten funktionieren, sodass Sie die Seite jederzeit aktualisieren können, um das Problem rzu beheben.

  • Als weniger hackhafte Lösung können Sie einen Befehl in Ihrer .pentadactylrc-Datei definieren, um zu verhindern, dass die Seite die wichtigsten Ereignisse stiehlt:

    command! nointercept -js document.addEventListener('keydown', function(e) { e.stopImmediatePropagation(); return false;}, true); 

    Wenn Sie dann :nointerceptauf der Seite ausführen, bevor Sie auf den Hauptbereich klicken, können Sie den Passthrough-Modus deaktivieren. Bei dieser Methode funktioniert die Befehlszeile normal, nachdem der Passthrough-Modus verlassen wurde.

    Wenn Sie nur die Seite stoppen möchten, die den EscSchlüssel abfängt, können Sie den zu prüfenden Befehl ändern e.keyCode===27.

  • Wenn Sie den obigen Code automatisch anwenden möchten, können Sie ihn in ein Benutzerskript umwandeln (erfordert Greasemonkey, wie Sie wahrscheinlich wissen). Das Folgende sollte funktionieren, wenn Sie nachher die richtigen URLs oder URL-Muster eingeben@include

    // ==UserScript==  // @name nointercept // @description Prevent site from stealing key presses  // @run-at document-start // @include http://site.url   // ==/UserScript==   document.addEventListener( 'keydown', function(e) { e.stopImmediatePropagation(); return false; }, true );