• 締切済み

フォーカス設定について教えてください。

フォーカス設定について教えてください。 テキストボックスに入力エラーがあった場合(数値チェックなど)、以下のようなスクリプトでメッセージボックスを出し、エラー項目にフォーカスをあて、エラー項目の背景色を変更しています。 通常は、問題なく動作するのですが、テキストボックス→セレクトボックスという順番にフォーム部品が並んでいると、エラー項目のテキストボックスと次の部品であるセレクトボックスの両方にフォーカスが当たってしまいます。 テキストボックスのみにフォーカスを当てたいのですか、どなたか理由と解決策を教えていただけないでしょうか。 よろしくお願いします。 //=================================================== // クライアントエラー時の処理 // 引数 1. oItem : エラー項目オブジェクト //=================================================== function onErrorItem(oItem) { var sErrCls = ""; var sErrCls = oItem.className; if ( sErrCls.substr(0, 3) != "err" ) { sErrCls = "err" + sErrCls; } //項目背景色反転&前回分項目背景色反転解除 fncObjTurnOver(oItem, sErrCls); //フォーカス設定 if ((oItem.type == "text") || (oItem.type == "password")) { //テキストボックスの場合 oItem.select(); }else{ oItem.focus(); } } /*エラーチェック*/ function fnCheckNum(object,msgID,msgParam){ if(fncIsNum(object) <0){ //メッセージボックスを出す fncMsgPopUp(msgID, msgParam, null); onErrorItem(object); } } <呼び出し元> <input type="text" size="3" name="hospCount" maxlength="2" class="InputNum" onblur="fnCheckNum(this,'E0004','病院数');">

noname#119028
noname#119028

みんなの回答

  • think49
  • ベストアンサー率59% (285/482)
回答No.4

「blur の後 focus できない」現象は Google Chrome 6, Firefox v3.6.6 で再現できました。 IE8, Opera v10.62 では再現しないようです。 どちらの動作が正しいのか、はちょっとわかりませんでした。 初めはイベントの実行順 (「focus -> click -> blur」の順に発火) に関係あるのかと思いましたが、focus() を実行するのはまた別の問題のような気もしますし…。 #1 さん紹介のコードで回避できることを確認できましたが、jQueryコードのようなので標準のJavaScriptコードでサンプルを書いてみました。(Google Chrome 6, Firefox v3.6.6, Opera v10.62, IE8 で動作確認済み) (※以下、全角空白は半角空白に置換してください) <form><p><input id="CHECK_NUMBER" type="text" /></p></form> <script type="text/javascript"><!-- (function () {  function blurListener (event) {   var input = event.target;   if (input.id !== 'CHECK_NUMBER') return;   setTimeout(inputError, 1, input);  }  function blurHandler (event) {   var input = event.srcElement;   if (input.id !== 'CHECK_NUMBER') return;   inputError(input, true);  }  function insertAfter (newElement, referenceElement) {   var nextSibling = referenceElement.nextSibling, parentNode = referenceElement.parentNode;   nextSibling ? parentNode.insertBefore(newElement, nextSibling) : parentNode.appendChild(newElement);  }  function inputError (input) {   var nextSibling = input.nextSibling,     text;   if (/^\d+$/.test(input.value)) {    if (nextSibling) nextSibling.parentNode.removeChild(nextSibling);   } else {    text = input.ownerDocument.createTextNode('数値を入力してください');    nextSibling ? nextSibling.parentNode.replaceChild(text, nextSibling) : insertAfter(text, input);   }  }  if (document.addEventListener) {   document.addEventListener('blur', blurListener, true);  } else if (document.attachEvent) {   document.getElementById('CHECK_NUMBER').attachEvent('onblur', blurHandler);  } }).call(this); //--></script> window.setTimeout - MDC https://developer.mozilla.org/ja/DOM/window.setTimeout # 余談ですが、MDC には focus, blur イベントについて以下の注意書きがあります。 --- focus や blur イベントの処理中に、アラートダイアログを出してはいけません。 この挙動は、利用者にとってわずらわしいため、ユーザーインターフェイス設計として劣悪です。 https://developer.mozilla.org/ja/XUL_Tutorial/Focus_and_Selection ---

  • fujillin
  • ベストアンサー率61% (1594/2576)
回答No.3

