如何在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%的时间工作。不过可能需要调整一下时间。