GHCJS-DOM事件指导

时间:2014-09-18 19:46:16

标签: haskell dom ghcjs ghcjs-dom

我试图了解如何使用GHCJS-DOM创建GUI。我一直在看hello world示例https://github.com/ghcjs/ghcjs-dom-hello,这是微不足道的。添加新节点非常简单。我无法做到的,并且无法从库文档(仅签名)中解决,就是添加一些事件。例如,在鼠标单击时向主体添加新节点。

我希望避免使用像JQuery这样的JS库,因为我想通过GUI在GHC(webkit)和GHCJS之间移植。

最终,我希望能够将鼠标事件表达为FRP事件,但我一次只能解决一个步骤。

如果有人有任何指导,我将非常感激。我已经使用haskell几年了,但这是我第一次进入DOM。

1 个答案:

答案 0 :(得分:6)

您可以从许多地方获取有关DOM的信息,包括mozilla。这是一个为文档正文中的点击事件添加事件处理程序的示例...

module Main (
    main
) where

import Control.Applicative ((<$>))
import Control.Monad.Trans (liftIO)
import GHCJS.DOM
       (enableInspector, webViewGetDomDocument, runWebGUI)
import GHCJS.DOM.Document (documentGetBody, documentCreateElement)
import GHCJS.DOM.HTMLElement (htmlElementSetInnerHTML, htmlElementSetInnerText)
import GHCJS.DOM.Element (elementOnclick)
import GHCJS.DOM.HTMLParagraphElement
       (castToHTMLParagraphElement)
import GHCJS.DOM.Node (nodeAppendChild)
import GHCJS.DOM.EventM (mouseClientXY)

main = runWebGUI $ \ webView -> do
    enableInspector webView
    Just doc <- webViewGetDomDocument webView
    Just body <- documentGetBody doc
    htmlElementSetInnerHTML body "<h1>Hello World</h1>"
    elementOnclick body $ do
        (x, y) <- mouseClientXY
        liftIO $ do
            Just newParagraph <- fmap castToHTMLParagraphElement <$> documentCreateElement doc "p"
            htmlElementSetInnerText newParagraph $ "Click " ++ show (x, y)
            nodeAppendChild body (Just newParagraph)
            return ()
    return ()