Jak zabronić kradzieży skrótów klawiaturowych przez strony internetowe w Firefoksie


57

Wiele stron internetowych, zwłaszcza wszystko z edycją tekstu sformatowanego (ta strona jest również winna), kradnie skróty klawiaturowe zwykle używane do sterowania Firefoksem i zamiast tego sprawia, że ​​robią coś innego. To jest całkowicie irytujące, kiedy naciskam coś takiego jak numer Cmd, Cmd-L, Cmd-T lub Cmd-K i nie robi tego, co chcę. Czy mogę to zatrzymać?

Właściwie byłoby najlepiej, gdybym mógł zabronić kradzieży wszystkich skrótów Cmd- *. Nigdy nie widziałem ich użytych do niczego użytecznego. Czy to możliwe?


4
Zgadzam się, to irytujące. FogBugz ma bardzo dobrą implementację skrótów klawiaturowych. CTRL-;przechodzi w tryb skrótów i podświetla wszystkie polecenia widoczne na ekranie za pomocą dostępnych skrótów. Każdy skrót jest kombinacją, więc nowa sprawa jest CTRL-; Ni edycja jest CTRL-; E. Bardzo łatwo się przyzwyczaić i zero konfliktów. Chciałbym, aby więcej stron używało czegoś takiego, ponieważ jest to łatwiejsze dla użytkownika i nie zastępuje skrótów przeglądarki. Szkoda, że ​​SuperUser tego nie robi, ponieważ pochodzi od tych samych ludzi co FogBugz.
Sam



W pracy odwiedzam wiele stron intranetowych, które w jakiś sposób psują cmd + N, więc nigdy nie mogę otwierać nowych okien przeglądarki z klawiatury! Tak denerwujące!
Nicolas Miari

1
Po około 12 latach Mozilla ustabilizowała dość rozsądną poprawkę. Jest dobrze ukryty i niedoskonały, ale może uratować twoje zdrowie psychiczne. Proszę zobaczyć moją odpowiedź tutaj: superuser.com/a/1317514/158390
Lambart

Odpowiedzi:


24

Dzięki nowej @run-atwłaściwości Greasemonkey jest to teraz możliwe!

Inspirację czerpałem z tego skryptu i skryptu, aby połączyć je w skrypt użytkownika, który skutecznie przechwytuje skróty klawiaturowe Ctrl+ Ti Ctrl+ S. Testowałem w Firefox 17 ESR i Firefox 25.

// ==UserScript==
// @name           Disable Ctrl+s and Ctrl+t interceptions
// @description    Stop websites from highjacking keyboard shortcuts
//
// @run-at         document-start
// @include        *
// @grant          none
// ==/UserScript==

// Keycode for 's' and 't'. Add more to disable other ctrl+X interceptions
keycodes = [83, 84];  

(window.opera ? document.body : document).addEventListener('keydown', function(e) {
    // alert(e.keyCode ); //uncomment to find more keyCodes
    if (keycodes.indexOf(e.keyCode) != -1 && e.ctrlKey) {
        e.cancelBubble = true;
        e.stopImmediatePropagation();
    // alert("Gotcha!"); //ucomment to check if it's seeing the combo
    }
    return false;
}, !window.opera);

1
To było bardzo pomocne. Użytkownicy OS X powinni zamienić się e.ctrlKeyna e.cmdKeyi e.cmdKey && e.shiftKeyodzyskać większość ich skrótów w przeglądarce.
JamesGecko

Ten skrypt działa dla mnie, aby naprawić CTRL + TAB poprzez dodanie 9do tablicy klawiszy. Dzięki!
Mike Mueller,

@JamesGecko Dzięki tej odpowiedzi powinieneś / powinnaś użyć e.metaKey jako klawisza polecenia.
riezebosch

3
Ten kod działa! Pamiętaj, że filtruje nie tylko Ctrl + klawisz, ale także Ctrl + Alt + klawisz, Ctrl + Shift + klawisz i Ctrl + Alt + Shift + klawisz, ponieważ sprawdza tylko stan modyfikatora Ctrl.
RomanSt

Pierwsze pytanie: dlaczego skrypt, który podobno działa w przeglądarce Firefox, sprawdza, czy przeglądarka to Opera? I drugie pytanie: komentarz zawiera kody znaków dla „s” i „t”, ale tak naprawdę są to kody dla „S” i „T”. Czy z jakiegoś powodu muszę podać kod wielkiej litery? Dzięki.
Douglas odbył się

8

11 lat po zgłoszeniu błędu Mozilla wreszcie zaczęła pracować nad tym popularnym żądaniem funkcji i wydaje się, że teraz działa dobrze (testowane w przeglądarce Firefox 66.0.3 / Ubuntu).

(Podziękowania dla @PerJohansson za zwrócenie uwagi, że znacznie utrudniają znalezienie tego ustawienia od FF 59.)

