Haskell Webviewhs文本字段并返回到Haskell

时间:2019-04-17 17:47:36

标签: javascript haskell webview

我发现了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中缺少的链接,我真的很想让它工作。

1 个答案:

答案 0 :(得分:1)

问题出在WHS.withWindowLoop中。引用the documentation

  

为您创建一个窗口。接受在窗口循环的每次迭代中调用的函数。如果接受的函数返回False,则退出循环并破坏窗口。 如果接受的函数返回True,则循环会继续(如果可以)。

(我的重点)

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

  • 改为使用WHC.createWindow;此函数仅创建一个窗口并返回它,而不循环。这是in the relevant example使用的方法。
  • 继续使用withWindowLoop,但返回False而不是True。一次迭代后,这将立即停止循环。
  • 如果您确实要使用withWindowLoop,则可以先声明一个IORef的{​​{1}},然后在一次迭代后更改为True(不要使用这种方法,它不会起作用,它实际上会启动对话框两次,并且无论如何都要复杂得多)