2009年11月22日
jQuery focus()によるIEとFirefox動きの違い
jQueryのfocus()はデフォルトのフォーカス動作とそのエレメントにバインドされたイベントが実行されます。
しかしIE8とFirefoxではこのfocus()の動作が多少違います。
現象
例えば複数のinput要素があって、それぞれfocusイベントとblurイベントがバインドされたとします。
focus()を実行する前はelem1にフォーカスしていて、要素$('elem2').focus()を実行すると
- Firefox 3.5.5ではelem1のblurイベントが実行した後に、elem2のfocusイベントが実行する
- IE8ではelem1のblurイベントは実行されますが、elem2には2回フォーカスするように動作します。
つまり下記の動きです。
- elem1のblurイベント
- elem2のfocusイベント
- elem2のblurイベント
- elem2のfocusイベント
普通に考えたらFirefoxの動きが正しいはずですよね。
上記の3と4は余計な処理になります。
サンプルコード
$("form :input").bind("focus", function() {
$(this).css("background-color", "gray");
// ログを出力
$("#result").append($(this).get(0).id + " focus event triggered.<br>");
}).bind("blur", function() {
$(this).css("background-color", "");
// ログを出力
$("#result").append($(this).get(0).id + " blur event triggered.<br>");
});
$("#foo").focus();
setTimeout(focusBar, 3000);
function focusBar() {
$("#" + document.activeElement.id).trigger('blur');
$("#bar").focus();
};
Foo<input id="foo" type="text" />
Bar<input id="bar" type="text" />
<div id="result"></div>
先にfooテキストエリアにフォーカスしてくささい。
3秒後にbarテキストエリアにfocus()メソッドでフォーカスします。
その時の出力ログを見てください。
回避策
まだいい方法はつかんでません。
Googleで検索すると似たようなものはありましたが、
回避策はまだないようです。