我有一个div
,其中包含以下操作来模仿菜单
div
[ onClick address Toggle
, onFocus address Open
, onBlur address Close
]
[ ... some items with click handlers ]
当一个标签显示div
时,它会有焦点并执行显示菜单的Open
。
当它失去焦点时,会引发onBlur
并执行隐藏菜单的Close
点击后,它会在Open
或Close
之间切换。
这很好但有一些问题
方案
div
时,会触发打开菜单的onFocus
。onClick
,执行切换,从而关闭菜单。如何在onClick
之后识别onFocus
以便不切换菜单?如果没有,在Elm中处理这种情况的最佳方法是什么。
如果用户选中div然后点击它,这可以正常工作。由于它已经具有焦点,因此它可以按预期进行切换和行为。
答案 0 :(得分:1)
我建议删除Toggle
操作。它没有必要,只会引起混淆,因为它忽视了当前的状态。
相反,你可能已经在你的模型中找到了一些跟踪div当前是否打开的东西,因为我认为你基于这个事实的风格不同。对于这个例子,我假设你的模型看起来像这样:
type alias Model =
{ open : Bool }
然后,您可以移除Toggle
操作并更改onClick
处理程序,以根据当前状态发送Open
或Close
操作。
div
[ onClick address (if model.open then Close else Open)
, onFocus address Open
, onBlur address Close
]
[ ... some items with click handlers ]
这使您有可能连续触发两个Open
个动作,但 应该可以,因为第二个Open
本质上是一个 - op并且根本不会改变已经开放的模型。