2011-08-12 58 views
22

我一直在为这个other question进行一些测试,当时我发现了一些非常奇怪的东西。 FF4/5无法触发focus jQuery事件。 The other question可能被认为是重复的,被封闭并被接受而没有真正的答案。jQuery Focus在Firefox上失败

对于问题本身,我想下面的代码简单的位:

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

它运作良好,在Chrome和IE中,但在FF失败。这里是我们中间懒人的jsFiddle

任何人都可以解释这种行为吗?或者它是一个已知的错误?

+1

我会非常感兴趣的任何光流洒在此。欢呼的职位。 – Somk

回答

46

我想我之前遇到过这种情况,如果我没有记错,它似乎是某种重入问题。我的印象是,因为FF已经处于焦点转移的过程中,所以不会让你发起另一个焦点转换。我相信我的解决办法是像

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

这是我提供的解决方法,它工作完美。 – Somk

+4

+1因为'focus()'在Firefox中有效。只有在这个'focusout()'中包含这个问题时,才会导致问题。 – tw16

+0

实际上,setTimeout(func,0)应该足够了,因为函数会从执行线程的上下文中取出并在之后立即执行。 100ms可能导致一些闪烁:) –

3

manual说aboult .focus()呼叫

此方法是.trigger( '专注')

,并从.trigger()主题的快捷方式

尽管.trigger()simul提供了一个事件激活,并与一个合成的事件对象一起完成,但它不能完美地复制一个自然发生的事件。

所以我的理解是,呼叫$(this).focus();应该触发onfocus事件(如果有一个附着在物体上),但不quaranteed实际设置/改变聚焦对象。

+1

但事实仍然只是在Firefox失败。 –

+1

是的,但它不是一个错误,因为它是一种记录的限制(不是很清楚地说明了思想)。 – ain

0

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

$(document).ready(function() { 
setTimeout(function() { $('#myid').focus(); }, 100); 
}); 
0

焦点似乎现在在最新的Firefox工作,而不需要setTimeout函数。

如果您还想选择输入字段,您将不得不使用.select()函数作为document.execCommand('SelectAll');似乎也无法在Firefox上工作。

所以让输入字段先聚焦然后选中然后你就可以复制它或者做任何你想要的东西。

在我的使用情况下,我需要的URL从输入字段复制,如果有人按下了复印按钮:

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

我希望这能帮助别人谁在寻找这个问题!

+0

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

相关问题