可以在HTML中的元素声明之后使用element.focus()吗?

时间:2010-02-11 17:37:19

标签: javascript focus

我想创建一个表单,我想自动将焦点放在字段上。在过去,我学会了总是等待任何DOM操作,直到window.onload被触发,因为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的例子)

此外,Google Closure团队建议采用以下做法:“the preferred way is to use inline scripts as soon as possible”,与another answer on SO州一样。

我不想辩论这是不是坏习惯(一般来说,我同意内容和行为应该分开的意见,最好是在单独的文件中)。我的问题是:这可能有害吗?例如,在某些浏览器中导致错误消息,因为该字段可能仍未正确呈现(并且不要忘记移动浏览器)。任何建议都表示赞赏。

2 个答案:

答案 0 :(得分:3)

不,它没有害处,它是(主观)最佳方式。

这是最好的原因:

  • 代码尽快成功执行(而不是等待整个DOM,它等到达到某个元素)
  • 不依赖于DOM事件(尚未标准化)

糟糕的原因:

  • 缺乏行为分离
  • 难以维护,因为代码将遍布各地
  • 由于存在多个<script>标记
  • 而增加了整体页面大小

答案 1 :(得分:3)

说实话,我想如果你看到弹出的页面和获得焦点的元素之间出现延迟,那么这确实表明你的页面可能太大了,所以减少那个就是你的第一个停靠港。我知道如果我看到这样的内联代码,我会非常不高兴。正如约什所说,这将成为可维护性的噩梦。

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