クリックイベントの質問です | 質問掲示板 | 独学!未経験からWebデザイナーになる!!

Web制作や付随することを何でも質問できるコーナーです。

未経験からWebデザイナーになる!! > 質問掲示板 > カテゴリ: JavaScript > クリックイベントの質問です

クリックイベントの質問です

当サイトのリニューアル作業に時間をあてるため、掲示板の投稿は当分停止させていただきます。
 こんにちは、バス予約のホームページを作っています。
 こんな感じです
 行き
 便名 日付       出発   到着  予約する
 11  2015/11/14    7:00  9:00  ラジオボタン
 12  2015/11/14    8:00  10:00  ラジオボタン

 帰り
 便名 日付       出発   到着  予約する
 21  2015/11/14    7:30  9:30  ラジオボタン
 22  2015/11/14    8:30  10:30  ラジオボタン
 23  2015/11/14    10:30  12:30 ラジオボタン

 そこで、もし、往復便を予約したときに、帰りの出発時間が行の到着時間より前のときは、ラジオボタンのチェクを外して、エラーメッセじを出します。もちらんですが、お客さんは帰りを先にチェックする可能性もあります、その時、行にチェックを入れた時に、行のチェックを外して、エラーを出します。

 行と帰りのtableにはそれぞれidをつけました、from_table,to_table
jQueryはこういう感じにかきました
$(document).ready(function(){
$('table tr').click(function(){
var $c = $(this).children('td').children('input[type=checkbox]');
$c.prop('checked','checked');
});
$('fromt_table tr').click(function(){
fromtime = new Date($(this).children('td').eq(1).text()+$(this).children('td').eq(3).text());

$('to_table tr').click(function(){
var $to = $(this).children('td').children('input[type=checkbox]');
totime = new Date($(this).children('td').eq(1).text()+$(this).children('td').eq(2).text());
});
if(fromtime > totime){
$to.prot('checked','');
alert('時刻はただしくありません');
}
});
});

こういう書き方だと、もし先に帰りをクリックしたときに、判断ができません。もちろん、逆にもう一度かけばいいですが、もっといい方法がないでしょうか?
どうぞ、よろしくお願いします!
とらさん、こんにちは。

ざっくり見た感じですと、こちらのコード、現時点で「行き」を先にクリックした場合には動作しているのでしょうか?
下記のようなところが少し気になりました。

・fromt_tableや$to.protはタイプミス?
・説明ではラジオボタンですがコード内ではcheckboxになっている
・$('to_tableなどのID指定で#が抜けている
・各clickの閉じ位置もなんだかおかしい?


そのあたりが実際はうまく記述されているとして、想像で意図を読み取ると、次のような感じのプログラムでしょうか。

・trクリック時に、その行のラジオボタンにチェックを付ける
・from_tableのtrクリック時は、時間をfromtimeに代入
・to_tableのtrクリック時は、時間をtotimeに代入(ここで時間をチェック?)



基のコードを尊重するような形として、このような感じではいかがでしょう。

・trクリック時に、その行のラジオボタンにチェックを付ける
・from_tableのtrクリック時は、時間をfromtimeに代入。チェックメソッド呼び出し
・to_tableのtrクリック時は、時間をtotimeに代入。チェックメソッド呼び出し

(コード例
$(document).ready(function() {
var fromtime = '';
var totime = '';

$('table tr').click(function(){
var $c = $(this).children('td').children('input[type=radio]');
$c.prop('checked','checked');
});

$('#from_table tr').click(function(){
// ここでfromtimeに代入処理
// fromtime = xxxxxx;
check(this, 'from');
});

$('#to_table tr').click(function(){
// ここでtotimeに代入する処理
// totime = xxxxxx;
check(this, 'to');
});

function check(element, caller) {
if (fromtime == '' || totime == '') {
return;
}
if (fromtime > totime){
var target = $(element).children('td').children('input[type=radio]');
target.prop('checked','');
if (caller == 'from') {
fromtime = '';
} else if (caller == 'to') {
totime = '';
}
alert('時刻はただしくありません');
}
}
});


チェックメソッドを別処理にし、from_table, to_tableのどちらがクリックされても呼び出しています。
ただ、個人的にはエラー時にfromtime, to_timeを初期化する処理がいまいちに感じます。

変数に保持せず、イベント発生時にその都度直接fromtime, totimeを取得する方がクールかもしれませんね。応用でできると思いますので、そちらも試してみてはいかがでしょう。
馬場誠 さん こんばんわ
親切に説明してくれて、ありがとうございます。
ご指摘している4っ箇所ですが、確かに、もう一度コードを見てみると、自分の記述ミスでした。すみません。

おっしゃた通りです:
まず、trクリック時に、その行のラジオボタンにチェックを付ける
次は、from_tableのtrクリック時は、時間をfromtimeに代入
最後、to_tableのtrクリック時は、時間をtotimeに代入して、fromtime,totimeを比べてエラーチェックを行います。もし、エラーのときには、エラーメッセージを出す感じです。

教えてくれたプログラムを見てみると、なるほどっていう感じでした。
実は、自分の中で、一番悩んでいました。from_table,to_tableのクリック順番を気にせずに、fromtime,totimeを比べられるか?自分はphpしかできなくで、しかも、中級ぐらいのレベルです、この問題を解決する時には、まず、php見たいに全局変量がないかと調べました。結果では、javascriptはvarをつけるかどうかで全局変量を設定しているそうです。でも、以下みたいな書き方にすると、$('fromt_table tr').click(function(){}関数内では、fromtimeはきちんと取れますが、この関数を出ると、取れなくなる。。。。
var fromtime;
$('fromt_table tr').click(function(){
fromtime = new Date($(this).children('td').eq(1).text()+$(this).children('td').eq(3).text());
});



また別の方法があるとわかりますが、何を調べればいいかわかりませんでした。。。

馬場さんのコードをみると、
$('#from_table tr').click(function(){
// ここでfromtimeに代入処理
// fromtime = xxxxxx;
check(this, 'from');
});

このクリックイベントの中に、check関数があって、クリックした度に、チェックするですね、すごく参考になりました。

試してみますので、親切に教えてくれて、本当にありがとうございます!
変数名に$がついていたので、普段PHPを書かれるとのこと、納得です。(実は私もPHPがほとんどなので、意識しないと自然に$を付けてしまいます(^^)

JavaScriptの場合は特に、いろんな書き方ができるため、書く人によってコードがだいぶ異なったりすることがあります。より良い実装方法もあると思いますので、いろいろと試してみるのは勉強になると思います。

また何かありましたら、お気軽にご質問くださいね☆
馬場さん、こんばんわ

教えてもらったコードを実行してみたところ、問題なく動きました、プログラムが思った通りに動いて、すごく嬉しかったです。本当に有難うございます。

わかりました、またなんがあったら、是非教えてください。ありがとうです