我正在测试哈斯特编译器,我需要访问事件和/或原始元素,但是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);})"发布于 2014-11-22 12:26:30
我刚刚验证了它是否适用于click事件:
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 ()使用鲈鱼库:
doit i (x,y) = do
body <- getBody
(flip build) body $ do
p i
p (x,y)
return()听着不安全。必须确保事件处理程序具有正确的参数类型。已知事件的类型是onEvent中使用的类型
发布于 2014-08-09 04:08:27
为什么不让回调函数对事件使用读取器单点呢?格杰斯有一个连接函数来实现这一点。看起来像这样..。
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操作可用于在不再需要事件侦听器时删除事件侦听器。eventTargetAddEventListener对ghcjs和webkitgtk都是实施 (因此它在本地Haskell应用程序中的工作性能与编译到JavaScript的应用程序一样好)。
如果你有时间,请给ghcjs一个机会。
https://stackoverflow.com/questions/25149267
复制相似问题