0

我最近发现webviewhs并尝试了它。它只是工作,我认为它可以做我需要它做的事情。样本很丰富,但我需要一些 Haskell 专家的指点。

{-# LANGUAGE
    OverloadedStrings
  , QuasiQuotes
#-}

import Data.Text
import Language.Javascript.JMacro
import qualified Graphics.UI.Webviewhs as WHS

main :: IO ()
main =
  WHS.withWindowLoop
    WHS.WindowParams
      { WHS.windowParamsTitle      = "webviewhs - How do I run some JavaScript inside the window?"
        -- This could be a localhost URL to your single-page application (SPA).
      , WHS.windowParamsUri        = ""
      , WHS.windowParamsWidth      = 800
      , WHS.windowParamsHeight     = 600
      , WHS.windowParamsResizable  = True
      , WHS.windowParamsDebuggable = True
      }
    -- This is the callback JavaScript can execute.
    (\ _window stringFromJavaScript -> print stringFromJavaScript) $
    -- This function runs every window loop.
    -- Return True to continue the loop or False to exit the loop.
    \ window -> do
      let string = "Hello from Haskell." :: Text
      -- runJavaScript returns either True on success or False on failure.
      WHS.runJavaScript
        window
        [jmacro|
          alert ("Yahoo! Alert windows, but little too persistent!");
          window.external.invoke("Hello from JavaScript.");
        |]

如果我使用上面的代码,警报对话框(测试)会不断弹出。我很想让它过去ok。我还尝试了几次document.getElementById从站点的input字段中获取信息 ( )。无法让它发挥作用。对我来说webviewhs是 Haskell 中缺少的链接,我真的很想让它工作。

4

1 回答 1

1

问题出在WHS.withWindowLoop. 参考文档

为您创建一个窗口。接受在窗口循环的每次迭代中调用的函数。如果接受的函数返回False,则退出循环并销毁窗口。如果接受的函数返回True,则循环继续,只要它可以。

(我的重点)

请注意,最后一个参数 ofwithWindowLoop被重复调用,直到它返回False。但是,您总是返回True,这意味着对话框被重复打开而没有完成循环。我可以看到解决这个问题的两种方法:

  • 改为使用WHC.createWindow;这个函数只是创建一个窗口并返回它,而不循环。这是相关示例中使用的方法。
  • 继续使用withWindowLoop,但返回False而不是True。这将在一次迭代后立即停止循环。
  • 如果你真的想使用withWindowLoop,那么你可以先声明一个IORefwhich is ,然后在一次迭代后True更改为。False这种方法虽然不是很惯用。(不要用这种方法,不行,实际上是两次启动对话框,反正比需要的复杂多了)
于 2019-04-18T05:22:32.380 回答