横からですが… No1の補足の内容で、IE6だと再現できます…というか、ご提示のコードではフォーカスは移動していないので、ご質問の結果は当然の結果といえるのかも知れません。 No2様がご指摘のように、focus(); を実行することで、IE6ではフォーカスが移動するようになります。 しかし、fx(3.5)だとこれではフォーカスは移動しないようです。セレクト要素をblur()後にfocus()でもダメもみたいですね。 回答No1の参考サイトのようにsetTimeoutで行なうと、どちらでも意図通りに働くようになるようです。

  • yamada_g
  • ベストアンサー率68% (258/374)
回答No.2

補足ありがとうございます。 ただ、当方の環境(IE8)では現象の確認ができませんでした。 ですが、テキストボックスの場合はなぜfocus()しないのでしょう? select()とは別にfocus()も必要なのではないかと思うのですが。 先ほどのsetTimeoutは試されました?

noname#119028
質問者

お礼

ご回答くださった皆様大変ありがとうございました。 ログインIDがわからなくなってしまい、ご回答が遅れたことをお詫びいたしま す。 yamada_gさんのご回答で問題解決できました。 そのほかの皆様のご回答も参考になりました。 大変助かりました。 本当にありがとうございました。

  • yamada_g
  • ベストアンサー率68% (258/374)
回答No.1

こういうことですかね? http://se-suganuma.blogspot.com/2010/04/javascriptonblurfocusselect.html できたら現象を再現できるコード、確認したブラウザなどの環境を載せていただけるとありがたいです。

noname#119028
質問者

お礼

