HTML Elm 中的文本区域,其中按 Tab 键会添加 \t 并且不会改变焦点
HTML textarea in Elm where pressing tab adds \t and doesn't change focus
我知道如何在 Elm 中监听 Tab 键按下。我知道如何使用 onWithOptions
:
来阻止焦点被改变
textarea
[ onWithOptions "keydown" (Options False True) <| Decode.map KeyDown keyCode ] []
然后我可以在我的 update
函数中检查按下的 keyCode
是否为 9,代表一个制表符。现在的问题是 textarea
的默认行为不起作用。我输入的任何内容都不会出现在 textarea
中。很简单,我只需将我键入的任何内容添加到 model
并使 textarea
的值成为模型。现在我的光标有问题,更重要的是,剪贴板粘贴不起作用...
如何让选项卡在 Elm 中与 textarea
s 一起正常工作?通常,如果按下 tab 键,只调用 preventDefault()
似乎是有意义的。如何在 Elm 中有条件地调用 preventDefault()
?
Elm 确实支持通过 Decoder
成功或失败的条件事件传播。只需 map
您要在 update
函数中响应的消息类型:
succeededIfTabKey : Int -> Decode.Decoder Int
succeededIfTabKey key =
if key == 9 then
Decode.succeed key
else
Decode.fail "non-tab"
tabPressed : Decode.Decoder Msg
tabPressed =
Decode.andThen succeededIfTabKey keyCode
|> Decode.map (always TabPressed)
然后将其用作输入元素的属性:
onWithOptions "keydown" { defaultOptions | preventDefault = True } tabPressed
这并不适用于所有情况。如果您希望某些 keydown
事件不 preventDefault()
,而其他 keydown
事件不 preventDefault()
,那么您就不走运了。
我知道如何在 Elm 中监听 Tab 键按下。我知道如何使用 onWithOptions
:
textarea
[ onWithOptions "keydown" (Options False True) <| Decode.map KeyDown keyCode ] []
然后我可以在我的 update
函数中检查按下的 keyCode
是否为 9,代表一个制表符。现在的问题是 textarea
的默认行为不起作用。我输入的任何内容都不会出现在 textarea
中。很简单,我只需将我键入的任何内容添加到 model
并使 textarea
的值成为模型。现在我的光标有问题,更重要的是,剪贴板粘贴不起作用...
如何让选项卡在 Elm 中与 textarea
s 一起正常工作?通常,如果按下 tab 键,只调用 preventDefault()
似乎是有意义的。如何在 Elm 中有条件地调用 preventDefault()
?
Elm 确实支持通过 Decoder
成功或失败的条件事件传播。只需 map
您要在 update
函数中响应的消息类型:
succeededIfTabKey : Int -> Decode.Decoder Int
succeededIfTabKey key =
if key == 9 then
Decode.succeed key
else
Decode.fail "non-tab"
tabPressed : Decode.Decoder Msg
tabPressed =
Decode.andThen succeededIfTabKey keyCode
|> Decode.map (always TabPressed)
然后将其用作输入元素的属性:
onWithOptions "keydown" { defaultOptions | preventDefault = True } tabPressed
这并不适用于所有情况。如果您希望某些 keydown
事件不 preventDefault()
,而其他 keydown
事件不 preventDefault()
,那么您就不走运了。