質問: str.value; if(val !=""){ for(; i 入力項目 ``` このHTML部分を ``` 入力項目 ``` このようにした場合、onBlurのときと同じデータで試した際に1度のみポップアップが出ていたのですがこれだと値が変わってエラーメッセージが出た後に変更しないでフォーカスアウトした場合などにチェックできないので不満足になってしまいます。 また、チェック処理は別のjsファイルに記載しています。 対応として、以下は実現可能なのかということで今悩んでいます。 1チェックはonBulrのみとし、エラーがあった場合はonAutoSaveの最初で処理を抜けるようにする。 2指定時間経過時には、onBlurの処理が呼ばれないようにする。 3onBlurまたはonAutoSaveで先に呼ばれたほうでチェックエラーとなった場合、その時点で処理を抜ける(exitなる処理が実現できればこれは可能かと思うのですが・・・) そもそも、この実装の場合onBlurとonAutoSaveは指定時間経過後にはどちらが先に実行されるのでしょうか? 知恵をお持ちの方がいましたら、ご教示お願いいたします。 ~質問追加~ 【試してみたこと】 ``` onBlur部分を以下のよう(見やすくするためJSに記載しています。)にしてみたところ、当然ロストフォーカス時にはチェックがかからず、指定時間経過時もチェックはかからない。onAutoSaveが先に呼ばれていたようなので、そこでチェックエラーとなった場合はonBlurの処理を行わないようにグローバル変数のcheckFlgをtrueにするようにしてみました。しかし、alertが2回出てしまいます。 onBlur="isLostFocusCheck(this);" ``` ``` var checkFlg=false; function isLostFocusCheck(str) { if(checkFlg==false) { //自動保存でチェックエラーとなっていた場合はcheckFlgがtrueとなっているためこのifはスルーされるはず。 WordCountCheck(str, 20); } } ```
回答: 以下のように実装し、解決できました。フラグをONにする場所が悪くその前にonBlurが動作していてフラグでの制御ができていなかったようです。 ``` function isTimecheck() { setTimeout("onAutoSave()", 指定時間); } function onAutoSave() { var result = true; var a = 入力項目.value; //入力項目の入力値を取得する。 var maxLen = 20; //最大文字数:例で20とする。 if (a != '') { result = WordCountCheck(a, maxlen); if (result == false) { alert(エラーメッセージ); 入力項目.focus(); //フォーカスを入力項目に戻す。 return false; } } } var checkFlg = false; function isLostFocusCheck(str, maxLength) { if (checkFlg != true) { WordCountCheck(str, maxLength); } } function clearFlg() { if (checkFlg == true) { checkFlg = false; } } window.onload = function(){ isTimeCheck(); } ``` ``` function WordCountCheck(str, maxLength) { var i = 0; var len = 0; //バイト数を格納する。 checkFlg = true; str.value = rightTrim(str.value);//不要な右側スペースは削除する。 var val = str.value; if(val !=""){ for(; i 入力項目 ```