2016-02-11 57 views
3

后,其他标识事件我有一个div与下面的操作来模拟菜单如何榆树

div 
    [ onClick address Toggle 
    , onFocus address Open 
    , onBlur address Close 
    ] 
    [ ... some items with click handlers ] 

当一个标签到div,使其具有焦点并执行Open,显示菜单。

当失去焦点,onBlur升高并执行Close其隐藏菜单

单击时,它OpenClose之间切换。

这工作正常,但也有一些问题

方案

  1. 当在div用户点击,它触发onFocus打开的菜单。
  2. 然后它触发onClick,它执行切换并因此关闭菜单。

如何在onFocus之后识别onClick以便不切换菜单?如果不是,在Elm中处理这种情况的最佳方法是什么?

这工作正常,如果用户选项卡的div,然后点击它。既然它已经有了重点,它就会按预期切换并行为。

+0

您应该为您的模型添加一些状态,以便您可以在菜单打开或关闭的情况下保留trask,并根据模型状态对事件作出反应 – marcosh

+0

我有菜单打开时要监视的状态或关闭。这是状态切换时使用的。点击后,它会触发'onFocus',它将状态设置为'Open',然后触发'onClick'来切换状态,并将其设置为'Closed' – ritcoder

+0

ok,现在我看到了问题。只是我的2美分...也许你可以修改你的状态,也有一个'JustOpened'选项。在'onFocus'事件中,您将模型置于'JustOpened'状态并在一定的毫秒数后触发另一个事件(可能使用'Time'。延迟“功能)将状态转移到”打开“状态 – marcosh

回答

1

我会建议删除Toggle操作。这是没有必要的,只会造成混乱,因为它无视现状。

相反,您的模型中可能已经有了一些可以跟踪div是否已经打开的东西,因为我认为您的样式基于这个事实是不同的。在这个例子中,我会假设你的模型看起来是这样的:

type alias Model = 
    { open : Bool } 

然后,您可以删除Toggle行动和改变onClick处理程序或者发送基于当前状态的OpenClose行动。

div 
    [ onClick address (if model.open then Close else Open) 
    , onFocus address Open 
    , onBlur address Close 
    ] 
    [ ... some items with click handlers ] 

这让你连续发射了两枚Open行动的潜力,但应该是确定的,因为第二Open将在本质上是一个空操作,不会改变already-开放模式。

+0

我不确定是否因为我得到相同的东西而没有正确实施您的建议。点击后,执行的操作是“打开”和“关闭”。我可以连续使用两个“Open”,但这似乎没有发生 – ritcoder

+0

在内部点击中,'mousedown'将在父'blur'事件之前触发。如果你创建了一个名为'DelayClose'的动作,在你的模型上在子元素的'mousedown'上设置一个标志,然后在'update'的'Close'处理程序中,你可以检查该标志,然后你可以清除标志在内部点击更新。如果这不起作用,你能提供更多的代码来给你的问题提供一个最简单的例子吗? –

+0

通过使用上面的代码以某种方式得到它的工作,但推迟执行。 'focus'在250 ms后调用'Open',200 ms后'blur'调用'Close'。它大约90%的时间工作。可能需要稍微调整时间。 – ritcoder