2011-08-12 61 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

相關問題