Haskell Webviewhs текстовые поля и возвращается в Haskell - PullRequest
0 голосов
/ 17 апреля 2019

Я обнаружил 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 Ответ

1 голос
/ 18 апреля 2019

Проблема в WHS.withWindowLoop.Ссылаясь на документацию :

Создает окно для вас.Принимает функцию, которая вызывается при каждой итерации цикла окна.Если принятая функция возвращает False, цикл завершается и окно разрушается. Если принятая функция возвращает True, цикл продолжается при условии, что он может.

(мой акцент)

Обратите внимание, что последний параметр withWindowLoop вызывается несколько раз, пока не вернется False.Однако вы всегда возвращаете True, что означает, что диалоговое окно многократно открывается без завершения цикла.Я вижу два выхода из этой проблемы:

  • Используйте взамен WHC.createWindow;эта функция просто создает окно и возвращает его без зацикливания.Этот подход используется в соответствующем примере .
  • Продолжайте использовать withWindowLoop, но верните False вместо True.Это остановит цикл сразу после одной итерации.
  • Если вы действительно хотите использовать withWindowLoop, тогда вы можете объявить IORef, который сначала равен True, а затем изменился на False после одной итерации.Этот подход не очень идиоматичен. (Не используйте этот подход, он не работает, он фактически запускает диалоговое окно дважды, и в любом случае он намного сложнее, чем нужно)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...