0

jQuery ui datepicker を isotope プラグインおよびフィルター機能と組み合わせて使用​​して、日付で div を除外しています。このフィルター機能を機能させるには、日付が文字列に変換され、すべてのゼロが取り除かれます。たとえば20/08/20132082013. また、この機能を使用してbeforeShowDay、日付ピッカーで関連する日付を強調表示しています。これが問題の場所です。以下の例では、この日付形式を使用しているため、1782013 1882013 1982013スタイリング01/08/2013なども行われます (フィドルでわかるように)。
jsFiddle: http://jsfiddle.net/neal_fletcher/jPzK2/1/
jQuery:

var $container = $('#block-wrap');
var $blocks = $("div.blocks", "#block-wrap");

$(function () {
    var blocks = $('#block-wrap .blocks')
    $('#datepicker').datepicker({
        inline: true,
        //nextText: '→',
        //prevText: '←',
        showOtherMonths: true,
        //dateFormat: 'dd MM yy',
        dayNamesMin: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],
        //showOn: "button",
        //buttonImage: "img/calendar-blue.png",
        //buttonImageOnly: true,
        onSelect: function (dateText, inst) {
            var date = new Date(dateText);
            var dateValue = date.getDate().toString() + (date.getMonth() + 1).toString() + date.getFullYear().toString();

            $container.isotope({
                filter: '[data-value~="' + dateValue + '"]'
            });
        },
        beforeShowDay: function(date){
            var target = date.getDate().toString() + (date.getMonth() + 1).toString() + date.getFullYear().toString();
            var contains = blocks.filter('[data-value*="' + target + '"]').length > 0;
            return [true, contains ? 'special' : '', '']
        }
    });
});

$container.imagesLoaded(function () {
    $container.isotope({
        itemSelector: '.blocks',
        animationEngine: 'css',
        masonry: {
            columnWidth: 5
        }
    });
});

var prepareData = function (howLong) {
    var mode = howLong,
        date = new Date(),
        days = 0,
        d = date.getDate(),
        m = date.getMonth(),
        y = date.getFullYear(),
        duration = [],
        durationReady = [];

    if (mode === "week") {
        days = 7;
    } else if (mode === "month") {
        days = 30;
    }

    for (i = 0; i < days; i++) {
        // for each day create date objects in an array
        duration[i] = new Date(y, m, d + i);

        // convert objects into strings
        // fe. 25th of May becomes '2552013'
        durationReady[i] = duration[i].getDate().toString() + (duration[i].getMonth() + 1).toString() + duration[i].getFullYear().toString();

        // 1. select all items which contain given date
        var $applyMarkers = $('.blocks[data-value~="' + durationReady[i] + '"]')
            .each(function (index, element) {
            var thisElem = $(element),
                thisElemAttr = thisElem.attr('data-value');
            // 2. for each item which does not contain a marker yet, apply one    
            if (thisElemAttr.indexOf(mode.substring(0, 1)) === -1) {
                thisElem.attr('data-value', (thisElemAttr += ' ' + mode));
            }
        });
    }
};

prepareData("week");
prepareData("month");

$("#today").on("click", function () {
    var date = new Date();
    var dateValue = date.getDate().toString() + (date.getMonth() + 1).toString() + date.getFullYear().toString();

    $('#datepicker').datepicker('setDate', date);

    $container.isotope({
        filter: '[data-value~="' + dateValue + '"]'
    });
});


$("#week").on("click", function () {
    $container.isotope({
        filter: '[data-value ~="week"]'
    });
});

$("#month").on("click", function () {
    $container.isotope({
        filter: '[data-value ~="month"]'
    });
});

ご覧のとおりdata-value、日付ピッカーではすべての日付が正常にスタイル設定されていますが、日付形式のために、8 月 1 日から 9 日もスタイル設定されています。filter 関数と beforeShowDay 関数の両方がこの問題なく動作する方法はありますか?
&はい、日付形式をたとえばに変更21082013すると、スタイリングの問題は解決しbeforeShowDayますが、フィルター機能が壊れます。両方とも機能する必要があります。
どんな提案でも大歓迎です!

4

1 に答える 1

0

beforeShowDay関数で * セレクターを使用しています

('[data-value*="' + target + '"]')

これが、「2182013」値に一致するため、8 月 1 日にスタイルが設定された理由です。言葉セレクターに変えて~

('[data-value~="' + target + '"]')
于 2013-08-21T12:14:33.410 に答える