7

次の Userscript (Greasemonkey を使用する Firefox で使用) は、理論的には、Ctrl+tすべての Web サイトのすべてのイベントをキャプチャし、「Gotcha!」と警告してから、Web サイトがそのCtrl+tイベントを認識しないようにする必要があります。

ただし、一部のサイト (Google、Stack Exchange) でのみ機能し、他のサイトでは機能しません。Userscript が機能しない例の 1 つは Codecademy (コード エディターにフォーカスがある場合) で、Ctr+t常にカーソルの隣の 2 文字を切り替えます。

Flash を無効にしたので、これは JavaScript で解決できる問題だと思います。イベントが Web サイト スクリプトにバブル スルーされないようにするには、スクリプトで何を変更できますか?

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

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

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!"); //comment this out for real world usage
    }
return false;
});

免責事項:私はもともと、スーパーユーザーに関するこのトピックをカバーするより広範な質問をしました. 答えを見つけようとしているときに、この特定のスクリプト関連の問題に遭遇しました。二重投稿するつもりはありませんでした-質問のこの部分は、スーパーユーザーよりもスタックオーバーフローに適していると思います。

4

1 に答える 1

8

hereにある別のユーザースクリプトから2行をコピーして修正しました。

これにより、document.addEventListener行が変更され、さらに重要なことに、最後の行が変更されました。Firefox では、 と!window.opera評価されtrueます。addEventListenerこれは、3 番目のオプション引数として関数に渡され、に設定useCaptureされtrueます。これは、イベントが「バブリング フェーズ」ではなく、以前の「キャプチャ フェーズ」でトリガーされるという効果があり、Web サイトの他の eventListener がイベントを「見る」ことをまったく防ぎます。

作業スクリプトは次のとおりです。

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

// Keycode for 't'. Add more to disable other ctrl+X interceptions
keycodes = [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);
于 2013-11-05T09:47:03.890 に答える