ありがとうございます! そうですよね、申し訳ありません。 動作環境はIE6です。 先ほどとはチェック内容など異なりますが、以下のコードで再現できると思います。 ■スクリプト /*---------------------------------------*/ /*エラーチェック(ロストフォーカス時)*/ /*---------------------------------------*/ function fnCheckNum1(obj){ //テキストフィールドに1が入力されたらエラー if(obj.value=="1"){ alert("error"); if ((obj.type == "text") || (obj.type == "password")) { //テキストボックスの場合 obj.select(); }else{ obj.focus(); } } } ■フォーム部分 <table><tr> <td class="itemLabelMid"> 生年月日 </td> <td class="display"> &nbsp;西暦<input type="text" size="6" name="damageY" maxlength="4" class="InputDate" onblur="fnCheckNum1(this);">年 <input type="text" size="3" name="damageM" maxlength="2" class="InputDate" onblur="fnCheckNum1(this);">月 <input type="text" size="3" name="damageD" maxlength="2" class="InputDate" onblur="fnCheckNum1(this);">日 </td> <td class="itemLabelMid" > 好きな食べ物 </td> <td class="display"> &nbsp;<select name="hospCause"> <option value="0"> <option value="1">リンゴ <option value="2">みかん <option value="3">ばなな <option value="4">ぶどう <option value="5">なし </select> </td> </tr></table>

関連するQ&A

  • テキストボックスのフォーカス移動

    こんにちは。 htmlページで<input type="text"/>に既定の桁数を入力したら次のinputにフォーカスを 移動させたいと考えています。 下の例の場合、1番目のテキストボックスに既定の桁数5ケタを入力したら、フォーカス を2番目のテキストボックスに移動させ、2番目のテキストボックスに4ケタ入力したら 3番目のテキストボックスにフォーカスを移動させるようにしたいと思っています。 スクリプトの再利用ができるよう、たとえば同じname属性を与えればその範囲内で 簡単にフォーカスを移動させられるようなものにしたいと思うのですが、うまくいきません。 何か良い書き方はありませんでしょうか? <div>  <input type="text" name="hoge" maxlength="5" onkeyup="test(this)"/>  <input type="text" name="hoge" maxlength="4" onkeyup="test(this)"/>  <input type="text" name="hoge" maxlength="5" onkeyup="test(this)"/>  <input type="text" name="hoge" maxlength="2" onkeyup="test(this)"/> </div>  ・  ・ <script type="text/javascript"> function test(elm) {  if (elm.value.length >= elm.maxLength) {   /*(気持ちとしては、ここにこのような感じのことを書きたいのですが・・・)     var arr_elm = document.getElementsByName(elm.name);     var n = elm.index + 1     arr_elm[n].focus();   */   } } </script>

  • focus()が上手くいかない

    困っています、助けてください。 フォームのテキストボックスの入力された文字数をチェックし、 サイズオーバーなら、アラートを表示し、テキストボックスにフォーカスを移動させたい。 のですが、上手く動いてくれません。 コードは次の通りです。どこがおかしいのか?どうすれば改善できるのか? 教えてください。 <form method="post" action="#"> <input type="text" name="fmTitle" onBlur="checkText(this)"> </form> <script type="text/javascript"> <!-- function checkText(aText) { if (aText.value.length > 100) { alert('サイズオーバーです'); aText.focus(); } } //--> </script>

  • フォーカス移動抑止について

    お世話になっております。 ブラウザの画面項目(テキストボックス等)間でフォーカスを移動する場合、移動元でonblur、移動先でonfocusが発生しますが、移動元のonblurで、特定の条件の場合だけフォーカス移動を抑止し、移動先onfocusを発生させないようにしたいのですが、何か方法はないでしょうか? 【環境】 ・IE6 【現在うまくいっていない方法】 現在、フォーカス移動を抑止するため、移動元のonblur内の処理で、「event.srcElement.focus()」を実行してますが、移動先のonfocus()も走ってしまう。(2回フォーカス移動することで元の画面項目にフォーカスが戻る) 【補足】 ・問題になっているのは、画面項目のonblur、onfocusで入力値のチェックや他画面項目との連動、色変更、エラーメッセージ表示等を行っておりonblurやonfocusが何度も走ってしまうと想定外の動きをしてしまいます。(場合によってはフォーカス移動の無限ループ) ・グローバル変数を屈指すれば想定外の動きをしないようにすることはできるかと思いますが、それ以外の方法で制御したい。 【現在うまくいっていない方法の動作確認用のとりあえず作ったサンプルプログラム】 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html> <head> <title>フォーカス遷移抑止検証</title> <script type="text/javascript"> var iEventCount = 0; function onElemBlur() { if (++iEventCount > 10) return true;// 無限ループ抑止用 debug("blur : " + event.srcElement.value); event.srcElement.focus(); } function onElemFocus() { if (++iEventCount > 10) return true;// 無限ループ抑止用 debug("focus : " + event.srcElement.value); } function debug(msg) { var obElem = document.getElementById("debugmsg"); obElem.innerHTML += msg + "<br/>"; } </script> </head> <body> <input type="text" value="hoge1" onblur="onElemBlur()" onfocus="onElemFocus()" /> <br/> <input type="text" value="hoge2" onblur="onElemBlur()" onfocus="onElemFocus()" /> <br/> <br/> <br/> <span id="debugmsg" rows="10" cols="50" ></span> <br/> </body> </html> 長々と申し訳ありません。 よろしくお願いいたします。

  • FireFoxでfocus()が上手く動かない

    javascriptを使って、 フォームのテキストエリアの入力文字数をチェックし、 オーバーしていれば、アラートを出し、テキストエリアにフォーカスを移動させる。 ようにしようとしています。 IEでは動いてのですが、FireFoxだと上手くフォーカスが移動してくれません。 どこがまずいのか、教えてください。 コード <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=euc-jp"> <meta http-equiv="Content-Script-Type" content="text/javascript"> <script type="text/javascript"> <!-- function checkText(aText) { if (aText.value.length > 1) { alert('サイズオーバーです'); aText.focus(); } } //--> </script> </head> <body> <form method="post" action="#"> <input type="text" name="fmTitle" onBlur="checkText(this)"> <input type="text" name="dummy"> </form> </body> </html>

  • フォーカスが外れたときの動作について

    お世話になります。 あるテキストフィールド(text1)をクリックした際に隠れている別のテキストフィールド(text2)を表示し、 フォーカスが外れるとtext2を再度隠すというコードを書きました。 <html> <head> <style> <!-- #text2 { display: none; } --> </style> <script type="text/javascript" src="jquery.js"></script> <script type="text/javascript"> <!-- $(function() { $("#text1").click(function() { $("#text2").show(); }).blur(function() { $("#text2").hide(); }); }); --> </script> </head> <body> <form> <input type="text" id="text1" value=""/> <input type="text" id="text2" value=""/> </form> </body> </html> この場合、text1をクリックしたときにtext2が表示されて、フォーカスが外れるとtext2が隠れるのは想定通りの動作なのですが、これをtext2をクリックした場合にはtext1からフォーカスが外れてもtext2を表示したままということはできるのでしょうか。 blurの中でtext2がクリックされた時みたいな検知ができれば実現できると思うのですがそのようなことってできますでしょうか。 よろしくお願いいたします。

  • どこにもフォーカスを当てたくない

    フォームを開いたとき、どこにもフォーカスを当てたくないです。 アクセス2003です。 フォームにテキストボックスを1つ設置して、そのフォームを開くと フォーカスがテキストボックス上で、点滅しますが どこにもフォーカスを当てない方法あるのでしょうか? Private Sub Form_Open(Cancel As Integer) Me.詳細.SetFocus End Sub とするとコンパイルエラーになってしまいます。 不可能でしょうか?よろしくお願い致します。

  • Accessの更新後処理で特定の条件を満たしている場合、フォーカスを移動させない方法

    テキストボックスの更新後処理で下記のような記述をし、 テキストボックスに1が入力された場合、エラーメッセージを表示した上で、 フォーカスを一度ボタンに移動した後、テキストボックスに移動しております。 SetFocusを二回記述している理由ですが、 フォーカス移動を抑止する為に、Me.テキストボックス.SetFocus のみを記述した所、次の場所にフォーカスが移動してしまい、 下記のように書くと元の場所にフォーカスが戻ってくる為です。 フォーカス喪失時(Exit)の場合、Cancelを使用すればフォーカスの移動を抑止できたのですが、 更新後処理(AfterUpdate)でSetFocusを2回書く以外に フォーカスを移動させない方法をご存知の方がいらっしゃいましたら アドバイスいただければと思います。 ★クラスモジュール Private Sub テキストボックス_AfterUpdate() Call CHECK_TEXT(Me, Me.テキストボックス.Value) End Sub ★標準モジュール Function CHECK_TEXT(MeForm As Form, text As String) If text = 1 Then MsgBox "エラー" MeForm.ボタン.SetFocus MeForm.テキストボックス.SetFocus End If End Function 以上、よろしくお願いします。

  • テキストボックスの桁数をカウントして、フォーカス移動

    Win2000、VB6.0です。 テキストボックスとADOコントロールを使用して、レコードを編集・更新するフォームを作っています。 ただ、簡単に書く為に下の説明文ではDBについては書きません。 Form1に、Text1とText2があるとします。 Tab移動だけではなく、Text1に4桁目まで入力された時点で、Text2へフォーカスが移動するようにしたいと考えています。 Text1のChangeイベントで、 ------------------------------------ Private Sub Text1_Change()   If Len(Text1.Text) >= 4 Then     Text2.SetFocus   End If End Sub ------------------------------------ 以上のように記述しています。 ただ、Form1のロード時に、 ------------------------------------ Private Sub Form_Load()   Text1.Text = "1111" End Sub ------------------------------------ 以上のように記述すると、 「実行時エラー"5";」 「プロシージャの呼び出し、または引数が不正です。」 とエラーが発生してしまいます。 ロード時にテキストボックスに表示しつつ、入力された現在の桁数をカウントして、フォーカス移動する方法は無いのでしょうか? よろしくお願いします。

  • Firefoxで入力値のチェック

    テキストボックスへの入力値を即時でチェックし、値が不正だった場合はそのテキストボックスから抜けれないようにしたいと考えています。 以下のコードはIE6、Opera8.5では動作しましたが、Firefox1.5ではalertとselectはされるものの、focusがされず、結果テキストボックスから抜けてしまいます。 Firefoxで上記のことをするにはどうしたらよいのでしょうか。 <html> <head> <script type="text/javascript"> function validate(e){ var t = document.getElementById("txt1"); if(t.value == "a"){ alert("だめ!!"); if (e.preventDefault) { e.preventDefault(); } else { e.returnValue = false; } t.select(); t.focus(); return false; } } function bodyOnLoad(){ var t = document.getElementById("txt1"); addListener(t, "change", validate, false); } function addListener(e, evtname, func, foo){ if(e.addEventListener){ e.addEventListener(evtname, func, foo); }else if(e.attachEvent){ e.attachEvent("on" + evtname, func); } } </script> </head> <body onload="bodyOnLoad();"> <input type="text" id="txt1"> <input type="text" id="txt2"> </body> </html>

  • VB6 テキストとSetfocus

    今テキストボックスからテキストボックスへ focusを写すのをやっていたのですが、 TEXT1 から TEXT2へ入力した後エンターキーを押したらfocusを写すというのを設定したところ ちゃんとカーソルは移動するのですが どうしてもエラー音が出てしまいます。 現在KEYPRESSに If KeyAscii = 13 Then Text2.SetFocus End If このように書いているのですがなにか間違ってるのでしょうか? エラー音を出さない方法をどなたかご教授ください

専門家に質問してみよう