11

特定の Web ページにいくつかのカスタム キーボード ショートカットを追加したいと考えています。

この質問から受け入れられた回答をガイドとして使用する:既存の JavaScript 関数に JavaScript キーボード ショートカットを追加するにはどうすればよいですか?

独自の小さな関数を作成し、リスナーを追加しました。

// ==UserScript==
// @name       ChartGame
// @namespace  http://www.chartgame.com/
// @version    0.1
// @description  enter something useful
// @match      http://www.chartgame.com/play*
// @copyright  2012+, You
// ==/UserScript==
function doc_keyUp(e) {
  switch(e.keyCode)
  {
  case 49: //1
    mon_clk(3);
    break;
  case 50:
    mon_clk(6);
    break;
  case 83: //s
    BuySell(0);
    break;
  case 68: //d
    BuySell(1);
    break;
  case 70: //f
    TimelapseDwn();
    TimelapseUp();
    break;
   default:
     break;
  }
}
document.addEventListener('keyup', doc_keyUp, false);

このコードは、適切な Web ページ上で Chrome の JavaScript コンソールに入力すると、問題なく実行されます。意図したとおりにキーボード ショートカットを使用できます。唯一の問題は、次のゲーム (チャート) に行く場合、リスナーを含む JavaScript コードを再入力する必要があることです。

Tampermonkey を使用すると、 の式に一致する特定のページでこのスクリプトを自動的に実行できるようになるというのが私の印象でした@match。コードは実行されているように見えますが、キーボード ショートカット機能はありません。

Chrome コンソールや Tampermonkey などの拡張機能から JavaScript コードを実行する場合に何が欠けているのか、何が違うのでしょうか?

4

1 に答える 1

10

そのコードは、ターゲット ページで定義された JavaScript 関数を呼び出しているため、ユーザー スクリプトでは機能しません。ユーザースクリプトはさまざまなサンドボックスで動作するため、目的のページの JS を簡単に見ることはできません。

Tampermonkey (および Greasemonkey) は、 を使用してこれを回避する方法を提供しunsafeWindowます。(プレーンな Chrome ユーザースクリプトはunsafeWindow、有用な方法でサポートされていません。)

したがって、これらの関数を使用するには、次のようにプレフィックスを付けます。

// ==UserScript==
// @name       ChartGame
// @namespace  http://www.chartgame.com/
// @version    0.1
// @description  enter something useful
// @match      http://www.chartgame.com/play*
// @copyright  2012+, You
// ==/UserScript==
function doc_keyUp(e) {
    switch (e.keyCode) {
        case 49:
            //1
            unsafeWindow.mon_clk(3);
            break;
        case 50:
            unsafeWindow.mon_clk(6);
            break;
        case 83:
            //s
            unsafeWindow.BuySell(0);
            break;
        case 68:
            //d
            unsafeWindow.BuySell(1);
            break;
        case 70:
            //f
            unsafeWindow.TimelapseDwn();
            unsafeWindow.TimelapseUp();
            break;
        default:
            break;
    }
}
document.addEventListener('keyup', doc_keyUp, false);


別のアプローチであり、プレーンな Chrome ユーザースクリプトで機能するアプローチは、コードを挿入することです。ただし、Tampermonkey を使用しているunsafeWindowため、この場合はこのアプローチを使用してください。

于 2012-11-13T22:06:41.163 に答える