gpt4 book ai didi

Elm - 如何检测当前焦点

转载 作者:行者123 更新时间:2023-12-04 17:31:27 24 4
gpt4 key购买 nike

你如何在 Elm 中获得当前的焦点?我知道如何使用 Elm 设置焦点,但我找不到任何功能来检测当前具有焦点的内容。

最佳答案

elm-lang/dom package 允许在给定 ID 的元素上设置焦点,但它不允许您获取当前聚焦的元素。它暗示您可以使用 document.activeElement 为了这。为此,您必须使用端口。

这是一个人为的例子。假设您有一个 Model包含当前选择的 id 和我们将很快创建的一些文本框的所有 id 的列表。

type alias Model =
{ selected : Maybe String
, ids : List String
}

我们将使用的 Msgs 将能够查询焦点以及使用 Dom 库来设置焦点:
type Msg
= NoOp
| FetchFocused
| FocusedFetched (Maybe String)
| Focus (Maybe String)

为此,我们需要两个端口:
port focusedFetched : (Maybe String -> msg) -> Sub msg

port fetchFocused : () -> Cmd msg

调用这些端口的 javascript 将报告当前 document.activeElement :

var app = Elm.Main.fullscreen()
app.ports.fetchFocused.subscribe(function() {
var id = document.activeElement ? document.activeElement.id : null;
app.ports.focusedFetched.send(id);
});

该 View 显示当前选定的 id,提供一个按钮列表,这些按钮将焦点设置在下面编号的文本框之一上。
view : Model -> Html Msg
view model =
div []
[ div [] [ text ("Currently selected: " ++ toString model.selected) ]
, div [] (List.map viewButton model.ids)
, div [] (List.map viewInput model.ids)
]


viewButton : String -> Html Msg
viewButton id =
button [ onClick (Focus (Just id)) ] [ text id ]


viewInput : String -> Html Msg
viewInput idstr =
div [] [ input [ id idstr, placeholder idstr, onFocus FetchFocused ] [] ]
update函数将它们联系在一起:
update : Msg -> Model -> ( Model, Cmd Msg )
update msg model =
case msg of
NoOp ->
model ! []

FetchFocused ->
model ! [ fetchFocused () ]

FocusedFetched selected ->
{ model | selected = selected } ! []

Focus (Just selected) ->
model ! [ Task.attempt (always NoOp) (Dom.focus selected), fetchFocused () ]

Focus Nothing ->
{ model | selected = Nothing } ! [ fetchFocused () ]

这是一个 working example on ellie-app.com .

关于Elm - 如何检测当前焦点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43928613/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com