Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/454.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 捕捉按键,指向Chrome中的特定元素_Javascript_Google Chrome_Focus_Onkeypress - Fatal编程技术网

Javascript 捕捉按键,指向Chrome中的特定元素

Javascript 捕捉按键,指向Chrome中的特定元素,javascript,google-chrome,focus,onkeypress,Javascript,Google Chrome,Focus,Onkeypress,我正在构建一个聊天应用程序,我试图确保用户在任何时候按下一个键,他们按下的键都会进入一个特定元素(确切地说,是iframe ui.rteIFrame中的可编辑HTML文档ui.rte1Content)。无论页面上的哪个元素当前具有焦点,都应该发生这种情况。我只关心支持Firefox和Chrome 到目前为止,我已经在window.onkeydown事件上注册了一个处理程序: function captureKeyDown(e) { console.log("Capturing: " +

我正在构建一个聊天应用程序,我试图确保用户在任何时候按下一个键,他们按下的键都会进入一个特定元素(确切地说,是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在下一个字母出现时正确聚焦时,第一个触发事件的首字母消失在乙醚中

值得一提的是,如果我取消对alert语句的注释,该字母在Chrome中显示得很好。我不知道这是为什么

有人对我如何让它工作有什么建议吗?

对于“alert()东西”,这只是因为在Chrome中,当alert()发生时,焦点会丢失。要测试这一点,请尝试打开JavaScript控制台(Chrome中的CTRL+SHIFT+J,Firefox中的CTRL+SHIFT+K),在任何页面上选择某个内容或关注某个内容,然后在控制台中键入
警报(“测试”),你会看到焦点丢失了。然后在Firefox中尝试,焦点保持不变


我也觉得你在用复杂的方式做事啊哈!为什么不使用
标记来存储键盘输入?此外,如果您计划通过使用COMET技术通过iframe传递数据或进行一些长池等方式来创建聊天应用程序。。我真的建议你谷歌WebSockets,因为你可以用它进行更现代、更优化的聊天。这对你来说也是完美的,因为你可以只关注Firefox和Chrome,这两种浏览器都正确地支持WebSocket

我没有使用textarea,主要是作为使用这个富文本编辑器库的副作用,它使用了一个可编辑的iframe。是的,我知道当警报发生时焦点会丢失,但我不确定为什么会使键入的字符出现在正确的位置。我也不知道如何在没有警报的情况下模拟这种积极效果()(我已经尝试过随机将焦点设置为其他内容,然后将其设置回原来的位置)。哦,很抱歉,当警报未注释时,它不起作用。。。我确实需要一些睡眠。您可以探索一种方法:,由手动触发键盘事件组成,而不是“将其移动到正确的位置”。。或者你也可以尝试添加大量的EventsListener,以便在每一个鼠标点击、鼠标移动等操作中都将注意力集中在编辑器上。。我希望每一个被按下的字符都能进入编辑器,但这肯定是一个最后的解决方案,我实际上试着手动启动键盘事件。它正确地触发了我的onkeydown处理程序,但角色从未出现(即使我确保焦点已经在正确的位置,以消除与此相关的任何问题)。我通过谷歌搜索发现,“在Chrome[手动事件]中,只启动事件处理程序,不执行任何默认操作。”我不知道这是否可信,但这与我的经验相符。(为了记录在案,我还尝试将字符手动添加到文本区域的innerHTML中,但这会打开一个全新的潘多拉框,涉及光标在非文本区域的定位和元键等问题。)同时,作为黑客,是的,我基本上一直在调用focus()每次用户在编辑器外单击时,这都很不理想。理想情况下,我希望焦点能够停留在某些其他字段中,并且只在按键时返回。因此我发现,在Chrome中,按键事件似乎从未在任何特定元素上触发,我猜这就是默认操作(字母出现)的原因从未发生过。焦点处于“中间”元素时是否可能触发按键事件?作为一种恼人的解决方法,我目前正在使用它来直接模拟rte1Content上的按键。这种方法有效,但在很多情况下(上下箭头、ctrl+v等)仍然失败.我仍然希望找到一个简单的方法来解决最初的问题。