jQuery Focus 在 firefox 上失败

jQuery Focus fails on firefox

提问人:Madara's Ghost 提问时间:8/13/2011 最后编辑:CommunityMadara's Ghost 更新时间:1/8/2017 访问量:23989

问:

我一直在为另一个问题进行一些测试,当我注意到一些非常奇怪的事情时。FF4/5 无法触发 jQuery 事件。另一个可能被视为重复的问题被关闭并被接受,但没有真正的答案。focus

对于问题本身,我尝试了以下简单的代码:

$('#target').focusout(function() {
    $(this).focus();
});

它在 Chrome 和 IE 中运行良好,但在 FF 上失败。这是我们中间懒惰者的 jsFiddle

谁能解释这种行为?还是已知错误?

jQuery 火狐浏览器

评论

1赞 Somk 8/13/2011
我会对这方面的任何启示非常感兴趣。为这个帖子干杯。

答:

49赞 chaos 8/13/2011 #1

我想我以前遇到过这个问题,如果我没记错的话,这似乎是某种重入问题。我的印象是,因为FF已经在转移焦点的过程中,它不会让你发起另一个焦点转移。我相信我的解决方法是这样的

$('#target').focusout(function() {
    setTimeout(function() {
        $(this).focus();
    }, 0);
});

评论

0赞 Somk 8/13/2011
这是我得到的解决方法,它运行良好。
4赞 tw16 8/13/2011
+1,因为在Firefox中确实有效。只有当它包含在其中时,似乎才会引起麻烦。focus()focusout()
0赞 Jørgen 8/13/2011
实际上,setTimeout(func, 0) 应该就足够了,因为该函数是从执行线程的上下文中取出的,并在之后立即执行。100 毫秒可能会导致一些闪烁:)
2赞 Swanny 4/23/2013
已确认超时 0 将起作用。此外,它不仅仅是 focusout(),而是任何涉及焦点更改的操作,在我的情况下只是一个简单的 .click() 处理程序。
1赞 Camaleo 4/1/2014
我刚刚发现您可能需要等到页面准备就绪。我试图从AJAX加载的内容中设置焦点,并能够使用以下代码获得结果:<code>jQuery(document).ready(function() { setTimeout(function() { jQuery('input[name=your-name]').focus(); }, 1500);</代码>
3赞 ain 8/13/2011 #2

手册上写着 aboult call.focus()

此方法是 .trigger('focus') 的快捷方式

.trigger() 主题

尽管 .trigger() 模拟了事件激活,并完成了合成的事件对象,但它并不能完美地复制自然发生的事件。

因此,据我了解,该调用应该触发 OnFocus 事件(如果有一个附加到对象),但不会实际设置/更改焦点对象。$(this).focus();

评论

1赞 Madara's Ghost 8/13/2011
然而,事实仍然只在firefox中失败。
1赞 ain 8/13/2011
是的,但这不是一个错误,因为它是一种记录在案的限制(不是很清楚地阐明了想法)。
0赞 daniel 6/29/2015 #3

这在 Firefox 38 中对我有用。我需要测试不同的延迟毫秒。感谢@camaleo评论。

$(document).ready(function() {
setTimeout(function() { $('#myid').focus(); }, 100);
});
0赞 Rafaël De Jongh 1/8/2017 #4

焦点现在似乎在最新的 Firefox 中起作用,不需要 setTimeout 函数。

如果您还想选择输入字段,则必须使用 .select() 函数,但作为 document.execCommand('SelectAll');似乎也不适用于 Firefox。

因此,首先聚焦输入字段,然后选择输入字段,然后您可以复制它或对它做任何您想做的事情。

在我的用例中,如果有人按下了复制按钮,我需要从输入字段中复制 url:

$(".copyURL").click(function(){ 
    $(this).prev().focus().select();
    document.execCommand("Copy",false,null);
});

我希望这可以帮助任何正在寻找这个问题的人!

评论

0赞 tgoneil 1/10/2017
我刚刚下载了最新的firefox(v50.1),发现它没有解决问题。也许 linux 版本没有修复错误?同时,非常感谢 @chaos 的 focusout 和 setTimeout(使用 0 毫秒)技巧。这确实解决了问题。