我发现了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中缺少的链接,我真的很想让它工作。
答案 0 :(得分:1)
问题出在WHS.withWindowLoop
中。引用the documentation:
为您创建一个窗口。接受在窗口循环的每次迭代中调用的函数。如果接受的函数返回
False
,则退出循环并破坏窗口。 如果接受的函数返回True
,则循环会继续(如果可以)。
(我的重点)
请注意,withWindowLoop
的最后一个参数会重复调用,直到返回False
。但是,您总是返回True
,这意味着对话框在没有完成循环的情况下被反复打开。我可以看到两种解决此问题的方法:
WHC.createWindow
;此函数仅创建一个窗口并返回它,而不循环。这是in the relevant example使用的方法。withWindowLoop
,但返回False
而不是True
。一次迭代后,这将立即停止循环。withWindowLoop
,则可以先声明一个IORef
的{{1}},然后在一次迭代后更改为True
。