以下のサンプル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
0 件のコメント:
コメントを投稿