Захват нажатия клавиш, направляющий на определенный элемент в Chrome

Я создаю приложение чата и пытаюсь убедиться, что каждый раз, когда пользователь нажимает клавишу, клавиша, которую он нажимает, в конечном итоге попадает в определенный элемент (редактируемый HTML-документ ui.rte1Content в iframe ui.rteIFrame, чтобы быть точным). Это должно происходить независимо от того, какой элемент на странице в данный момент имеет фокус. Я забочусь только о поддержке 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 правильно фокусируется на времени, чтобы появилась буква NEXT, начальная буква, которая первой вызвала событие, исчезает в эфире.

Для чего это стоит, если я раскомментирую сообщение с предупреждением, письмо прекрасно отображается в Chrome. Я понятия не имею, почему это так.

У кого-нибудь есть какие-либо предложения о том, как я могу заставить это работать?

1 ответ

Для "alert()" это просто потому, что в Chrome фокус теряется при возникновении alert (). Чтобы проверить это, попробуйте открыть консоль JavaScript (CTRL+SHIFT+J в Chrome, CTRL+SHIFT+K в Firefox), выбрать что-то или сосредоточиться на чем-то на любой странице, а затем ввести в консоли alert("test");Ты увидишь, что фокус потерян. Затем попробуйте в Firefox, фокус сохраняется.

Также я чувствую, что ты делаешь вещи сложным образом, ахах! Почему бы просто не использовать <textarea> тег для хранения ввода с клавиатуры? Кроме того, если вы планируете создать приложение для чата, передавая данные через iframe с использованием техники COMET или, возможно, с каким-либо длинным пулом и т. Д., Я действительно рекомендую вам использовать Google WebSockets, поскольку вы сможете создать более современный и оптимизированный чат. с этим. Это было бы прекрасно и в вашем случае, потому что вы хотите сосредоточиться только на Firefox и Chrome, двух браузерах, которые правильно поддерживают WebSockets.:)

Другие вопросы по тегам