type Msg
= FocusOn String
| FocusResult (Result Dom.Error ())
update : Msg -> Model -> ( Model, Cmd Msg )
update msg model =
case msg of
FocusOn id ->
( model, Dom.focus id |> Task.attempt FocusResult )
FocusResult result ->
-- handle success or failure here
case result of
Err (Dom.NotFound id) ->
-- unable to find dom 'id'
Ok () ->
-- successfully focus the dom
6条答案
按热度按时间vngu2lb81#
elm-lang/dom包中的
focus
函数用于使用Task
设置焦点(不使用任何port
或JavaScript)。在内部,它使用
requestAnimationFrame
来确保在尝试查找要关注的DOM节点之前呈现任何新的DOM更新。使用示例:
Full example on Ellie
j5fpnvbx2#
解决方法是使用Mutation Observers。将此JavaScript插入到HTML主页或Elm代码的主视图中:
然后通过包含
Html.Attributes.attribute "data-autofocus" ""
创建HTML元素。kqhtkvqz3#
使用elm/html 0.19可以将
Html.Attrbutes autofocus
设置为True
bvpmtnay4#
我最近花了不少时间来探索这个问题,不幸的是,我认为现有的
elm-html
库不可能做到,但是我想出了一个办法,利用css动画来触发一个事件,并将其嵌入到纯js中。这是我用一个
script
节点和一个style
节点在Elm中的破解。在我看来,它非常丑陋。30byixjq5#
在Elm 0.19中,使用
Browser.Dom.focus
:如果聚焦失败,您可以选择忽略(如上文所述),或者通过触发更新消息来执行操作。
ljsrvy3e6#
Elm 0.19的
Browser.Dom.focus
是现代解决方案