2016-02-11 63 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