当前位置: 首页 > 知识库问答 >
问题:

如何在Elm中设置元素的焦点?

查淮晨
2023-03-14

如何在Elm中设置Html元素的焦点?我试图在元素上设置自动聚焦属性,它只在页面加载上设置焦点。

共有3个答案

邹高峻
2023-03-14

我最近花了不少时间来探索这一点。不幸的是,我认为使用现有的elmhtml库是不可能的。然而,我想出了一个利用css动画触发事件并将其嵌入纯js的方法。

下面是我在Elm中使用脚本节点和样式节点的技巧。在我看来这很难看。

import Html exposing (div, button, text, input, node)
import Html.Events exposing (onClick)
import Html.Attributes exposing (type', class)
import StartApp.Simple

main =
  StartApp.Simple.start { model = model, view = view, update = update }

model = []

view address model =
  -- View now starts with a <style> and <script> (hacky)
  (node "style" [] [ Html.text style ]) ::
  (node "script" [] [Html.text script ]) ::
  (button [ onClick address AddInput ] [ text "Add Input" ]) ::
  model |>
  div []    

type Action = AddInput 

update action model =
  case action of
    AddInput -> (Html.p [] [input [type' "text", class "focus"] []]) :: model

-- Use pure string css (hacky)

style = """
.focus {
  animation-name: set-focus;
  animation-duration: 0.001s;
  -webkit-animation-name: set-focus;
  -webkit-animation-duration: 0.001s;
}
@-webkit-keyframes set-focus {
    0%   {color: #fff}
}
@keyframes set-focus {
    0%   {color: #fff}
}
"""

-- Cheating by embedding pure javascript... (hacky)

script = """
var insertListener = function(event){
 if (event.animationName == "set-focus") {
   event.target.focus();
 }               
}
document.addEventListener("animationstart", insertListener, false); // standard + firefox
document.addEventListener("MSAnimationStart", insertListener, false); // IE
document.addEventListener("webkitAnimationStart", insertListener, false); // Chrome + Safari
"""
边霄
2023-03-14

一个解决方法是使用变异观察员。在主HTML页面或Elm代码的主视图中插入此JavaScript:

js prettyprint-override">var observer = new MutationObserver(function(mutations) {
  mutations.forEach(function(mutation) {
    handleAutofocus(mutation.addedNodes);
  });
});
var target = document.querySelector('body > div');
var config = { childList: true, subtree: true };
observer.observe(target, config);

function handleAutofocus(nodeList) {
  for (var i = 0; i < nodeList.length; i++) {
    var node = nodeList[i];
    if (node instanceof Element && node.hasAttribute('data-autofocus')) {
      node.focus();
      break;
    } else {
      handleAutofocus(node.childNodes);
    }
  }
}

然后通过包含Html创建超文本标记语言元素。ttributes.attribute数据自动对焦

商飞翮
2023-03-14

elm lang/dom包中的focus函数用于通过任务设置焦点(不使用任何端口或JavaScript)。

在内部,它使用请求动画框架来确保在它试图找到要关注的DOM节点之前呈现任何新的DOM更新。

使用示例:

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

艾莉的完整例子

 类似资料:
  • 我有一个网页表单,里面有一个文本框。默认情况下,如何将焦点设置为文本框? 像这样的东西: 有人能帮我吗?我不知道如何用JavaScript设置文本框的焦点。

  • 考虑到jquery的方式,但我想用angular的方式来实现这一点,我做了一个解决方案,我们使用元素的id在任何函数中设置焦点,所以,由于我在angular方面非常新手,我想了解一些意见,如果这种方式是正确的,有什么问题,无论什么,任何可以帮助我在angular中更好地实现这一点的方法。 基本上,我创建一个指令,监视用户用指令定义的作用域值,或者默认的focusElement,当该值与元素的id相

  • 问题内容: 在查看了如何使用角度设置焦点元素的示例后,我看到它们中的大多数使用一些变量来监视然后设置焦点,并且它们中的大多数对于要设置焦点的每个字段使用一个不同的变量。在具有许多字段的形式中,这意味着存在许多不同的变量。 考虑到jquery的方式,但是想以角度的方式做到这一点,我提出了一个解决方案,我们使用元素的id将焦点设置在任何函数上,因此,由于我在角度上非常陌生,因此我希望得到一些意见那个方

  • 问题内容: 我让我的游戏在没有鼠标的情况下运行,因此不能使用指针。当玩家输球时将显示高分菜单。 这是我的代码 我努力了 但仍然没有专注于我的。 如何聚焦呢? 问题答案: 如果希望在GUI显示时集中精力,可以使用以下方法: 哪里会是你和你的。

  • 问题内容: 我有一个带有文本框的Web表单。默认情况下,如何将焦点设置到文本框? 像这样: 所以有人可以帮我吗?我不知道如何使用JavaScript将焦点设置到文本框。 问题答案: 做这个。 如果您的元素是这样的。 您的脚本是

  • 问题内容: 我想做类似的事情: 但是在控制器中时,我尝试: 返回null,那么如何使用AngularJS变量设置元素的ID? 问题答案: 当angular 在引导您的应用程序时遇到指令时,该函数仅运行一次。发生这种情况时,您要从DOM访问的元素还不存在。 从控制器 执行 DOM操作不是一个好习惯 ,伪指令可以解决您面临的问题。您的用例可以通过CSS来解决,只需切换类即可,但是我想您想做的不仅仅是设