3

これは私のクリック機能です

$('.cal table tbody td').on('click', function () {
    if($(this).hasClass('available'))
    {
        alert('asd');
    }
});

私が抱えている問題は、次の月または前の月に切り替えた後、カレンダーのクリック機能が機能しないことです。

たとえば、私のJSFIDDLEでは、前の月に移動してから現在の月に戻ってクリック機能を実行すると、機能しなくなります。

編集:私はdate.jsと呼ばれる外部ライブラリを使用しています.jsfiddleをチェックして、何が起こっているのかをより明確に理解してください.

EDIT 2:更新されたjsfiddleリンク

jsfiddle

4

4 に答える 4

6

これを使って

$(document).on('click','.cal table tbody td', function () {
        if ($(this).hasClass('available')) {
            alert('asd');
        }
});

これの代わりに

$('.cal table tbody td').on('click', function () {
        if ($(this).hasClass('available')) {
            alert('asd');
        }
    });

前者は正しい代替品ですdelegate

于 2013-07-31T05:58:47.653 に答える
1

ここで動作中のバージョンを表示できます。または、以下の更新された jQuery をご覧ください。

var firstday = new Date();
var lastday = new Date();
var calendarmonth = new Date();
var CCheck;

$(document).ready(function () {
    Date.today();

    firstday.setMonth(Date.today().getMonth(), 1);
    lastday.setMonth(Date.today().getMonth() + 1, 0);
    calendarmonth.setMonth(Date.today().getMonth());

    calendarInit();

    $('#calendar-prev').on('click', function () {
        if (CCheck > 35) {
            //render 6 rows
            for (i = 1; i < 7; i++) {
                $('#row' + i).remove();
            }
        } else {
            //render 5 rows
            for (i = 1; i < 6; i++) {
                $('#row' + i).remove();
            }
        }
        $("#month").empty();
        calendarmonth.addMonths(-1);
        firstday.addMonths(-1);
        lastday.setMonth(firstday.getMonth() + 1, 0);
        calendarInit();
    });

    $('#calendar-next').on('click', function () {
        if (CCheck > 35) {
            //render 6 rows
            for (i = 1; i < 7; i++) {
                $('#row' + i).remove();
            }
        } else {
            //render 5 rows
            for (i = 1; i < 6; i++) {
                $('#row' + i).remove();
            }
        }
        $("#month").empty();
        calendarmonth.addMonths(1);
        firstday.addMonths(1);
        lastday.setMonth(firstday.getMonth() + 1, 0);
        calendarInit();
    });
    addRemoveClickTrigger();

});

