活动处理程序以及Haste中的活动

时间:2014-08-05 22:17:29

标签: javascript haskell

我正在测试Haste编译器,我需要访问事件和/或原始元素,但Event类型不提供该信息。

我尝试使用下面的函数制作ffi回调,但是'事件'它返回到回调是未定义的。我做错了什么,是否有更好的方法使用内置功能?

newtype EventCB = EventCB (JSAny -> IO ())

manualEvent :: Elem -> String -> (JSAny -> IO ()) -> IO ()
manualEvent e evt act = do
  f <- toCallback $ \evt' -> act evt'
  go e evt (EventCB f)
  where go = ffi $ toJSString "(function(e, evt, cb) {e.addEventListener(evt, cb);})"

2 个答案:

答案 0 :(得分:2)

我刚验证这是为了点击事件:

listen :: JSType event => Elem -> event -> a -> IO Bool
listen e event f= jsSetCB e (toJSString event) (mkCallback $! f)

调用
 listen  element  "click"   doit

并且类型为:

 doit :: Int -> (Int,Int) -> IO ()

使用perch库:

doit i (x,y)  = do
  body <- getBody
  (flip build) body $ do
     p i
     p (x,y)

  return()

听是不安全的。您必须确保事件处理程序具有正确类型的参数。 已知事件的类型是onEvent

中使用的类型

答案 1 :(得分:1)

为什么不让回调函数使用读者monad进行事件? Ghcjs-dom具有执行此操作的connect功能。它看起来像这样......

connect :: (GObjectClass t, IsEvent e, ToDOMString string) => string -> t -> EventM e t () -> IO (IO ())
connect eventName target callback =
  eventTargetAddEventListener target eventName False $ curry (runReaderT callback)

返回的IO操作可用于在不再需要时删除事件侦听器。对于ghcjs和webkitgtk,eventTargetAddEventListener都是implemented(因此它在本机Haskell应用程序中的工作方式与编译为JavaScript的工具一样)。

如果你有时间,请给ghcjs