Możesz wyłączyć skróty witryny, wykonując następujące kroki:

  1. Kliknij (i)ikonę na pasku lokalizacji
  2. Kliknij małą strzałkę ( >) po prawej stronie pozycji statusu „Połączenie”.
  3. Teraz powinieneś zobaczyć More Informationna dole. Kliknij to, a w końcu przejdziesz do Page Infookna dialogowego.
  4. Na koniec przejdź do Permissionskarty i dostosuj Override Keyboard Shortcutsustawienie.

Oto kilka ostatnich zrzutów ekranu (maj 2019) dla każdego kroku:

Zrzut ekranu okna dialogowego Informacje o witrynie Firefox

Zrzut ekranu okna dialogowego Zabezpieczenia witryny Firefox

Zrzut ekranu karty Uprawnienia przeglądarki Firefox

Jeśli interesuje Cię historia tej poprawki, oto powiązane bilety Mozilli: https://bugzilla.mozilla.org/show_bug.cgi?id=380637 i https://bugzilla.mozilla.org/show_bug.cgi ? id = 1445942


2
W przeglądarce Firefox 64 (nie wiem, gdzie się pojawiła) musisz kliknąć „Połączenie” => „Więcej informacji”, aby uzyskać dostęp do tego pola idalog. Koło zębate uprawnień przechodzi do Preferencji, co nie jest właściwym miejscem.
Per Johansson

Dzięki @PerJohansson, zaktualizowałem bilet.
Lambart

Jaka jest about:configopcja zmiany wartości domyślnej? Chcę zmusić wszystkie strony, aby nie mogły podłączyć się do mojej klawiatury
inetknght

5

Obszerne badania pokazują, że od obecnej wersji Firefoksa (3.6.x) jest to niemożliwe - wszystkie kluczowe konflikty wiążące są rozwiązywane według priorytetów: System> Strona internetowa> Firefox - to raczej głupie zamówienie. Żaden z dodatków, których próbowałem, nie wydaje się w stanie tego naprawić.

Być może stanie się to wykonalne w przyszłych wersjach, ale teraz odpowiedź brzmi - Niemożliwe.


1
Korzystanie z FF 30.0 prawie 4 lata później i nadal jest to problem. Spróbuję pomysłu Martina Greasemonkeya.
LGT

2
Korzystanie z FF 53.0 prawie 8 lat później i nadal jest to problem.
Daniel

5

Ponieważ wydaje się, że problem polega na tym, że zdarzenia klawiatury JavaScript kradną naciśnięcia klawiszy, czy nie byłoby możliwe zbudowanie skryptu JavaScript (do użycia za pomocą Greasemonkey), który odłączy wszystkie zdarzenia klawiatury, przywracając w ten sposób prawidłowe użycie każdego skrótu do przeglądarki?

Nie jestem pewien, czy jest to wykonalne, ale ktoś z większym doświadczeniem w JavaScript / Greasemonkey może być w stanie pomóc (warto zapytać o SO).


2
Działa to poprzez mechanizm onKeyPress - Firefox wysyła najpierw każde naciśnięcie klawisza do strony internetowej, a następnie sprawdza je dopiero wtedy, gdy nie zostało anulowane lub przechwycone. Możliwa jest magia Greasemonkey, która przechwytuje naciśnięcia klawiszy przed witryną i jakoś bezpośrednio uruchamia funkcje firefox, ale nie jest to oczywiste.
taw

4

Problem polega na tym, że każda strona może uruchamiać Javascript, który konfiguruje moduł obsługi zdarzeń w celu przechwytywania zdarzeń związanych z naciśnięciem klawisza, a elementy sterujące javascript w Firefoksie nie są wystarczająco szczegółowe, aby zatrzymać je bez naruszenia innych funkcji javascript.

Jedynym sposobem, aby temu zapobiec, jest wyłączenie Javascript (Narzędzia -> Opcje, karta [Treść], odznacz Włącz JavaScript ). Możesz też wyłączyć Javascript dla poszczególnych witryn z rozszerzeniem takim jak NoScript.

Firefox pozwala zapobiegać niektórym zastosowaniom Javascript, takim jak przenoszenie / zmiana rozmiaru okien, zmiana lub wyłączenie menu kontekstowego itp .; ale nic nie stoi na przeszkodzie, aby strony internetowe przechwytywały zdarzenia związane z klawiaturą.

Może istnieje rozszerzenie, które daje ten poziom kontroli - nie znam go.
Istnieją opcje Javascript , ale to rozszerzenie nie jest już aktualizowane.


2
Opcje Javascript i kilka innych rozszerzeń, które próbowałem, nie obsługują tego. Zablokowanie całego javascript sprawiłoby, że sieć byłaby praktycznie bezużyteczna, tak naprawdę nie jest to opcja.
taw

0

Prawdopodobnie wtyczki innych firm skupiają się na głównym oknie przeglądarki. W takim przypadku wejście klawiatury (oprócz przerwań) zostanie przechwycone przez wtyczkę. Jeśli ci się nie podoba, zawsze możesz usunąć szkodliwe wtyczki (przypuszczam, że to flash).


