- 締切済み
テキストボックスに値入力でイベントが取得できない
年月日テキストボックス(readonly)に、子ウインドウから値を選択して、表示させています。 可変で複数行あり、同じ値はエラーにしたいのですが、子ウインドウから値が入力された場合のイベント取得ができません。(onchangeは無視されます) なるべく入力をした時点でチェックしたのです。 よろしくお願いします。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- papillon68
- ベストアンサー率61% (42/68)
> onfocusout onblurのことでしょうか。 私は以下のようにDateオブジェクトを利用して日付が存在するかどうかをチェックしています。 Dateオブジェクト生成時の引数にチェックしたい日付を指定し、 生成された年月日とチェックしたい日付が違っていれば存在しない という比較です。 例えば、2006年2月29日の場合だと new Date(2006, 2, 29) で生成される日付は 2006年3月1日となります。 二つの比較により2006年2月29日が存在しないことが分かります。 --------------------------------------------------- // 日付が存在するかを判断する関数 function checkdate(yy, mm, dd) { if(! (yy).match(/^[0-9]+$/)) return false; if(! (mm).match(/^[0-9]+$/)) return false; if(! (dd).match(/^[0-9]+$/)) return false; var tmp_yy = yy; var tmp_mm = mm; var tmp_dd = dd; // 月の調整 if(tmp_yy == 1) { tmp_yy--; tmp_mm = 12; } else { tmp_mm--; } var tmp_date = new Date(tmp_yy, tmp_mm, tmp_dd); tmp_yy = tmp_date.getFullYear(); tmp_mm = tmp_date.getMonth() + 1; tmp_dd = tmp_date.getDate(); return (yy.toString()+mm.toString()+dd.toString()==tmp_yy.toString()+tmp_mm.toString()+tmp_dd.toString()); } ---------------------------------------------------
- papillon68
- ベストアンサー率61% (42/68)
どの段階でチェックをしたいのかがもう少し分かりません。 > 子ウインドウから値が入力された場合 これは「子ウィンドウで値を入力(もしくは選択)されれば、親に値をセットする」 ということだと思うのですが、実際にはどの段階でチェックしたいのでしょうか。 子ウィンドウで値を入力している段階でチェックしたいのでしょうか。 それでしたらonKeyDownなどでチェックしてみてはいかがでしょうか。 そして許可していない文字がある場合は除去するような処理をすればいいと思います。 あとは実際に存在する日付なのかなどのチェックです。
補足
papillon68さん、ご回答ありがとうございます。 なんとか、解決そうです。中間報告です。 「子ウィンドウで値を入力(もしくは選択)されれば、親に値をセットする」という処理です。 子ウィンドウはカレンダー画面になっており、クリックすると該当年月日が親のテキストボックスに格納され、 子は閉じます。 この時、閉じる前に、親の該当テキストボックスにフォーカスを移す処理を入れました。 子の処理↓ self.opener.document.getElementsByName('該当テキストボックス名')[0].focus();self.close() 親は、該当テキストボックスで onfocusoutのときの 処理で「同一年月日がないか」のチェックを行います。 成功したらまたご報告します。
お礼
遅くなり、大変申し訳ありません。 以前記入した内容で、うまくいきました。 onblurにすると、うまく動作しません、2回alertがでてしまったりしますので、onfocusout のタイミングでチェックしています。 日付が存在するかを判断する関数は大変参考になりました。 どうもありがとうございました。