2011年11月17日木曜日

[JavaScript] フォームの入力フィールドにオートフォーカスする

ページがロードされた時に、ユーザーIDや検索ワードなどの入力フィールドに自動的にフォーカスさせる方法について、javascriptとhtml5を使って確認してみます。
以下のサンプルhtmlについて、input id="focus_target" にオートフォーカスさせる場合を考えます。
htmlサンプル
<body>
<form>
<input type="text" id="focus_target" />
<input type="submit" />
</form>

<!-- 膨大なコンテンツ -->
<!-- 省略 -->
<!-- 膨大なコンテンツ -->
</body>

方法1. window のロードを待ってからfocus()メソッドを呼び出す


まず思いつく方法として、windowのロードが完了してから、要素のfocus()メソッドを呼び出す方法があります。
window.onload = function(){
    var target = document.getElementById("focus_target");
    target.focus();
}
ただしこの方法だと、ページのロード中にユーザーが別の入力フィールドフォーカスを移動させた場合、わざわざjavascriptが最初のフィールドにフォーカスが戻してしまうという、困った問題が発生する可能性があります。
なので、この方法はなるべく避けたいところです。
代替案としては、jQueryが使えるなら、
$(document).ready($("#focus_target").focus());
のようにdocumentのロード完了時にfocusすれば、ページ内のテキストがすべてロードされた時点でフォーカスが実行されますが、やはりサイズの大きなページや、遅いネットワークから接続している場合は、同じ問題が発生する可能性があります。

方法2.input要素の直下に<script>タグを挿入

上記の問題を回避する方法としては、自動フォーカスしたい<input>タグの直下に<script>タグを挿入する方法があります。
<body>
<form>
<input type="text" id="focus_target" />
<script>document.getElementById("focus_target").focus()</script>
<input type="submit" />
</form>
</body>
input要素がロードされた直後にfocus()を呼び出しているため、方法1. の問題は回避できます。

方法3.html5のautofoucs属性を適用する

HTML5では、すべてのフォームコントロールにautofocus属性が導入されました。
<input type="text" id="focus_target" autofocus />
html5のautofocusは単なるマークアップなので、すべてのブラウザで振る舞いが統一されます。ちなみにautofocus属性をサポートしていないブラウザは、単純にこれを無視するだけです。
以下の関数で,要素がautofocus属性を持っているか検証できます。
functiton supports_input_autofocus() {
    var i = document.createElement('input');
    return 'autofocus' in i;
}

まとめ


フォームの入力フィールドにオートフォーカスさせたい場合は、、

1. まずはhtml5のautofocus属性を設定しておき、autofocusをサポートしていない場合のみ、focus()を呼び出す
<body>
<form>
<input type="text" id="focus_target" autofocus />
<script>
if (!supports_input_autofocus()) {document.getElementById("focus_target").focus()};
</script>
<input type="submit" />
</form>
</body>

2. window の load が完了するのを待ってからfocus() するのはなるべく避ける

参考文献:入門 HTML5

入門 HTML5
入門 HTML5

0 件のコメント:

コメントを投稿