3

私はチャットアプリケーションを構築しており、ユーザーがキーを押すたびに、押したキーが特定の要素 (iframe ui.rteIFrame 内の編集可能な HTML ドキュメント ui.rte1Content) に入力されるようにしようとしています。正確に)。これは、ページ上のどの要素に現在フォーカスがあるかに関係なく発生するはずです。私は Firefox と Chrome をサポートすることだけに関心があります。

これまでのところ、window.onkeydown イベントにハンドラーを登録しました。

function captureKeyDown(e) {
    console.log("Capturing: " + e.keyCode);

    // We ignore certain keys such as page up, as well as keys pressed with
    // alt or ctrl, except for a few select combos like ctrl+b
    if(!ignoreKeys.contains(e.keyCode) && !e.altKey && 
      (!e.ctrlKey || (e.ctrlKey && validCtrlKeys.contains(e.keyCode)))) {
        ui.rte1Content.focus(); // Chrome prefers this.
        if(!rteHasFocus) {
            ui.rteIFrame.focus(); // Firefox prefers this
        }
        //alert("A commented out alert");
    }
}

これは Firefox で完全に機能します。rteIFrame がフォーカスを取得し、押されたキーが表示され、続行します。ただし、Chrome (23.0.1271.95) では、rte1Content は次の文字が表示されるのに間に合うように正しくフォーカスを取得しますが、イベントを最初にトリガーした最初の文字はエーテルに消えます。

価値があるのは、アラートステートメントのコメントを外すと、手紙がChromeで問題なく表示されることです. これがなぜなのかわかりません。

これを機能させる方法について何か提案はありますか?

4

1 に答える 1

0

「alert() のこと」については、単に Chrome で alert() が発生するとフォーカスが失われるためです。それをテストするには、JavaScript コンソール (Chrome では CTRL+SHIFT+J、Firefox では CTRL+SHIFT+K) を開いて、何かを選択するか、任意のページで何かにフォーカスしてからコンソールalert("test");に入力してみてください。失った。次にFirefoxで試してみると、フォーカスが保持されます。

また、あなたは複雑な方法で物事をやっているように感じます。<textarea>タグを使用してキーボード入力を保存しないのはなぜですか? また、COMET テクニックやロング プーリングなどを使用して iframe を介してデータを渡すことでチャット アプリケーションを作成する予定がある場合は、よりモダンで最適化されたチャットを作成できるように、Google WebSockets を使用することを強くお勧めします。これとともに。WebSocket を正しくサポートする 2 つのブラウザーである Firefox と Chrome のみに焦点を合わせているため、あなたの場合にも最適です。:)

于 2012-12-09T09:22:42.283 に答える