2013-11-15 222 views
0

無限循環我有這樣的代碼:對元素焦點

$("body").on("focus", ".input", function() { 
     $("body").append("loop<br>"); 
     $(this).find("input").focus(); 
    }); 

小提琴:
http://jsfiddle.net/Hc3D8/

爲什麼它循環?

+0

請檢查小提琴。 –

+4

解釋你正在嘗試做什麼 – charlietfl

+0

當我聚焦包裝,將焦點移動到內部輸入。 –

回答

4

它循環,因爲你是附加功能的focus事件,它本身觸發focus事件。

儘管您在內部input元素上調用focus事件,但它仍會冒泡到外部元素.input

要解決這一點,你可以鉤到一個不同的事件外元素:

$("body").on("click", ".input", function() { // click event 
    $("body").append("loop<br>"); 
    $(this).find("input").focus(); 
}); 

或者你可以在停止傳播focusinput

$("body") 
    .on("focus", ".input", function() { 
     $("body").append("loop<br>"); 
     $(this).find("input").focus(); 
    }) 
    .on('focus', 'input', function(e) { 
     e.stopPropagation(); 
    }); 

Example fiddle

+0

那麼當我關注div時,如何將輸入字段集中在.input div中? –

+0

在'.input'元素上使用不同的事件 - 可能是'click'。 –

+0

我需要關注點,因爲它必須可以用選項卡來選擇...... –

2

因爲您在事件處理程序中再次調用元素.focus()而觸發循環,這會在同一元素上觸發focus事件,從而再次觸發事件處理程序,從而導致它永久循環。

只是刪除$(this).find("input").focus();

編輯:停止事件傳播(和防止focusinput的DOM冒泡到.input並導致循環),你的代碼改成這樣:

$("body").on("focus", ".input", function() { 
     $("body").append("loop<br>"); 
     $(this).find("input").focus(function(e){ e.stopPropagation(); }); 
    }); 

Updated JSFiddle

+0

我把焦點放在'輸入'上,而不是'輸入' –

+1

@FezVrasta,這是由於事件傳播。你的'input'元素在'.input'元素的內部,這意味着'input'上的'focus'事件將DOM上升到'.input'。 – Ennui

+0

@FezVrasta更新我的答案與工作解決方案 – Ennui

1

因爲這會在體內找到輸入並將其聚焦並再次調用該焦點事件。 所以它是無限循環。

$("body").on("focus", ".input", function() { 
    $("body").append("loop<br>"); 
    $(this).find("input").focus(); //this finds the input in body and focus it and call this function again 
}); 

刪除$(this).find("input").focus();

$("body").on("focus", ".input", function() { 
    $("body").append("loop<br>"); 
}); 
0

它循環,因爲在代碼的最後一行:

$(this).find("input").focus(); 

下去,因爲它有一個附加事件與焦點運行,它會循環。

0

IE,Safari,Opera或Firefox中不產生這樣的問題,但Chrome是給這個問題。所以解決它,我們必須使用一些技巧。 我正在提供我自己的解決方案,即 我使用了可見性爲false的按鈕,並在關注焦點結束時嘗試點擊該按鈕以解決問題。像明智的我得到了解決方法。

另一個解決方案 用戶alert語句來解決它。