【问题标题】:jQuery datepicker: style certain dates differentlyjQuery datepicker:以不同的方式设置某些日期
【发布时间】:2013-08-19 23:39:55
【问题描述】:

我正在使用 jQuery 日期选择器与同位素插件过滤器功能相结合来过滤掉依赖于日期的 div。每个.blocks div 都有通过data-value 分配的日期,允许您过滤掉这些div。例如.blocks 的第一个实例有 3 个日期 1782013 1882013 1982013。我希望单独设置这些日期的样式,即data-value 属性中的每个日期实例,我想在#datepicker 中分配一个单独的类,以便它们可以设置不同的样式。
jsfiddle 演示:http://jsfiddle.net/neal_fletcher/9WnYY/
HTML:

<div id="datepicker"></div>
<div id="block-wrap">
    <div class="blocks" data-value="1782013 1882013 1982013">17/08 — 19/08</div>
    <div class="blocks" data-value="2182013 2282013 2382013">21/08 — 23/08</div>
    <div class="blocks" data-value="2582013 2682013 2782013 2882013 2982013">25/08 — 29/08</div>    
</div>

jQuery:

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

$(function () {
    $('#datepicker').datepicker({
        inline: true,
        //nextText: '&rarr;',
        //prevText: '&larr;',
        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 + '"]'
            });
        }
    });
});

$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 属性中的所有日期,将它们存储为变量并通过beforeshowday 函数传递它们以分别设置它们的样式?如果那是可能的?任何建议将不胜感激!

【问题讨论】:

  • 1782013 代表什么日期,如果它是17 Aug 2013,您的日期格式有问题...请使其成为17082013,否则您将遇到问题,将日期解析为01 Aug 2013你的代表可能会变成112013

标签: jquery css jquery-ui datepicker jquery-ui-datepicker


【解决方案1】:

你可以看看showBeforeDay选项

$(function () {
    var blocks = $('#block-wrap .blocks')
    $('#datepicker').datepicker({
        inline: true,
        //nextText: '&rarr;',
        //prevText: '&larr;',
        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 = $.datepicker.formatDate( 'ddmmyy', date);
            var contains = blocks.filter('[data-value*="' + target + '"]').length > 0;
            return [true, contains ? 'special' : '', '']
        }
    });
});

演示:Fiddle

注意:正如我在评论中所说,我对data-value格式进行了轻微更改,日期格式更改为ddmmyyyy

【讨论】:

  • 为您的回答喝彩,效果很好,非常感谢!但是有一个小问题,更改日期格式确实会破坏过滤功能,即单击17/08/2013 块会过滤掉所有内容,因为日期格式现在已更改。有没有办法让这两个功能协同工作?
猜你喜欢
  • 2015-02-12
  • 1970-01-01
  • 1970-01-01
  • 2015-05-26
  • 1970-01-01
  • 1970-01-01
  • 2013-01-19
  • 2017-11-05
  • 2018-06-23
相关资源
最近更新 更多