7

ホットキー [Alt]+[0...9] を使用する Chrome 拡張機能を作成して、Facebook が同じホットキーを使用していることを発見しました。私の拡張機能が facebook のホットキーを無効にして、自分だけが発火するようにする方法はありますか? Facebookが[Alt] + [0 ... 9]ホットキーを実装するために使用するコードを特定したことはかなり確信しています。

document.documentElement.onkeydown=function(a){a=a||window.event;var b=a.target||a.srcElement;var c=a.keyCode==13&&!a.altKey&&!a.ctrlKey&&!a.metaKey&&!a.shiftKey&&CSS.hasClass...

これは、ルート ドキュメントの先頭から呼び出されるスクリプトにあります。それらを無効にするために次のことを試しました:

//contents script:
$().ready( function() {
  document.documentElement.onkeydown = '';
});

そしてさえ

$().ready( function() {
  document.documentElement.onkeydown = function(e){};
});

さらに、これらの試みがどちらもうまくいかない理由は、Chrome 拡張機能のコンテンツ スクリプトが実行される Web ページと DOM を共有しているにもかかわらず、おそらくコーディング環境を共有していないからだと推測しています。どんな洞察もいただければ幸いです!

4

3 に答える 3

13

Chrome のコンテンツ スクリプトは、サンドボックス環境[ソース]で実行されます。グローバル ( ) オブジェクトと通信する直接的な方法はありません。 window

もう 1 つのよくある落とし穴は、開発者がスクリプトをいつどのように挿入したかを忘れてしまうことです。

  • デフォルトでは、スクリプトは「document_idle」と呼ばれる時点で注入されます。この時点で、ドキュメントはビジーではありません (DOMContentLoaded発火した、window.onloadまたは発火していない可能性があります)。
  • そのため、スクリプト内の関数は宣言直後に上書きされる可能性があります。

小さなスクリプトを挿入するには、コードをコンテンツ スクリプトに直接追加することをお勧めします。

var actualCode = '/* Code here (see below for inspiration) */';

var script = document.createElement('script');
script.appendChild(document.createTextNode(actualCode));
(document.head || document.documentElement).appendChild(script);
script.parentNode.removeChild(script);

メソッドが上書きされないようにしたい場合はObject.defineProperty、 を使用して不変プロパティを定義できます。

Object.defineProperty(document.documentElement, 'onkeydown', {
    value: function() {},
    writable: false,     /* Cannot be overwritten, default false */
    configurable: false, /* Cannot be deleted, or modified */
    enumerable: true     /* Does not really matter. If true, it's visible in
                             a for-loop. If false, it's not*/
});

前述の方法は、Firefox 4 以降および少なくとも Chrome 5 以降でサポートされています。Firefox 2+ と Chrome 1+ もサポートしたい場合は、 を使用して、定義され__defineSetter__ないようにすることができます。onkeydown

document.documentElement.__defineSetter__('onkeydown', function(){});
于 2012-01-24T21:29:35.690 に答える
6

あなたの直感は正しいです。Chrome 拡張機能の一部としてコンテンツ スクリプトから実行される JavaScript は、含まれているページで実行される JavaScript にアクセスできないサンドボックスで実行されます。

Content Scripts に関する Chrome ドキュメントによると:

However, content scripts have some limitations. They cannot:
*  Use chrome.* APIs (except for parts of chrome.extension)
*  Use variables or functions defined by their extension's pages
*  Use variables or functions defined by web pages or by other content scripts

まず、さまざまなショートカット キーを検討することをお勧めします。独自の拡張機能の既存のショートカット キーの機能をオーバーライドすると、Facebook のショートカット キーを期待しているユーザーにとって不快なユーザー エクスペリエンスが提供される可能性があります。デスクトップ OS の一部であるコピー アンド ペースト用の ctrl-c および ctrl-p ショートカットが拡張機能によってオーバーライドされるとしたら、動揺するユーザーがいると思います。

ただし、もしあなたがしつこい場合は、含まれているページのコンテキストで実行される JavaScript をロードするための回避策を次に示します。

編集: Webでホストされているものではなく、プラグインでJSファイルを参照するようにコメントごとに更新

まず、Chrome プラグインで JavaScript ファイルを作成する必要があります: override-fb-hotkeys.js.

まず、ページで実行するスクリプトを含む JavaScript ファイルを Web 上のどこかにホストする必要がありますhttp://example.com/override-fb-hotkeys.js

次に、コンテンツ スクリプトから、次のように、JavaScript ファイルを参照するスクリプト タグを DOM に挿入できます。

    var script = document.createElement('script');
    script.setAttribute("type", "text/javascript");
    script.setAttribute("async", true);
    script.setAttribute("src", chrome.extension.getURL("override-fb-hotkeys.js")); //Assuming your host supports both http and https
    var head = document.head || document.getElementsByTagName( "head" )[0] || document.documentElement;
    head.insertBefore(script, head.firstChild)

JavaScript は、Chrome プラグインからサンドボックス化されたコードではなく、含まれているページのコンテキストで取得および実行されます。

于 2012-01-24T07:13:19.973 に答える
1

これは、jQueryを使用してそれを行う方法です

Web ページのすべてのショートカットを削除します。

$('[accessKey]').attr('accessKey','')
于 2013-06-16T19:04:59.167 に答える