4

Safariでコマンド+キーストロークをインターセプトしようとしています。次のようにイベントハンドラーを追加しました。

document.onkeypress = handleKeyPress;

function handleKeyPress(event) {
    if ("+" === String.fromCharCode(event.charCode) && event.metaKey) {
        // my code here
        return false;
    }
    return true;
}

command shift =(米国のキーボード上にshift =ある)を押すと、ifステートメントが+trueを返しません。

ifステートメントのevent.metaKey部分を削除してヒットshift =すると、ifステートメントはtrueを返します。

また、一致する文字列を「+」から「=」に変更してcommand =(Shiftキーの有無にかかわらず)押すと、ifステートメントはtrueを返します。

コマンド+キーの押下を実際に検出する方法はありますか(+キーがshift =であると想定せずに、event.shiftKeyをチェックします。これは米国以外のキーボードには当てはまらないためです)。

4

3 に答える 3

4

まず第一に、⌘+をショートカットとして使用することを必ずしもお勧めすることはできません。これは、Safariですでに何かを意味しているためです(つまり、ページをズームします)。誰かがそれがまだ正常に機能することを望むかもしれません。構築しているものによっては、それが理にかなっている場合もありますが、確信が持てない限り、デフォルトのショートカットをオーバーライドしないでください。

とにかく:キーイベントはトリッキーです。多くの場合、keyCode / charCode / whichプロパティが常に正しい文字と一致するとは限らないためString.fromCharCode、適切な文字列が常に取得されるとは限りません。keyIdentifier見た方が良い場合もありますが、常にそうとは限りません(たとえば、文字キーのコードは常に大文字です)。

私が過去に行ったこと(これが最善の方法かどうかはわかりませんが、問題なく機能します)は、代わりにキーダウンイベントとキーアップイベントをリッスンし、修飾キーを「スタック」することです。つまり、キーが押されたときはいつでも、それが修飾キーであるかどうかを確認します(つまり、cmd、ctrl、alt、またはshiftであるかどうか)。そうである場合は、それを修飾子の「スタック」に追加します。キーアップで反対のことをします。リリースされたキーが修飾子であった場合は、スタックから削除します。

ここで、keydown-handlerに戻って、キーが修飾子キーではなかった場合、keydownイベント(keypressイベントとは異なり、keyIdentifierチェックするための非常に信頼性の高いプロパティがあります)と修飾子のスタックを送信できます。他のコールバック、それはそこからそれを取ります。

あなたの場合、そのようなコールバックは、cmd-keyがスタックにあり、keydownイベントのkeyIdentifierが "U + 002B"(のUnicodeコード+)であることを確認します。

私が話していることのjsfiddleの例をまとめました。[結果]ペインをクリックして(フォーカスが合っていることを確認するため)、⌘+を押すと、使用したキーコンボが表示され、「成功!」と入力されます。下。それ以外の場合は、キーの組み合わせが表示されます。私のキーボードでは、プラス記号に直接アクセスできるので、表示されるキーの組み合わせは「⌘+」だけです。ただし、プラス記号を入力するためにシフトする必要がある場合は、「⇧⌘+」が表示されます。

これは、Safari / Macでキーボードショートカットを処理するのに適した一般化されたコードであるため、必要に応じてその上に構築できます。ブラーイベントなどのモディファイヤスタックをリセットするには、いくつかのイベントリスナーを追加する必要があります。理想的には、キーを離すとモディファイアスタックが自動的にリセットされますが、何かが原因でブラウザまたは監視対象の要素/ウィンドウ/ドキュメントがフォーカスを失う可能性があるため、キーアップイベントは処理されず、解放されたキーが勝ちますスタックから削除されません。したがって、ブラーイベントを確認してください。

于 2011-08-31T04:57:16.820 に答える
0

イベントオブジェクトをウィンドウオブジェクトレベル1、たとえばevent = window.EEに登録し、FirebugまたはSafariのWeb開発ツールでそれを参照して、必要なときにトリガーされる値を確認します。だからあなたは何と比較するかを知るでしょう。

于 2011-08-31T03:40:27.953 に答える
0

悲しいことに、私は答えがないと思います。問題は、押されCMD+SHIFT+=ているのが43()ではなくcharCode61( )であるためです。これは、Mac OS X自体がとではなくプラス2つの修飾子として解釈されるという点で、システム全体の設計のようです。=+CMD+SHIFT+==+COMMAND

これを示すために、単純なjsFiddleをまとめました:http://jsfiddle.net/ScuDj/1/

基本的に、を検出したい場合は、キーボードレイアウトを処理する必要がありますCOMMAND +

または、テンキーのみをサポートすることもできます。これ+は一貫して機能します。(冗談だ ;-)

(また、イベントにアタッチしようとしましたtextInputが、グローバルに登録できませんでした。domNodeでのみ機能すると思います。そのイベントはあまり使用していません。)

于 2011-08-31T03:43:10.763 に答える