Dom Purescript无法从键盘获取键代码

Dom Purescript无法从键盘获取键代码,dom,functional-programming,addeventlistener,purescript,Dom,Functional Programming,Addeventlistener,Purescript,我不熟悉函数式编程和Purescript。我试图从键盘上按下的键中获取键代码。我制作了一个eventListener,它在触发keydown事件时触发,并触发事件侦听器函数测试。我在将事件转换为keyboardevent和从keyboardevent获取keycode时遇到问题。我正在附加我的代码并出错 import Control.Monad.Eff (Eff) import Control.Monad.Eff.Class import Control.Monad.Eff.Co

我不熟悉函数式编程和Purescript。我试图从键盘上按下的键中获取键代码。我制作了一个eventListener,它在触发keydown事件时触发,并触发事件侦听器函数测试。我在将事件转换为keyboardevent和从keyboardevent获取keycode时遇到问题。我正在附加我的代码并出错

import Control.Monad.Eff (Eff)
    import Control.Monad.Eff.Class
    import Control.Monad.Eff.Console (CONSOLE, log)
    import DOM (DOM)
    import DOM.Event.EventTarget (addEventListener, eventListener)
    import DOM.HTML.Types as DHT
    import DOM.Event.KeyboardEvent as KE
    import DOM.Event.Types (EventType(..), EventTarget)
    import DOM.Event.Event
    import DOM.HTML (window)
    import DOM.HTML.Window (document)
    import Prelude (Unit)

test :: forall e. Event -> Eff ( console :: CONSOLE, dom :: DOM | e) Unit
    test a = do
      ke <-  KE.eventToKeyboardEvent a
      co <-  KE.key ke
      log "Key Pressed : "

    main :: forall e. Eff (console :: CONSOLE, dom :: DOM | e) Unit
    main = do
      documenttarget <- liftEff $ window >>= document <#> DHT.htmlDocumentToEventTarget
      addEventListener (EventType "keydown") (eventListener test) true (documenttarget)

您的
测试
功能需要稍微调整一下:

import Prelude

import Control.Monad.Eff (Eff)
import Control.Monad.Eff.Class (liftEff)
import Control.Monad.Eff.Console (CONSOLE, log)
import Control.Monad.Except (runExcept)
import DOM (DOM)
import DOM.Event.Event (Event)
import DOM.Event.EventTarget (addEventListener, eventListener)
import DOM.Event.KeyboardEvent as KE
import DOM.Event.Types (EventType(..))
import DOM.HTML (window)
import DOM.HTML.Types as DHT
import DOM.HTML.Window (document)
import Data.Either (Either(..))

test :: forall e. Event -> Eff ( console :: CONSOLE, dom :: DOM | e) Unit
test a =
  case runExcept (KE.eventToKeyboardEvent a) of
    Left err ->
      log "Event was not a keyboard event"
    Right ke -> do
      let co = KE.key ke
      log "Key Pressed : "

main :: forall e. Eff (console :: CONSOLE, dom :: DOM | e) Unit
main = do
  documenttarget <- liftEff $ window >>= document <#> DHT.htmlDocumentToEventTarget
  addEventListener (EventType "keydown") (eventListener test) true (documenttarget)

for
实际上是一个非常通用的函数,可以用于各种各样的东西,但是在编写针对丑陋的DOM API的代码时,使用它来无声地吸收失败是非常方便的。

您的
测试
函数需要做一些调整:

import Prelude

import Control.Monad.Eff (Eff)
import Control.Monad.Eff.Class (liftEff)
import Control.Monad.Eff.Console (CONSOLE, log)
import Control.Monad.Except (runExcept)
import DOM (DOM)
import DOM.Event.Event (Event)
import DOM.Event.EventTarget (addEventListener, eventListener)
import DOM.Event.KeyboardEvent as KE
import DOM.Event.Types (EventType(..))
import DOM.HTML (window)
import DOM.HTML.Types as DHT
import DOM.HTML.Window (document)
import Data.Either (Either(..))

test :: forall e. Event -> Eff ( console :: CONSOLE, dom :: DOM | e) Unit
test a =
  case runExcept (KE.eventToKeyboardEvent a) of
    Left err ->
      log "Event was not a keyboard event"
    Right ke -> do
      let co = KE.key ke
      log "Key Pressed : "

main :: forall e. Eff (console :: CONSOLE, dom :: DOM | e) Unit
main = do
  documenttarget <- liftEff $ window >>= document <#> DHT.htmlDocumentToEventTarget
  addEventListener (EventType "keydown") (eventListener test) true (documenttarget)
实际上,
for_uu
是一个非常通用的函数,可以用于各种各样的东西,但是在编写针对丑陋的DOM API的代码时,使用它来无声地吸收失败是非常方便的

import Data.Foldable (for_)

test :: forall e. Event -> Eff ( console :: CONSOLE, dom :: DOM | e) Unit
test a =
  for_ (runExcept (KE.eventToKeyboardEvent a)) \ke -> do
    let co = KE.key ke
    log "Key Pressed : "