代码之家  ›  专栏  ›  技术社区  ›  Marcel Korpel

在HTML中的元素声明之后使用element.focus()是否有害?

  •  3
  • Marcel Korpel  · 技术社区  · 15 年前

    我想制作一个窗体,在该窗体中我想自动将焦点放在一个字段上。在过去的日子里,我学会了总是等到window.onload启动后再进行DOM操作,因为DOM可能还没有准备好。自从jquery以来,domcontentready事件变得很有名,它的触发(在兼容的浏览器中)比window.onload早一些。

    这仍然会在显示字段和获得焦点之间产生延迟(通过在window.onload中使用document.getElementByID(“inputfield”).focus()或在触发domcontentready之后)。为了尽量减少延迟,有些人建议在页面中的元素后面直接使用focus(),比如:

    <form name="f">
      <input id="q" autofocus>
      <script>
        if (!("autofocus" in document.createElement("input"))) {
          document.getElementById("q").focus();
        }
      </script>
      <input type="submit" value="Go">
    </form>
    

    实例 Dive Into HTML5 )

    此外,谷歌关闭团队建议这样做:“ the preferred way is to use inline scripts as soon as possible “,像 another answer on SO 国家。

    我不想争论这是否是不好的做法(一般来说,我同意内容和行为应该分开的观点,最好是分开的文件)。我的问题是: 这会有害吗? 例如,在某些浏览器中导致错误消息,因为字段可能仍然没有正确呈现(并且不要忘记移动浏览器)。感谢您的任何建议。

    2 回复  |  直到 12 年前
        1
  •  3
  •   Josh Stodola    15 年前

    不,这不是有害的,而且是(主观的)最好的方法。

    最好的理由:

    • 代码尽可能快地执行(而不是等待整个DOM,而是等到它到达某个元素为止)
    • 不依赖于DOM事件(这些事件仍然需要标准化)

    它吸的原因:

    • 缺乏行为分离
    • 很难维护,因为代码将分散在各处
    • 由于存在多个 <script> 标签
        2
  •  3
  •   Paul Manzotti    15 年前

    老实说,我想如果你看到页面弹出和获得焦点的元素之间有延迟,那么这确实意味着你的页面可能太大了,所以减少页面会是你的第一个调用端口。我知道如果看到这样的内联代码,我会非常不高兴。正如乔希所说,这将是一个可维护性的噩梦。

    但是,关于它是否有害的问题,我认为如果浏览器已经处理了脚本节点来运行javascript,那么它也将处理输入节点,因此代码应该可以使用它。因此,我不希望出现错误。