如何在Elm中依次识别事件

如何在Elm中依次识别事件,elm,Elm,我有一个div,通过以下动作模拟菜单 div [ onClick address Toggle , onFocus address Open , onBlur address Close ] [ ... some items with click handlers ] 当一个选项卡指向div时,它具有焦点并执行显示菜单的Open 当它失去焦点时,onBlur被触发并执行Close以隐藏菜单 单击时,它会在打开或关闭之间切换 这很好,但有几个问题 场景 当用户单击div时,会

我有一个
div
,通过以下动作模拟菜单

div
  [ onClick address Toggle
  , onFocus address Open
  , onBlur address Close
  ]
  [ ... some items with click handlers ]
当一个选项卡指向
div
时,它具有焦点并执行显示菜单的
Open

当它失去焦点时,
onBlur
被触发并执行
Close
以隐藏菜单

单击时,它会在
打开
关闭
之间切换

这很好,但有几个问题

场景

  • 当用户单击
    div
    时,会触发打开菜单的
    onFocus
  • 然后,它触发
    onClick
    ,执行切换,从而关闭菜单
  • 如何识别
    onFocus
    之后的
    onClick
    ,以免切换菜单?如果不是,在Elm中处理此场景的最佳方法是什么


    如果用户点击div,然后点击它,这就可以了。因为它已经有了焦点,所以它会按照预期进行切换和行为。

    我建议删除
    切换操作。这是不必要的,只会导致混乱,因为它忽略了当前状态

    相反,您的模型中可能已经有了跟踪div当前是否打开的东西,因为我认为您正在根据这一事实改变样式。对于本例,我假设您的模型如下所示:

    类型别名模型=
    {open:Bool}
    
    然后,您可以删除
    切换
    操作,并根据当前状态将
    onClick
    处理程序更改为发送
    打开
    关闭
    操作

    div
    [onClick address(如果model.open,则关闭else-open)
    ,onFocus地址打开
    ,onBlur地址关闭
    ]
    […具有单击处理程序的某些项目]
    

    这使您有可能连续触发两个
    Open
    操作,但这应该是可以的,因为第二个
    Open
    操作本质上是不可操作的,根本不会更改已经打开的模型。

    您可能应该为模型添加一些状态,以便在菜单打开或关闭时可以保留trask,并对事件做出相应的反应,同时也对模型状态做出相应的反应。当菜单打开或关闭时,我有状态要监控。这就是切换状态时使用的方法。单击时,它会触发
    onFocus
    ,将状态设置为
    Open
    ,然后触发
    onClick
    ,切换状态,从而将其设置为
    Closed
    ok,现在我看到问题了。只要我的2美分。。。也许您可以修改您的状态,并有一个刚刚打开的
    选项。在
    onFocus
    事件中,您将模型置于
    JustOpened
    状态,并触发另一个事件,该事件在一定的毫秒数后(可能使用
    Time.delay
    函数)将状态移动到
    Open
    我不确定是否没有正确执行您的建议,因为我得到了相同的结果。单击后,执行的操作是
    打开
    关闭
    。我可以连续打开两个
    Open
    ,但这似乎没有发生在内部单击中,
    mousedown
    将在父
    blur
    事件之前触发。如果您创建了一个名为
    DelayClose
    的操作,该操作在子元素的
    mousedown
    上的模型中设置一个标志,然后在
    update
    中的
    Close
    处理程序上,您可以检查该标志,然后可以清除内部单击更新中的标志。如果这不起作用,你能提供更多的代码来给你的问题提供一个最小的工作示例吗?通过使用上面的代码,但按照建议延迟执行,它以某种方式工作了<代码>聚焦
    在250毫秒后调用<代码>打开
    模糊
    在200毫秒后调用<代码>关闭。它大约90%的时间工作。不过可能需要调整一下时间。