簡體   English   中英

Haskell Webviewhs getElementById 從網頁

[英]Haskell Webviewhs getElementById from a webpage

對我來說,對於 Haskell 來說,GUI 仍然是最有潛力的,但是在示例中缺少一些基本信息,作為一個菜鳥 Haskeller。 假設以下示例之一:

{-
  webviewhs
  (C) 2018 David Lettier
  lettier.com
-}

{-# LANGUAGE
    OverloadedStrings
#-}

import qualified Graphics.UI.Webviewhs as WHS

main :: IO ()
main =
  WHS.createWindowAndBlock
    WHS.WindowParams
      { WHS.windowParamsTitle      = "webviewhs - How do I create a window and have it run itself?"
        -- This could be a localhost URL to your single-page application (SPA).
      , WHS.windowParamsUri        = "https://lettier.github.com"
      , WHS.windowParamsWidth      = 800
      , WHS.windowParamsHeight     = 600
      , WHS.windowParamsResizable  = True
      , WHS.windowParamsDebuggable = True
      }

這將創建一個窗口,我可以在其中加載自定義網頁。 假設這個網頁有一個<input type="text" id="mytext">並且旁邊有一個按鈕。 不重要,重要的是<button type="submit" id="sendtohaskell"> 我將如何通過按下按鈕將文本字段中的信息獲取到 Haskell? 教程中沒有這樣的例子。 對我來說,這是從 webapp 獲取信息、在 Haskell 中處理並將其返回到例如的缺失鏈接。 SQLite。

github頁面所示,您可以通過回調從JS接收數據,並在Haskell的窗口中執行任意JS。 這足以進行您可能想要的任何類型的通信,這里有一個示例,它在按下按鈕時執行一些 Haskell,然后在網頁中顯示結果:

{-# LANGUAGE OverloadedStrings, QuasiQuotes #-}
module Main where

import System.Directory(getCurrentDirectory)
import Text.Printf
import Control.Monad(void)
import Language.Javascript.JMacro
import qualified Graphics.UI.Webviewhs as WHS
import qualified Data.Text as T

windowCallback window = do
  return True

handleJSRequest window request = void . WHS.runJavaScript window $ [jmacro|
  show_response `(printf "'Got response: %s'" request :: String)`
  |]

main :: IO ()
main = void $ do
  dir <- getCurrentDirectory
  WHS.withWindowLoop
    WHS.WindowParams
      { WHS.windowParamsTitle = "Test"
      , WHS.windowParamsUri = T.pack $ printf "file://%s/example.html" dir
      , WHS.windowParamsWidth = 800
      , WHS.windowParamsHeight = 600
      , WHS.windowParamsResizable = True
      , WHS.windowParamsDebuggable = True
      }
    handleJSRequest
    windowCallback
<html>
  <head>
    <title>Example</title>
    <meta charset="utf-8">
  </head>
  <body>
    <script type="text/javascript">
      function show_response(response) {
        document.getElementById('response').innerHTML = response;
      }
      function submit() {
        var value = document.getElementById('textbox').value;
        window.external.invoke(value)
      }
    </script>
    <input type="text" id="textbox"/>
    <input value="say hello" type="button" onclick="submit()"/>
    <p id="response"></p>
  </body>
</html>

不過你應該注意到,haskell webview 庫只有 2 次提交,最后一次是在 7 個月多前,所以目前還沒有積極開發。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM