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 及时正确地获得焦点以显示 NEXT 字母时,第一个触发事件的首字母消失在以太中。

对于它的价值,如果我取消注释警报声明,这封信在 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,因为您将能够进行更现代和优化的聊天有了这个。在您的情况下也将是完美的,因为您只关注 Firefox 和 Chrome,这两种浏览器都正确支持 WebSockets。:)

于 2012-12-09T09:22:42.283 回答