我们的目标是
window.addEventListener("popstate", ...
从GHCJS代码发送的事件中开火。
到目前为止已经试过了
GHCJS.DOM不工作
w <- currentWindowUnchecked
e <- newPopStateEvent "popstate" Nothing
dispatchEvent_ w e
Language.Javascript.JSaddle不工作
e <- newPopStateEvent "popstate" Nothing
jsg "window" ^. jsf "dispatchEvent" (toJSVal e)
FFI不工作
foreign import javascript unsafe "window.dispatchEvent($1)" dispatchIt :: JSVal -> JSM ()
e <- newPopStateEvent "popstate" Nothing
dispatchIt =<< toJSVal e
调试输出
这确实有效:
e <- newPopStateEvent "popstate" Nothing
w <- currentWindowUnchecked
jsg "console" ^. js2 "log" (toJSVal e) (toJSVal w)
如你所见
JSVal
s是正确的,我们可以在JavaScript控制台中运行该命令。
最近的尝试
dispatchEvent
foreign import javascript unsafe "window.foo()" foo :: JSM ()
w <- currentWindowUnchecked
e <- newPopStateEvent "popstate" Nothing
dispatchEvent_ w e
liftJSM foo
这将导致预期的结果
dispatchEvent_
所以我想可能是
syncPoint
仍然没有骰子
!e <- newPopStateEvent ("popstate" :: Text) Nothing
!() <- dispatchEvent_ w e
liftJSM GHCJS.DOM.syncPoint
你可以自己试试
git clone -b crud-example https://gitlab.com/fresheyeball/Shpadoinkle.git
cd Shpadoinkle
./examples/servant-crud/run-crud.sh
localhost:8080
在浏览器中,单击
"ECHO"
.
相关代码:
https://gitlab.com/fresheyeball/Shpadoinkle/blob/crud-example/router/Shpadoinkle/Router.hs#L100
https://gitlab.com/fresheyeball/Shpadoinkle/blob/crud-example/examples/servant-crud/View.hs#L43