Jquery Datepickerについて

このQ&Aのポイント
  • 初級エンジニアがJquery Datepickerを使用して「レンタル希望日」と「レンタル返却日」を選択する機能を実装しようとしています。
  • 選択したレンタル希望日に応じて、販売店の休店日が変更される仕様です。
  • ただし、レンタル希望日と返却予定日は第3希望までの入力が必須であり、一元で行う方法を探しています。
回答を見る
  • ベストアンサー

Jquery Datepickerについて。。

質問させてください。 javascriptが非常に苦手な初級エンジニアです。。 JqueryのDatepickerを使って、「レンタル希望日」という入力項目に入った日付を見て、「レンタル返却日」の選択できる日にちを変える、っというようなものを作っています。レンタル希望日の入力をする前にレンタルもとの販売店の選択をし、休店日も選択した販売店によって切り替えるような仕様です。苦手ながらも何とかそこまではできたのですが1点問題点が。。 レンタル希望日、返却予定日は第三希望まで入力する必要があります(必須)。 以下1ソースで第3希望までの入力を一元で行う方法があればと思っています。 丸ごと関数化すればいいのかと思い色々試してみましたが上手くいきませんでした。ソースを3回書くのはできれば避けたいです。 何卒よろしくお願いいたします。 ---------------------以下ソース $(function() { $( "#from" ).datepicker({ defaultDate: "+1w", minDate: '+3', maxDate: '2014年12月26日', dateFormat: 'yy年mm月dd日', changeMonth: true, beforeShow:function(){ var kyoten = $("select[name='kyoten']").val(); try{ if(kyoten == ''){ throw new Error('販売店を選択してください'); } }catch(e){ alert(e.message); window.location.reload();//あまりよろしくない。。 } }, beforeShowDay: function(day) { // カレンダー表示前に実行 var kyoten = $("select[name='kyoten']").val(); kekka = kyoten.split('_'); var result; switch (day.getDay()) { case 2: // 火曜日を選択できないようにする if(kekka[1] == 1){ result = [false]; }else{ result = [true]; } break; case 3: // 水曜日を選択できないようにする if(kekka[1] == 2){ result = [false]; }else{ result = [true]; } break; case 6: // 土曜日を選択できないようにする result = [false]; break; case 0: // 日曜日を選択できないようにする result = [false]; break; default: result = [true]; // それ以外は選択できる break; } return result; }, onClose: function( selectedDate ) { var toDate = $('#from').datepicker('getDate'); var toMin = $('#from').datepicker('getDate');//toDate var toWeek = toDate.getDay(); var tiNum = ''; var niNum = ''; // maxDateの挙動(選択した日にちの曜日番号によって(#to)で選択できる日にちを絞り込む) if(toWeek == 1) { // 月 tiNum = 4; } else if(toWeek == 2){ // 火 tiNum = 3; } else if(toWeek == 3){ // 水 tiNum = 2; } else if(toWeek == 4){ // 木 tiNum = 1; } else if(toWeek == 5){ // 金 tiNum = ''; } // minDateの挙動(金曜日のみ1を加算しない) if(toWeek == 5){ niNum = ''; }else{ niNum = 1; } toMin.setDate(toMin.getDate() + tiNum); toDate.setDate(toDate.getDate() + niNum); $( "#to" ).datepicker('option', {minDate: toDate, maxDate: toMin}); } }); $( "#to" ).datepicker({ defaultDate: "+1w", minDate: '+1', maxDate: '2014年12月26日', dateFormat: 'yy年mm月dd日', changeMonth: true, beforeShow:function(){ var kyoten = $("select[name='kyoten']").val(); try{ if(kyoten == ''){ throw new Error('拠点を選択してください'); } }catch(e){ alert(e.message); window.location.reload(); } }, beforeShowDay: function(day) { // カレンダー表示前に実行 var kyoten = $("select[name='kyoten']").val(); kekka = kyoten.split('_'); var result; switch (day.getDay()) { case 2: // 火曜日を選択できないようにする if(kekka[1] == 1){ result = [false]; }else{ result = [true]; } break; case 3: // 水曜日を選択できないようにする if(kekka[1] == 2){ result = [false]; }else{ result = [true]; } break; case 6: // 土曜日を選択できないようにする result = [false]; break; case 0: // 日曜日を選択できないようにする result = [false]; break; default: result = [true]; // それ以外は選択できる break; } return result; } }); }); </script> 以下html部分 <select name="kyoten"> <option value="">選択してください</option> <?php foreach( $kyotenArr as $key=>$var):?> <option value="<?php echo $var;?>"><?php echo $key;?></option> <?php endforeach;?> </select> 第一希望日<input type="text" id="from" readonly="readonly"> 第一希望返却日<input type="text" id="to" readonly="readonly"> <!--第3希望まであります。。

質問者が選んだベストアンサー

  • ベストアンサー
  • LancerVII
  • ベストアンサー率51% (1060/2054)
回答No.1

こんにちは。 カレンダーが複数ある場合はclass属性で指定してあげれば、全てのカレンダーに適用できます。 こうすれば、それぞれの希望日ごとの処理を記述しなくても動作させることが出来ます。 この書き方であれば、たとえ第10希望まで増えたとしても、JavaScriptは何もいじる必要がありません。 (減っても同じです) (詳細はコメントを見て、読み解いてください) 肝となるのは カレンダーを適用する要素は$(id)で指定せず、.datepickerとしてクラスで指定する $(id)で返却日を指定せず選択された要素から対象となる返却日を取得する dlタグまでさかのぼり・・・と書いてある部分が「選択された要素から対象となる・・・」という部分ですが この場合、HTMLの構成によって、要素を探す方法は変わりますのでご注意ください。 ==== JavaScript <script type="text/javascript"> $(function() { // class="datepicker"にDatePickerを適用する $('.datepicker').datepicker({ defaultDate: '+1w', minDate: '+3', maxDate: '2014年12月26日', dateFormat: 'yy年mm月dd日', changeMonth: true, beforeShow:function(){ // 選択されたDatePickerからdlタグまでさかのぼり、 // その中のselect[name="kyoten"]の値を取得する var kyoten = $('select[name="kyoten"]',$(this).parents('dl')).val(); try{ if(kyoten == ''){ throw new Error('販売店を選択してください'); } }catch(e){ alert(e.message); return false; } }, beforeShowDay: function(day) { // 選択されたDatePickerからdlタグまでさかのぼり、 // その中のselect[name="kyoten"]の値を取得する var kyoten = $('select[name="kyoten"]',$(this).parents('dl')).val(); kekka = kyoten.split('_'); var result = new Array(true,'',''); var day = day.getDay(); if ( day === 0 || day === 6 ) { // 土曜日と日曜日の処理は選択不可としツールチップは定休日 result[0] = false; result[2] = '定休日'; } else if ( day === 2 && kekka[1] === '1' ) { // 火曜日で拠点が1の場合は選択不可としツールチップは // 「1販売店のお休みです」とする result[0] = false; result[2] = '1販売店のお休みです'; } else if ( day === 3 && kekka[1] === '2' ) { // 水曜日で拠点が2の場合は選択不可としツールチップは // 「2販売店のお休みです」とする result[0] = false; result[2] = '2販売店のお休みです'; } return result; }, onClose: function( selectedDate, obj ) { // 日付が選択されていない場合は何も処理をしない if ( selectedDate === '' ) return; // 選択されたオブジェクトを取得 var $obj = $(this); var toDate = $obj.datepicker('getDate'); var toMin = $obj.datepicker('getDate'); var toWeek = toDate.getDay(); // 規則性があったので条件式を簡略化 // 1の場合は4加算,2の場合は2加算,3の場合は2加算,4の場合は1加算 // すなわち5から選択された曜日を引いた数が加算する数 toMin.setDate(toMin.getDate() + (5 - toWeek)); // 5以外は1を加算 // 1は選択された曜日を5で割って切り捨てて1を引いた絶対値 // 2は選択された曜日を5で割って数が1であるかの否定 // 3は選択された曜日が5の場合は0、それ以外は1を加算 // いろいろ条件を考えてみると楽しいですよ。 // toDate.setDate(toDate.getDate() + (Math.abs(Math.floor(toWeek/5)-1))); // 1 // toDate.setDate(toDate.getDate() + !(toWeek/5===1)); // 2 toDate.setDate(toDate.getDate() + (toWeek === 5 ? 0 : 1) ); // 3 // 選択されたDatePickerからdlタグまでさかのぼり、 // その中のinput[name="to"]を返却日のオブジェクトとして取得して // 日付の設定を行う $('input[name="to"]', $obj.parents('dl')).datepicker('option',{ minDate: toDate, maxDate: toMin }); } }); }); </script> ==== HTML <dl> <dt>販売店</dt> <dd> <select name="kyoten"> <option value="">選択してください</option> <option value="0_1">1</option> <option value="0_2">2</option> </select> </dd> <dt>第一希望日</dt> <dd><input type="text" class="datepicker" name="from" readonly="readonly"></dd> <dt>第一希望返却日</dt> <dd><input type="text" class="datepicker" name="to" readonly="readonly"></dd> </dl> <dl> <dt>販売店</dt> <dd> <select name="kyoten"> <option value="">選択してください</option> <option value="0_1">1</option> <option value="0_2">2</option> </select> </dd> <dt>第二希望日</dt> <dd><input type="text" class="datepicker" name="from" readonly="readonly"></dd> <dt>第二希望返却日</dt> <dd><input type="text" class="datepicker" name="to" readonly="readonly"></dd> </dl> <dl> <dt>販売店</dt> <dd> <select name="kyoten"> <option value="">選択してください</option> <option value="0_1">1</option> <option value="0_2">2</option> </select> </dd> <dt>第三希望日</dt> <dd><input type="text" class="datepicker" name="from" readonly="readonly"></dd> <dt>第三希望返却日</dt> <dd><input type="text" class="datepicker" name="to" readonly="readonly"></dd> </dl>

paranoaman
質問者

お礼

うぉ~、懇切丁寧にありがとうございます! classで指定する事は考えていたのですが、idで判定の仕方が分かりませんでした!質の高いソースで凄いです! ありがとうございます! ベストアンサーとさせていただきます!

関連するQ&A

  • datepickerで日付の値を取得したい

    jQueryのdatepickerを実装しました。 そこに、jquery.validate.jsを当てて、空欄の時にエラーが出るようにしました。 しかし、日付を選択しても、エラーメッセージが出てしまいます。 (※日付をカレンダーで選択後、再び日付の欄をクリックするとエラーが消えます。) どうやら、日付の値を取得していないような気がしています。 どなたかご存じの方がいらっしゃいましたら、教えていただけると幸いです。 <script type="text/javascript"> $(function(){  $("#datepicker").datepicker() }); </script> <script> jQuery(".validDate").validate({ expression: "if(VAL != '') return true; else return false;", message: "希望日をお選びください。" }); </script> <input type="text" name="reservationdate" class="rDate validDate" id="datepicker"/>

  • jQuery datepickerを複数使いたい

    javascript で行を追加するDOMを作成しました。 最初の1回だけdatepickerで日付をクリックすると該当のテキストボックスに日付が問題なく代入されます。 追加ボタンをクリックで行を追加した際にもjQuery datepickerを動作させるにはどうしたら良いでしょうか? function add() { var objTBL = document.getElementById("request_tb" + num); if (!objTBL) return; var count = objTBL.rows.length; // 最終行に新しい行を追加 var row = objTBL.insertRow(count); // 列の追加 var c1 = row.insertCell(0); var c2 = row.insertCell(1); var c3 = row.insertCell(2); // 各列に表示内容を設定 c1.innerHTML = '<span class="seqno' + count +'">第' + count + '日時</span>'; c2.innerHTML = '<input type="text" name="date' + count + '" class="datepicker'+ count+'" id="datepicker">'; c3.innerHTML = '<img src="img.gif">&nbsp;カレンダーで選ぶ</a>'; $('datepicker'+count).datepicker({ numberOfMonths: 2, dateFormat: 'yy-mm-dd', changeYear: false, showButtonPanel: true, minDate:0 }); } <input type="button" id="add" onClick="add()" value="追加"> ご教授の程、宜しくお願いしますm(__)m

  • jquery datepickerについて

    言語初心者です。 まだ、ほとんど自分では書けず、どうにかネットに上がっているものを使っている状態です。 datepickerを利用しつつ、fromとtoから期間を計算させたいと思っています。 過去ログがあったので示します。 http://okwave.jp/qa/q7656838.html onSelect: function() {   // 開始を取得     var from = $('#date-from').val();   // 終了を取得     var to = $('#date-to').val();     if ( from !== '' && to !== '' ) {        var date = new Date(to).getTime() - new Date(from).getTime();        alert ( date/(1000*60*60*24) );     }   } 上記ソースコードの   alert ( date/(1000*60*60*24) ); の部分を書き換えて /*html内*/ <input type="text" id="from-to" name="期間"> のテキストボックスに計算させた日数を出したいのですが、上手くいきません。 どなたかご教授ください。よろしくお願いいたします。

  • jQueryが読み込めない

    下記のようにサンプルコードを入力し、同一ファイル内にjsファイルを設置しているのですが、機能せず、ただのテキストボックスが表示されるのみです。 大変初歩的な質問ですが、よろしくお願いします。 ■phpファイル <body> <form action="" method=""> <label for="user-name">お名前</label><input type="text" id="user-name"><br> <label for="user-kana">フリガナ</label><input type="text" id="user-kana"> </form> <script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script> <script src="jquery.autoKana.js"></script> <script> $(document).ready(function(){ $.fn.autoKana('#user-name', '#user-kana', {katakana:true}); }); </script> </body> ■jquery.autoKana.js (function ($) { $.fn.autoKana = function (element1, element2, passedOptions) { var options = $.extend( { 'katakana': false }, passedOptions); var kana_extraction_pattern = new RegExp('[^  ぁあ-んー]', 'g'); var kana_compacting_pattern = new RegExp('[ぁぃぅぇぉっゃゅょ]', 'g'); var elName, elKana, active = false, timer = null, flagConvert = true, input; elName = $(element1); elKana = $(element2); active = true; _stateClear(); elName.blur(_eventBlur); elName.focus(_eventFocus); elName.keydown(_eventKeyDown); function start() { active = true; }; function stop() { active = false; }; function toggle(event) { var ev = event || window.event; if (event) { var el = Event.element(event); if (el.checked) { active = true; } else { active = false; } } else { active = !active; } }; function _checkConvert(new_values) { if (!flagConvert) { if (Math.abs(values.length - new_values.length) > 1) { var tmp_values = new_values.join('').replace(kana_compacting_pattern, '').split(''); if (Math.abs(values.length - tmp_values.length) > 1) { _stateConvert(); } } else { if (values.length == input.length && values.join('') != input) { _stateConvert(); } } } }; function _checkValue() { var new_input, new_values; new_input = elName.val() if (new_input == '') { _stateClear(); _setKana(); } else { new_input = _removeString(new_input); if (input == new_input) { return; } else { input = new_input; if (!flagConvert) { new_values = new_input.replace(kana_extraction_pattern, '').split(''); _checkConvert(new_values); _setKana(new_values); } } } }; function _clearInterval() { clearInterval(timer); }; function _eventBlur(event) { _clearInterval(); }; function _eventFocus(event) { _stateInput(); _setInterval(); }; function _eventKeyDown(event) { if (flagConvert) { _stateInput(); } }; function _isHiragana(chara) { return ((chara >= 12353 && chara <= 12435) || chara == 12445 || chara == 12446); }; function _removeString(new_input) { if (new_input.match(ignoreString)) { return new_input.replace(ignoreString, ''); } else { var i, ignoreArray, inputArray; ignoreArray = ignoreString.split(''); inputArray = new_input.split(''); for (i

  • 複数のラジオボタンの選択チェック

    Q1とQ2の2問があり、ラジオボタンで回答を選択するようにしていますが、 ラジオボタンを選択しなかった場合、選択を促すようメッセージを表示させるようJavaScriptで以下のように作成してみましたがうまくいきません。 Q1とQ2の両方を選択しなかった場合、「Q1が選択されていません」とメッセージが表示されますが、Q1だけを選択してQ2を選択しなかった場合はメッセージが表示されません。 いろいろ調べてみたのですが、function checkの使い方に問題があるのでしょうか? function check(){ var flag = 0; if(document.form1.Q1.length) { flag = 1; var i; for(i = 0; i < document.form1.Q1.length; i ++){ if(document.form1.Q1[i].checked){ flag = 0; break; } } } if(flag){ window.alert('Q1が選択されていません'); return false; } else{ return true; } var flag = 0; if(document.form1.Q2.length) { flag = 1; var i; for(i = 0; i < document.form1.Q2.length; i ++){ if(document.form1.Q2[i].checked){ flag = 0; break; } } } if(flag){ window.alert('Q2が選択されていません'); return false; } else{ return true; } }

  • ファンクションキー制御?

    こんにちわです。 タイトル通りなのですが、 JSでは、 function kdown(e) {var msg =""; var flg = 1; switch(window.event.srcElement.tagName){ case "INPUT" :if(event.srcElement.type != "text" && event.srcElement.type != "password" && event.keyCode!=9 && event.keyCode!=16 && event.keyCode!=32){return false;}else{flg=0;}break; case "TEXTAREA" :flg = 0;break; case "SELECT" :flg = 0;break; case "A" :flg = 2;break; } switch(event.keyCode){ case 8 :msg = "BS";break; case 78 :if(event.ctrlKey){msg = "Ctrl+N";}break; case 82 :if(event.ctrlKey){msg = "Ctrl+R";}break; case 116 :msg = "F5";break; case 122 :msg = "F11";break; } if(event.altKey){msg = "Alt";} if (flg == 0 ){switch(event.keyCode){case 8 :msg = "";break;case 13 :msg = "";break;}} else if (flg == 2 && event.keyCode==13)msg = ""; if(msg != ""){event.keyCode = 0;return false;}else{return true;} } document.onkeydown = kdown; こんな感じに制御するのを、 アクションスクリプトで制御出来ますか? HTMLにこのJS埋め込んでも、FLASHの所クリックして、 各キー押すと意味なくなってしまうので・・ F5やF11など使用されたくないのですが・・・ 入れ替えなどでも良いのですが。。。 宜しくお願いします。

  • actionscript 3.0 勉強中のもです。

    actionscript 3.0 勉強中の者です。以下のプログラムにてインスタンス(人の形をした)が方向キーで動くものを制作したのですが、このインスタンスにあらかじめ、シンボル内の編集にて、左右対称の画像を 同じタイムライン内に、例えば5フレームづつ内にそれぞれ配置し、ループ状態にして、プレビューした時に行進しているような様子を設定したのですが、プレビューをしてみると、キーを押す前は元気よく行進しているのですが、ボタンを押してインスタンスを動かしたとたんに行進をやめてしまいます。行進を続けさせながら、方向キーの操作を行うにはどのようにすればよろしいでしょうか?よろしくお願い致します。 var bKeyUp:Boolean = false; var bKeyDown:Boolean = false; var bKeyLeft:Boolean = false; var bKeyRight:Boolean = false; stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeydown); stage.addEventListener(KeyboardEvent.KEY_UP, onKeyup); function onKeydown(e:KeyboardEvent) { switch (e.keyCode) { case Keyboard.UP: bKeyUp = true; break; case Keyboard.DOWN: bKeyDown = true; break; case Keyboard.LEFT: bKeyLeft = true; break; case Keyboard.RIGHT: bKeyRight = true; break; default: break; } trace("UP : " + bKeyUp + "\n" + "DOWN : " + bKeyDown + "\n" + "LEFT : " + bKeyLeft + "\n" + "RIGHT: " + bKeyRight + "\n" ); } function onKeyup(e:KeyboardEvent) { switch (e.keyCode) { case Keyboard.UP: bKeyUp = false; break; case Keyboard.DOWN: bKeyDown = false; break; case Keyboard.LEFT: bKeyLeft = false; break; case Keyboard.RIGHT: bKeyRight = false; break; default: break; } trace("UP : " + bKeyUp + "\n" + "DOWN : " + bKeyDown + "\n" + "LEFT : " + bKeyLeft + "\n" + "RIGHT: " + bKeyRight + "\n" ); } const PLAYER_SPEED:uint = 4; var pSpeed:int = PLAYER_SPEED; player2.addEventListener(Event.ENTER_FRAME, playerActions); function playerActions(e:Event) { if (bKeyUp == true) { player2.y -= pSpeed; player2.gotoAndStop("up"); } if (bKeyDown == true) { player2.y += pSpee これにどのような追加をしたらよろしいでしょうか? 何卒お願い致します。

    • ベストアンサー
    • Flash
  • ラジオボタンとセレクトボックスの選択チェック

    ラジオボタン、セレクトボタンの選択チェックをしたいのですが 同時にチェックする場合どうすればよいのでしょうか。 失敗策ですが、参考までに↓ function check() { var flag=0; if( document.form1.seibetu.length){ flag=1; var i; for(i=0; i<document.form1.seibetu.length; i++){ if(document.form1.seibetu[i].checked){ flag=0; break; } } } else{ if(!document.form1.seibetu.checked){ flag=1; } } if(flag){ window.alert('性別が選択されていません'); return false; } else{ return true; } if(document.form1.nenrei.options[document.form1.nenrei.selectedIndex]. value==""){ flag=1; } if(flag){ window.alert('年齢が選択されていません'); return false; } else{return true; } }

  • jQueryのclass属性削除ができません

    OS:Windows7 ブラウザ:IE10 いつもこちらでお世話になっています。 以下のようなjQueryで、removeClassでclass属性を削除しようとしていますが、削除できません。 --スクリプト-- $(function () { $(".datepicker").datepicker({ changeMonth: true, changeYear: true, showMonthAfterYear: false, dateFormat: 'yy-mm-dd', showOn: "button", buttonImage: "calendar.gif", buttonImageOnly: true, buttonText: "カレンダ表示", yearRange: "2003:2025", speed: "fast" });    $("#ID").click(function(){ (".datepicker").removeClass("datepicker"); }); --HTML(簡略)-- <input type='text' class='datepicker' size='12' maxlength='10' style='ime-mode:disabled'> <input type='button' id='ID'> jQuery UIのdatepickerが関係していると思うのですが、どこか記述に問題があるのでしょうか。 どなたかご教示お願いいたします。

  • jQueryの関数から変数を取得

    次のうち変数valを取得してこれとは別の関数で利用したいのですが、どうやればこの変数を取得出来るのでしょうか? 単純な関数だと関数名を付けて戻り値にvalを指定してそれを呼び出してあげれば良いと思うのですが、この場合はどうしたら良いのか分からず頭を悩ませています。 var timer = false; var replaceWidth = 320; var prefWidth = parseInt( $( window ).width() ); $( window ).resize( function () { if( timer !== false ) { clearTimeout( timer ); } timer = setTimeout( function () { var self = $( this ); var windowWidth = parseInt( $( window ).width() ); if( windowWidth <= replaceWidth && replaceWidth < prefWidth ) { var val = 1; } else if( replaceWidth < windowWidth && prefWidth <= replaceWidth ) { var val = 10; } prefWidth = windowWidth; }, 200 ); });

専門家に質問してみよう