我正在测试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);})"
答案 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。