Elm 如何制作自定义事件解码器以在鼠标滚轮移动时获取鼠标 x/y 位置

Elm How to make custom event decoder to get mouse x/y position at mouse-wheel-move

我试图在 Elm 0.19 编程语言中的鼠标滚轮移动事件期间获取鼠标的 x 和 y 坐标。 我尝试用这个包。请参阅 "Advanced Usage" 下的内容: https://package.elm-lang.org/packages/mpizenberg/elm-pointer-events/3.1.0/Html-Events-Extra-Wheel

这个包本身没有描述清楚的例子所以我在类似的包中找了一个例子。 请参阅本页 "advanced usage" 下的示例: https://package.elm-lang.org/packages/mpizenberg/elm-pointer-events/3.1.0/Html-Events-Extra-Mouse

这个例子与我需要的非常相似,但我也无法让它工作。得到完全相同的问题。

这是我根据示例改编的代码以适应鼠标滚轮:

module WheelDecoder exposing(..)

import Html exposing (div, text)
import Html.Events.Extra.Wheel as Wheel
import Json.Decode as Decode


type alias WheelEventWithOffsetXY =
  { wheelEvent : Wheel.Event
  , offsetXY : {x: Float, y: Float}
  }

decodeWeelWithOffsetXY : Decode.Decoder WheelEventWithOffsetXY
decodeWeelWithOffsetXY =
  Decode.map2 WheelEventWithOffsetXY
    Wheel.eventDecoder
    offsetXYDecoder

offsetXYDecoder : Decode.Decoder {x: Float, y: Float}
offsetXYDecoder =
  Decode.map2 (\a b -> {x=a,y=b})
    (Decode.field "offsetY" Decode.float)
    (Decode.field "offsetY" Decode.float)

type Msg
  = WheelOffsetXY {x: Float, y: Float}

view = 
  div
    [ (onWheelOffsetXY (\wheelEvent -> WheelOffsetXY (wheelEvent.offsetXY))) ]
    [ (text "mousewheel here") ]


onWheelOffsetXY : (WheelEventWithOffsetXY -> msg) -> Html.Attribute msg
onWheelOffsetXY tag =
  let
    options = { stopPropagation = True, preventDefault = True }
    func = Decode.map tag decodeWeelWithOffsetXY
    attribute = Wheel.onWithOptions options func
  in
    attribute

当我尝试使用 "elm make" 进行编译时,出现以下错误:

-- TYPE MISMATCH -------------------------------------- src/Map/WheelDecoder.elm

The 2nd argument to `onWithOptions` is not what I expect:

39|     attribute = Wheel.onWithOptions options func
                                                ^^^^
This `func` value is a:

    Decode.Decoder msg

But `onWithOptions` needs the 2nd argument to be:

    Wheel.Event -> msg

Hint: I always figure out the argument types from left to right. If an argument
is acceptable, I assume it is “correct” and move on. So the problem may actually
be in one of the previous arguments!

这条错误消息是有道理的,因为我看到类型不匹配,但我不知道如何解决它。

似乎 Wheel.eventDecoder 应该与 Html.Events.onHtml.Events.onWithOptions 一起使用,而不是 Wheel.onWithOptions。这些在 0.19 中被移除,取而代之的是 Html.Events.custom,然而,这略有不同。用这个替换 onWheelOffsetXY 似乎可行:

onWheelOffsetXY : (WheelEventWithOffsetXY -> msg) -> Html.Attribute msg
onWheelOffsetXY tag =
  let
    options message =
        { message = message
        , stopPropagation = True
        , preventDefault = True
        }
    decoder =
        decodeWeelWithOffsetXY
        |> Decode.map tag 
        |> Decode.map options
  in
  Html.Events.custom "wheel" decoder

PS:顺便说一句,decodeWeelWithOffsetXY 中有一个错字。我没有打错字。

PPS:此外,您正在查看过时的文档。 Here's the documentation for the latest version.