6

私は、ホットキー[Alt] + [0 ... 9]を使用するChrome拡張機能を作成して、Facebookが同じホットキーを使用していることを発見しました。エクステンションがfacebookのホットキーを無効にする可能性があるので、私の火だけでいいのですか?Chrome拡張機能でFacebookのホットキーを無効にするにはどうすればよいですか?

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... 

これは、ルート文書の先頭から呼び出されるスクリプトである:私は、コードのFacebookは自分の[Alt]キー+ [0 ... 9]ホットキーを実装するために使用する特定したかなり確信しています。私はそれらを無効にするには、次を試してみました:

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

とさえ

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

私はクロームの拡張コンテンツのスクリプトは任意のWebページでDOMを共有するもののので、どちらもこれらの試みの仕事の理由があることがさらに推測しています実行すると、おそらくそれらはコーディング環境を共有しないでしょうか?どんな洞察にも感謝します!

答えて

4

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

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をロードする回避策です:

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

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

最初に、ページ上で実行したいスクリプトが含まれているWeb上のどこかにJavaScriptファイルをホストする必要があります。ホストには http://mysite.com/override-fb-hotkeys.jsというホスト名が必要です。

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がフェッチとのコンテキストで実行されます:

次に、あなたのコンテンツのスクリプトから、あなたはあなたのJavaScriptファイルを参照するDOM、このような何かにスクリプトタグを挿入することができますChromeプラグインのサンドボックスコードではなく、含まれているページ。

+0

ありがとうございます。これは確かに洞察力です!私はこれがうまくいけば別のサイトでホストする必要がないことを発見しました: 'script.setAttribute(" src "、chrome.extension.getURL(" override-fb-hotkeys.js "));注入されたファイル内のdocumentElement.onkeydown = function(e){}; 'はfbショートカットを無効にしません。 –

+0

Facebookページのコードをリバースエンジニアリングして、キーイベントがどのようにキャプチャされ、処理されたかを判断し、その機能を無効にする必要があります。私は少し見えたが、何も飛び出さなかった。私は、id "blueBarHolder"(トップバー全体)の要素を削除すると、ホットキーが機能しなかったことに気付きました。 –

+0

ねえ、私はあなたに物事を知っているようだから尋ねたい。 ChromeでFacebookのショートカットを単に無効にするだけの賢明な回避策があるかどうか知っていますか?私はLが好きであるという事実に立つことができません(私はCtrl + Lを頻繁に使ってナビバーに行きます)。同様に、単純な1行のスクリプトでも役に立ちます – Tom

8

クロムのコンテンツスクリプトは、サンドボックス環境で実行されます[source]です。グローバル(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(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+少なくともクローム5+:Object.definePropertyは、不変のプロパティを定義します。あなたはまた、Firefoxの2+やChrome 1+をサポートしたい場合は、定義されているからonkeydownを防ぐために、__defineSetter__で遊ぶことができます。

document.documentElement.__defineSetter__('onkeydown', function(){}); 
+0

そして、もしfacebookのコードがObject.definePropertyを上書きすればどうなりますか? – Pacerier

+0

@Pacerier 'run_at;でコードを実行すると、 "document _start"を実行すると、それは不可能です。 –

+0

2つのdiff拡張が 'document_start'を実行することは可能ですか? – Pacerier

1

これは、あなたがすべて削除jQueryの

使用してそれを行うことができる方法であります任意のウェブページのショートカット:

$('[accessKey]').attr('accessKey','') 
関連する問題