どもです。
まこと久々のjs関係の更新です。
テキストボックスをonblurで入力チェック、
望んだものでなければalert(もしくはconfirm)を呼び、再びfocusで入力し直させる。
一般サイトだと時代遅れのブツではありますが、
裏側ならまだ現役のalert()。
こういったことは、やりたくなることがあると思います。
が、
alert("警告メッセージ");
元のテキストボックス.focus();
他の動作であれば正常に動くのですが、focusに限ってはこれバグるようです。
しかも、ブラウザによってバグの内容が異なり、
firefoxならフォーカスが移動してくれない程度で済むのですが、
chromeだと閉じても閉じても延々とalertが発動し続けるという悪夢が。
で、どうしてこんな現象が起きるのか。
alert()はフォーカスの操作を行うことまでは確定。alert()を閉じる動作が非同期なのではないでしょうか。
★alert()を閉じる際のフォーカスをアラートのウィンドウから外す
★テキストボックスにフォーカスをつける
が、同時に実行される。
結果、テキストボックスにフォーカス⇒フォーカスを外される⇒onblur()が着火。無限ループ。
アカン。(-"-)
しかし、フォーカスの処理が同時発生するのがバグの元なら、
フォーカスの処理を同時に行わせなければいい。
ということで、対処法はこちら。
alert("警告メッセージ");
setTimeout(function(){
元のテキストボックス.focus();
元のテキストボックス.select();
}, 1);
setTimeoutでミリ秒ずらし。
これでおkです。
alert()はブラウザ差異がすっごいから、なるべく使いたくないなぁ…。
参考サイト:SE奮闘記 とあるシステムエンジニアのメモ帳