在以下示例中,我只获得一个警告框。我读到焦点是在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);
但与仅添加事件监听器相比,它看起来很丑陋。
编辑:
不要担心自动对焦属性缺乏浏览器支持。它很容易解决,就像我在下面的链接中所做的那样。我可以看到,这个问题也是最好的解决方案。我的问题是,如果我能够做得比不必手动调用监听器那么难看。
http://jsfiddle.net/tellnes/7TMBJ/3/
它在Firefox 3.6中运行正常,因为Firefox不支持自动对焦。但是在支持自动对焦的Safari中,并不是所谓的事件。
答案 0 :(得分:5)
一定不能超过一个 文件中的元素 指定了
autofocus
属性。
所以你无论如何都要求未定义的行为。
在Firefox 3.6下只有一个autofocus
元素,在页面加载时都不会调用这两个处理程序。手动将焦点放在元素上会调用两个处理程序(然后进入无限循环,因为警报框在关闭时将焦点返回给元素)。
HTML5草案确实说autofocus
应该在页面加载时执行focusing steps,包括提升focus
事件,但很可能浏览器当前没有在完整版中实现该功能或一致的方式。
您可能希望在页面加载期间显式调用focus
事件处理程序,直到HTML5规范完成并且浏览器开始瞄准完全支持。
答案 1 :(得分:0)
您当前示例中的以下代码:
<input id="i" type="text" autofocus onfocus="alert(1)">
<script type="text/javascript">
document.getElementById('i').addEventListener('focus', function() {
alert(2);
}, false);
</script>
会导致从1
到2
[eidt]
因为:(这只发生在支持autofocus
)
输入获取自动聚焦,触发事件触发警报,警报抓取焦点,单击确定,输入抓取焦点,焦点事件触发新事件现在触发两个不同的警报(现在DOM已满载,因此新事件添加了另一个警报),两个警报抓住焦点,单击确定,单击确定,输入抓取焦点触发新事件现在触发两个不同的警报,警报抓取焦点,单击确定,下一个警报抓取焦点,单击确定,输入抓取焦点,触发两个事件,警报抓取焦点,单击确定,下一个警报抓取焦点,单击确定,输入抓取焦点,触发两个事件,警报抓取焦点,单击确定,下一个警报抓取焦点,单击确定,输入抓取焦点,触发两个事件,警报抓取焦点,单击确定,下一步警报抓取焦点,单击确定,输入抓取焦点,触发两个事件,输入抓取焦点,触发两个事件,警报抓取焦点,单击确定,下一个警报抓取焦点,单击确定,输入抓取焦点,触发两个事件,输入抓取焦点,触发两个事件,警报抓取焦点,单击确定,下一个警报抓取焦点,单击确定,输入抓取焦点,触发两个事件,输入抓取焦点,触发两个事件,警报抓取焦点,单击确定,下一个警报抓取焦点,单击确定,输入抓取焦点,触发两个事件......
无限过程FTW的文字描述!....? :P
[/编辑]
在之前的应用了两个自动对焦的示例中,似乎最后一个将按照我在底部附加的示例执行。我还添加了一种基于类名向每个输入添加焦点事件的方法......不确定你是否正在寻找它,但它可能会有所帮助。
答案 2 :(得分:0)
您需要为自动对焦赋值。
<input id="i" type="text" onfocus="alert(1)" autofocus="">
答案 3 :(得分:0)
答案 4 :(得分:-1)
如果您需要为onfocus
执行一段javascript代码input
,则可以使用jQuery:http://api.jquery.com/focus/