【问题标题】:JavaScript: Key Event Handling after Assigning a FocusJavaScript:分配焦点后的关键事件处理
【发布时间】:2010-06-29 02:03:48
【问题描述】:

在我的应用程序中,我需要创建自定义弹出窗口,但在尝试关闭它们时遇到了问题。要打开弹出窗口,用户需要在选择菜单项时点击“ENTER”。从那里弹出菜单,提供关闭按钮焦点,并在选择“关闭”或“提交”项目时点击“ENTER”后关闭。

当用户尝试关闭弹出窗口时,它会关闭,但由于关闭函数没有消耗关键事件,因此最终会再次打开它。

目前,我在文档中有一个用于启用导航的 onkeyup 事件的键事件函数,然后我尝试将弹出关闭函数分配给 onclick、onkeyup 和 onkeypress,但无论我尝试哪个,总是按“ENTER”弹出窗口关闭后最终到达主键事件功能。

我当前的快速修复是使用两个额外的布尔值,一个在弹出窗口关闭后变为真,另一个在主键事件函数看到第一个布尔变为真后变为真(因为只有一个布尔变为真关闭窗口后,由于某种原因仍然允许事件到达主要功能)。

因为我需要在离开弹出窗口时选择相同的菜单项,取消选择菜单项,保存它的位置,然后返回它也需要更多的全局变量。

我主要是想知道是否有更好的方法来做到这一点,因为我不希望有两个额外的全局变量在周围浮动......

【问题讨论】:

    标签: javascript focus key-events


    【解决方案1】:

    尝试使用 event.preventDefault (info here)。向下滚动到标题为“防止默认”的部分

    【讨论】:

    • 由于某种原因,当我在按键上调用它时 preventDefault 似乎不起作用=/
    【解决方案2】:

    更新:我已经回答了几乎相同的问题,只是在不同情况下按空格键。你去:Check it out.


    此外,标志也没有那么糟糕。如果您担心全局命名空间(这是一个很好的做法),您可以做两件事。

    1. 函数是对象。它们可以在每次调用时使用属性(如果您愿意,可以使用静态变量)。

    function handler() {
      if ( handler.opened ) {
        // close window
        // ...
        handler.opened = false;
      } else {
        // open window
        // ...
        handler.opened = true;
      }
    }
    
    // initialize property
    handler.opened = false;
    

    【讨论】:

    • 在第一种方法中,我了解如何在打开弹出窗口时设置变量,因为这是在处理程序中完成的,但我不知道如何在关闭它时设置它,因为代码关闭它的函数与处理程序是分开的......然后包装的东西真的让我感到困惑,因为导航文档的唯一方法是使用处理程序,并且在导航窗口时是分开的,我仍然不确定如何制作它所以处理程序代码将在任何地方工作,除非弹出窗口没有额外的变量。
    猜你喜欢
    • 2011-02-10
    • 1970-01-01
    • 2016-10-07
    • 1970-01-01
    • 2018-03-17
    • 2014-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多