QA@IT

カレンダーとプルダウンを連動させるためのjavascriptの設定の仕方がわかりません。

3825 PV

webデザインを初めて1年目の素人です。
お答え頂ければ幸いです。

現在、プルダウンと連動したカレンダー機能を作成しているのですが、うまくいきません。

希望の表示としては、
・カレンダーアイコンをクリックするとカレンダーが表示される。
・カレンダーの日付をクリックするとプルダウンも連動して変わる。

カレンダーアイコンをクリックしてカレンダーが表示する部分はうまくいきました。

最初、プルダウンを年と月と日を分けて作成していて、その時は連動して表示ができたのですが、
年と月を合体させた表示で連動させようとすると、年月のプルダウンは変化せず、
日の部分に月の数字が入ってしまうといった表示になります。

参考にしたサイトは
https://beanb.wordpress.com/2014/10/29/%E3%83%95%E3%82%A9%E3%83%BC%E3%83%A0%E3%81%A8%E3%82%AB%E3%83%AC%E3%83%B3%E3%83%80%E3%83%BC%E3%82%92%E9%80%A3%E5%8B%95%EF%BC%88%E3%83%97%E3%83%AB%E3%83%80%E3%82%A6%E3%83%B3%EF%BC%89/
http://www.tabikobo.com/
の2つを参考にしました。

カレンダー部分の記述を簡単に書いていくと、
【HTML】

                        <div class="sp-block">
                            <select  id="year_month" class="form-control w-s">
                                <option value="">指定なし</option>
                            </select><span>月</span>

                            <select  id="day" class="form-control w-s">
                                <option value="">指定なし</option>
                            </select><span>日</span>
                            <input type="hidden"  name="" value="" />
                        </div>
                    </dd>

【JS】
//以下は日程のプルダウンとカレンダー

function updateSelected(date){
console.log(date);
$('#year_month').val(date.substring(0, 4)+'-'+date.substring(5, 7));
$('#day').val(date.substring(8, 10));
}
$(function(){

var myD = new Date();
var myYear = myD.getFullYear();
var myMonth = myD.getMonth() + 1;
for (i = myMonth; i <= 12; i++) {
    var val = myYear + '-' + ('00' + i).slice(-2);
    var html = myYear + '年' + ('00' + i).slice(-2) + '月';
    $('#year_month').append($('<option />').val(val).html(html));
}
var myYear = myYear + 1;
for (i = 1; i <= myMonth; i++) {
    var val = myYear + '-' + ('00' + i).slice(-2);
    var html = myYear + '年' + ('00' + i).slice(-2) + '月';
    $('#year_month').append($('<option />').val(val).html(html));
}
//1〜31の数字を生成
for (var i = 1; i <= 31; i++) {
    if (i < 10) {
        i = '0' + i;
    }
    $('#day').append($('<option />').val(i).html(i));
}

//カレンダーからプルダウンを更新
$('.calender').each(function() {
    var id = '#' + $(this).attr('id');
    $(id + ' input').bind('change', function() {
        var i = 0;
        var dates = $(this).val().split('/');
        $(id + ' select').each(function() {
        var year = dates[0];
            $(this).val(dates[i]);
            i++;
        });
    });
});

//プルダウンからカレンダーを更新
$('.calender').each(function() {
    var id = '#' + $(this).attr('id');
    $(id + ' select').bind('change', function() {
        var i = 1;
        var dates = new Array(3);
        $(id + ' select').each(function() {
            dates[i] = $(this).val();
            i++;
        });
        var newdate = dates[0] + '/' + dates[1] + '/' + dates[2];
        $(id + ' input').val(newdate);
    });
});

//カレンダーの表示
var date = new Date();
var year = date.getFullYear();
$.datepicker.setDefaults({
    showOn: 'button',
    buttonText:'',
    //buttonImage: '../img/calender.jpg',
    //buttonImageOnly: false,
    closeText: '閉じる',
    prevText: '前',
    nextText: '次',
    currentText: '今日',
    monthNames: ['1月','2月','3月','4月','5月','6月',
                 '7月','8月','9月','10月','11月','12月'],
    monthNamesShort: ['1月','2月','3月','4月','5月','6月',
                      '7月','8月','9月','10月','11月','12月'],
    dayNames: ['日曜日','月曜日','火曜日','水曜日','木曜日','金曜日','土曜日'],
    dayNamesShort: ['日','月','火','水','木','金','土'],
    dayNamesMin: ['日','月','火','水','木','金','土'],
    weekHeader: '週',
    dateFormat: 'yy/mm/dd',
    firstDay: 0,
    isRTL: false,
    showMonthAfterYear: true,
    yearSuffix: '年',
    minDate: new Date(year, 1 - 1, 1),
    maxDate: new Date(year + 1, 12 - 1, 31)
});
$('.calender input').datepicker();

//$('#ui-datepicker-div').hide();

});

という形になっています。

JSの設定の問題かと思うのですが原因がわかりません。

どなたかご教授お願いいたします。

回答

元のコードがどこまでわかっているのかわかりませんが、

「カレンダーからプルダウンを更新」の以下の部分を変更していないからでしょう。

        $(id + ' select').each(function() {
            var year = dates[0];
            $(this).val(dates[i]);
            i++;
        });

「プルダウンから~」も同様の事をやっている個所を直していないのが原因です。
ここで何が起きているのか、修正前・修正後で前提・状態がどう変わったのか考えてみる事です。

理解できたら eachで回しても仕方ないので、これをやめてここで直接値を設定するといいでしょう。
(updateSelectedでやっているような方法で)

編集 履歴 (0)
  • 返答ありがとうございます。

    $(id + ' select').each(function() に続けてifの条件分岐を入れたら解決できました。
    ありがとうございました。
    -
  • datesとselectの数が一致しないのでeachで回す価値はないと思います。
    その回答者も言っていますが
    単純に
    $('#year_month').val(dates[0]+'-'+dates[1]);
    $('#day').val(dates[2]);
    などでいいでしょう。
    -
ウォッチ

この質問への回答やコメントをメールでお知らせします。