代码之家  ›  专栏  ›  技术社区  ›  Fresheyeball

无法在GHCJS中激发“dispatchEvent”

  •  0
  • Fresheyeball  · 技术社区  · 6 年前

    我们的目标是 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)
    

    enter image description here

    如你所见 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

    0 回复  |  直到 6 年前
    推荐文章