function calendarInit() {
    CCheck = lastday.getDate() + firstday.getDay();
    var i;
    var colNo;
    var a = 1;
    var days = new Array();
    $("#month").append("Month: " + calendarmonth.toString("MMMM, yyyy"));
    if (CCheck > 35) {
        //render 6 rows
        for (i = 1; i < 7; i++) {
            $('#calendar tbody').append('<tr id = row' + i + '></tr>');
            colNo = a + 6;
            for (a; a <= colNo; a++) {
                var datenum = a - firstday.getDay();
                if (datenum < 1) {
                    $('#row' + i).append('<td></td>');
                } else if (datenum > lastday.getDate()) {
                    $('#row' + i).append('<td></td>');
                } else {
                    $('#row' + i).append('<td id = Y' + calendarmonth.getFullYear() + 'M' + calendarmonth.getMonth() + 'Day' + datenum + '>' + datenum + '</td>');
                    days[datenum] = new Date();
                    days[datenum].set({
                        month: calendarmonth.getMonth(),
                        day: datenum,
                        year: calendarmonth.getFullYear()
                    });
                }
            }
        }
    } else {
        //render 5 rows
        for (i = 1; i < 6; i++) {
            $('#calendar tbody').append('<tr id = row' + i + '></tr>');
            colNo = a + 6;
            for (a; a <= colNo; a++) {
                var datenum = a - firstday.getDay();
                if (datenum < 1) {
                    $('#row' + i).append('<td></td>');
                } else if (datenum > lastday.getDate()) {
                    $('#row' + i).append('<td></td>');
                } else {
                    $('#row' + i).append('<td id = Y' + calendarmonth.getFullYear() + 'M' + calendarmonth.getMonth() + 'Day' + datenum + '>' + datenum + '</td>');
                    days[datenum] = new Date();
                    days[datenum].set({
                        month: calendarmonth.getMonth(),
                        day: datenum,
                        year: calendarmonth.getFullYear()
                    });
                }
            }
        }
    }
    /*alert(Date.today().getMonth());
    alert(calendarmonth.getMonth());*/
    if (Date.today().getMonth() == calendarmonth.getMonth() && Date.today().getFullYear() == calendarmonth.getFullYear()) {
        for (i = 1; i <= lastday.getDate(); i++) //Date highlight
        {
            if (Date.today().getDate() == i) //highlight today's date
            {
                $('#Y' + calendarmonth.getFullYear() + 'M' + calendarmonth.getMonth() + 'Day' + i).addClass("today");
            } else if (Date.today().getDate() > i) //highlight unavailable dates
            {
                $('#Y' + calendarmonth.getFullYear() + 'M' + calendarmonth.getMonth() + 'Day' + i).addClass("unavailable");
            } else if (Date.today().getDate() < i) {
                $('#Y' + calendarmonth.getFullYear() + 'M' + calendarmonth.getMonth() + 'Day' + i).addClass("available");
            }
        }
    } else if (Date.today() > calendarmonth) {
        for (i = 1; i <= lastday.getDate(); i++) //Highlight dates before today to unavailable
        {
            $('#Y' + calendarmonth.getFullYear() + 'M' + calendarmonth.getMonth() + 'Day' + i).addClass("unavailable");
        }
    } else {
        for (i = 1; i <= lastday.getDate(); i++) //Condition highlighting
        {
            $('#Y' + calendarmonth.getFullYear() + 'M' + calendarmonth.getMonth() + 'Day' + i).addClass("available");
            if (days[i].getDay() == 0 || days[i].getDay() == 6) // set weekends to unavailable
            {
                $('#Y' + calendarmonth.getFullYear() + 'M' + calendarmonth.getMonth() + 'Day' + i).removeClass("available");
                $('#Y' + calendarmonth.getFullYear() + 'M' + calendarmonth.getMonth() + 'Day' + i).addClass("unavailable");
            }
        }
    }
    addRemoveClickTrigger();
} //calendarInit()

function addRemoveClickTrigger()
{
    $('.cal table tbody td').off();
    $('.cal table tbody td').on({
        'click':
        function () 
        {
            alert(jQuery(this).prop('class'));
            if ($(this).hasClass('available')) 
            {
                alert('asd');
            }
        }
    });        
} //addRemoveClickTrigger()

これが役立つことを願っています。

于 2013-07-31T06:04:57.093 に答える
1

私がすぐに気付くことの 1 つは、次のようなことを行うときです。

$('#calendar tbody').append('<tr id = row'+i+'></tr>'); 

要素に ID を付与する場合は、ID の「値」部分を引用符で囲む必要があることを覚えておく必要があります。

そのため、ブラウザーが html を適切に解釈できるように、文字列をエスケープしてそれらを含める必要があります。

すなわち

$('#calendar tbody').append('<tr id = \"row'+i+'\"></tr>');

そうすれば、出力は次のようになります。

<tr id="rowx"></tr>

それ以外の:

<tr id=rowx></tr>
于 2013-07-31T05:49:52.493 に答える
1

前と次のイベント ハンドラーは、カレンダーのレンダリングに使用される DOM 要素を再作成しています。ただし、クリック ハンドラーは、ハンドラーの登録時に DOM に存在する要素にのみ関連付けられます。on()のドキュメントには次のように記載されています。

イベント ハンドラーは、現在選択されている要素にのみバインドされます。コードが .on() を呼び出すときに、ページに存在する必要があります。

カレンダーの新しい行 (新しい要素) がレンダリングされたcalendarInit()、そのクリック ハンドラーを関数の一部として再登録する必要があるでしょう。

于 2013-07-31T05:57:56.967 に答える