javascript - 在输入标签上使用 autofocus 属性时不会调用 onfocus

标签 javascript html dom-events autofocus

在下面的示例中,我只得到一个警告框。我读到焦点放在执行 JavaScript 代码之前。有没有办法让它继续工作?

<input id="i" type="text" autofocus onfocus="alert(1)">

<script type="text/javascript">
document.getElementById('i').addEventListener('focus', function() {
    alert(2);
}, false);
</script>

(我只在 Safari 中测试过)

编辑: 我显然可以这样做(Prototypejs 选择器):

var autofocusElement = $$('input[autofocus]')[0];
callListener(autofocusElement);

但与只添加一个事件监听器相比,它看起来很难看。

编辑:

不要担心浏览器不支持自动对焦属性。它很容易解决,就像我在下面的 fiddle 链接中所做的那样。正如我所见,还有解决问题的最佳方法。我的问题是我是否可以用比手动调用监听器更简单的方式来完成。

http://jsfiddle.net/tellnes/7TMBJ/3/

它在 Firefox 3.6 中工作正常,因为 Firefox 不支持自动对焦。但在支持自动对焦的 Safari 中,则不会调用该事件。

最佳答案

来自HTML5 working draft :

There must not be more than one element in the document with the autofocus attribute specified.

所以你无论如何都在要求未定义的行为。

只有一个 autofocus 元素,在 Firefox 3.6 下,这两个处理程序都不会在页面加载时被调用。手动将焦点赋予元素调用两个处理程序(然后进入无限循环,因为警告框在关闭时将焦点返回给元素)。

HTML5 草案确实说 autofocus 应该执行 focusing steps在页面加载上,包括引发 focus 事件,但浏览器目前可能没有以完整或一致的方式实现该功能。

您可能希望在页面加载期间显式调用您的 focus 事件处理程序,直到 HTML5 规范完成并且浏览器开始寻求全面支持。

关于javascript - 在输入标签上使用 autofocus 属性时不会调用 onfocus,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4360542/

相关文章:

javascript - 是否可以在 Javascript 循环中更新浏览器窗口?

javascript - 从客户端浏览器控制台手动响应组件事件触发

javascript - IE8 错误与具有 jQuery 函数的 javascript 文件?

javascript - 向下滚动时如何更改 Logo ?

html - 如何在文本的不同小节下创建多个重叠下划线

javascript - 更改窗口大小时和在导航选项卡之间切换时数据表无法正确调整大小

javascript - 从玩!到 Scalatra,模板化问题,目录结构

javascript - 试图在我的页面上加载 Bootstrap 日历。获取 Uncaught Error

html - 创建这种类型的网格

javascript - 电子邮件和密码与即时用户反馈匹配