Haskell Webviewhs getElementById с веб-страницы - PullRequest
0 голосов
/ 26 апреля 2019

Для меня по-прежнему самый большой потенциал для графического интерфейса для Haskell, но в примерах отсутствует некоторая важная информация, поскольку он является новичком Хаскеллером. Предположим, один из примеров:

{-
  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, нажав кнопку? Там нет такого примера в учебнике. Для меня это отсутствующая ссылка, чтобы получить информацию из веб-приложения, обработать ее в Haskell и вернуть, например, в. SQLite.

1 Ответ

2 голосов
/ 26 апреля 2019

Как показывает страница github , вы можете получать данные из JS с помощью обратного вызова и выполнять произвольный JS в окне из Haskell. Этого достаточно, чтобы выполнить любой вид связи, который вам может понадобиться, вот пример, который выполняет некоторое количество 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 месяцев назад, поэтому в данный момент он активно не разрабатывается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...