3
Flash też to robi, ale zwykły Javascript potrafi ukraść skróty. Rozpocznij nowe pytanie tutaj i naciśnij Cmd-L (Ctrl-L na komputerach innych niż Mac) w oknie tekstowym pytania. Zamiast przechodzić do paska adresu URL tak, jak powinien, skrót zostanie skradziony i zobaczysz okno dialogowe wstawiania hiperłącza. Kiedyś było to rzadkie, ale ostatnio zbyt wiele stron zaczęło to robić.
taw

Właśnie wypróbowałem to na Windows 7 z Firefoxem i przeskoczyłem bezpośrednio do paska adresu, jak zwykle.
Daisetsu

Przepraszam, nie byłem jasny - dzieje się tak tylko wtedy, gdy wybrane jest okno dialogowe z bogatym polem tekstowym. Czy ty to zrobiłeś? Testowałem na OSX z Firefox, Opera, Safari i Chrome. We wszystkich czterech normalnie Cmd-L przeskakuje na pasek adresu URL (a Ctrl-L nic nie robi). Podczas edycji treści pytania zarówno Cmd-L, jak i Ctrl-L wyświetlają zamiast tego okno dialogowe hiperłącza.
taw

Wygląda na to, że masz rację. Nie mam pojęcia, jak temu zapobiec. :( To interesujące pytanie teraz, więc głosuję na twoje pytanie. Jeśli nikt nie odpowie na nie, naliczę za to nagrodę.
Daisetsu

Problem nie dotyczy wtyczek. Wtyczki same w sobie stanowią oddzielny problem. I w końcu inny problem. We wtyczkach wszystko jest kradzione przez wtyczkę, ponieważ jest to osobna jednostka. W przypadku JavaScript interfejs użytkownika firefox to JavaScript i ma własne powiązania, ale witryny mogą definiować powiązania na tym samym poziomie. Jak dotąd, nie ma jeszcze żadnego mechanizmu, aby temu zapobiec.
njsg 18.01.2013

0

Po wielu testach w różnych przeglądarkach łatwiej jest przechwytywać klawisze, gdy są one wciśnięte (nie naciśnięte), ponieważ niektóre z tych „zintegrowanych klawiszy aplikacji” są trudne do przechwycenia ze zdarzeniem „naciśnięcie klawisza”.

Wymyśliłem ten skrypt, który jest w pewnym stopniu kompatybilny z wieloma przeglądarkami (nie testowałem IE Microsoftu). Zauważ, że przeglądarki zwracają różne kody dla niektórych kluczy. W moim przypadku chciałem zapobiec Ctrl + P.

Klawisz „P” na chromie jest postrzegany tak e.keyCode == 80, jak na operze e.charCode == 16, podczas gdy na Firefoxiee.charCode == 112

$(document).on('keydown', function(e) {
    if(e.ctrlKey && (e.key == "p" || e.charCode == 16 || e.charCode == 112 || e.keyCode == 80) ){
        alert("Please use the Print PDF button below for a better rendering on the document");
        e.cancelBubble = true;
        e.preventDefault();

        e.stopImmediatePropagation();
    }  
});

Użyłem jQuery.


0

Jeśli chcesz wyłączyć każdą istotę ctrl-key przejęte przez strony, po prostu filtrować koduje wszystkich listu od AZ (budynek na uprzednio zaakceptowana i zawodowym odpowiedź)

// ==UserScript==
// @name           Disable Ctrl+key interceptions
// @description    Stop websites from highjacking keyboard shortcuts
//
// @run-at         document-start
// @include        *
// @grant          none
// ==/UserScript==

(window.opera ? document.body : document).addEventListener('keydown', function(e) {
    //alert(e.keyCode ); //uncomment to find more keyCodes
    if( e.ctrlKey && e.keyCode>=65 && e.keyCode<=90 ) {
        e.cancelBubble = true;
        e.stopImmediatePropagation();
    }
    return false;
}, !window.opera);

-1

Być może możesz użyć Autohotkey lub Autoit, jednego z tych programów, a jeśli możesz wykonywać kombinacje skrótów klawiszowych i łączyć je z funkcjami firefox, powiedz

Ctrl-; T do nowej karty

Ctrl-; N do nowego okna i tak dalej.

Nie wiem, jak korzystać z Autohotkey lub Autoit, więc ktoś inny będzie musiał sprawdzić, czy to może działać, oferuję to tylko jako potencjalny pomysł.


-2

Obecna wersja przeglądarki Firefox pozwala nam „wyłączyć javascript, aby przejąć menu kontekstowe”:

Narzędzia / Opcje / Treść / Włącz Javascript Zaawansowane / Wyłącz lub zamień menu kontekstowe

Ale nie ma funkcji „wyłączania javascript do przechwytywania skrótów klawiaturowych”.

ps. Nienawidzę witryny Twittera, jej skróty klawiaturowe są sprzeczne z moimi systemowymi skrótami klawiaturowymi: J, K, L, I

Złożyłem prośbę o funkcję na bugzilla.mozilla.org, proszę tam skomentować: https://bugzilla.mozilla.org/show_bug.cgi?id=775002

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.