【问题标题】:Kendo UI Calendar Multiselection剑道 UI 日历多选
【发布时间】:2014-09-18 03:59:11
【问题描述】:

嗨,有没有办法让 kendodatepicker 允许多选?所以选择多个日期并让它们都保持突出显示?

【问题讨论】:

    标签: kendo-ui calendar kendo-asp.net-mvc


    【解决方案1】:

    更新 08.2016


    您可以使用我的plugin 选择多个日期。

    Demo

    旧答案


    仍然没有官方方法可以在 DatePicker 中选择多个日期。但是,借助 jQuery,您可以实现此功能。

    HTML:

    <table>
      <tr>
        <td style="vertical-align: initial; padding-right: 100px;">
          <input id="picker" />
        </td>
        <td>
          <div id="calendar"></div>
        </td>
      </tr>
    </table>
    

    CSS:

    .k-state-selected {
      background-color: transparent;
      border-color: transparent;
      background-image: none;
    }
    
    td.k-state-focused.k-state-selected {
      box-shadow: none;
    }
    
    .k-state-selected > .k-link {
      color: black;
    }
    
    .selected {
      background-color: #F35800;
      border-color: #F85A00;
      background-image: none, linear-gradient(to bottom, rgba(255, 255, 255, 0.2) 0px, rgba(255, 255, 255, 0) 100%);
    }
    
    .selected > .k-link {
      color: #FFF;
    }
    

    JS:

    $(function() {
      var day = 86400000;
      var today = new Date();
      //time is set to midnight for correct comparison with values from calendar
      today.setHours(0, 0, 0, 0);
    
      //data source
      var selectedDates = [
        today.getTime() - day,
        today.getTime(),
        today.getTime() + day
      ];
    
      //DatePicker with multiselection
      initPicker($('#picker').kendoDatePicker(), selectedDates);
    
      //Calendar with multiselection
      //initCalendar($("#calendar").kendoCalendar(), selectedDates.slice());
    });
    
    function initPicker(picker, selectedDates) {
      var isInit = false;
      var kendoPicker = picker.data('kendoDatePicker');
    
      kendoPicker.bind('open', function() {
        if (!isInit) {
          //assuming that corresponding calendar widget has id 'picker_dateview'
          var calendar = $('#' + picker.attr('id') + '_dateview > .k-calendar');
    
          initCalendar(calendar, selectedDates, function() {
            updatePicker(picker, selectedDates);
          });
    
          isInit = true;
        }
      });
    
      picker.on('input change blur', function() {
        updatePicker(picker, selectedDates);
      });
    
      updatePicker(picker, selectedDates);
    }
    
    function initCalendar(calendar, selectedDates, onUpdate) {
      var kendoCalendar = calendar.data('kendoCalendar');
    
      kendoCalendar.bind('navigate', function() {
        setTimeout(function() {
          updateCalendar(calendar, selectedDates);
        }, 0);
      });
    
      updateCalendar(calendar, selectedDates);
    
      calendar.on('click', function(event) {
        var cell = $(event.target).closest('td');
        var isClickedOnDayCell = cell.length !== 0 && isDayCell(cell);
    
        if (isClickedOnDayCell) {
          var date = dateFromCell(cell).getTime();
          var isDateAlreadySelected = selectedDates.some(function(selected) {
            return selected === date;
          });
    
          if (isDateAlreadySelected) {
            selectedDates.splice(selectedDates.indexOf(date), 1);
    
          } else {
            selectedDates.push(date);
          }
    
          updateCell(cell, selectedDates);
    
          if (onUpdate !== undefined) {
            onUpdate();
          }
        }
      });
    }
    
    function updatePicker(picker, selectedDates) {
      var datesString = selectedDates.sort().reduce(function(acc, selected, index) {
        var date = new Date(selected);
        var formattedDate = (date.getMonth() + 1) + '/' + date.getDate() + '/' + date.getFullYear();
    
        return acc + formattedDate + (index === (selectedDates.length - 1) ? '' : ', ');
      }, '');
    
      picker.val(datesString);
    }
    
    function updateCalendar(calendar, selectedDates) {
      calendar.find('td > a').parent().each(function(i, item) {
        var cell = $(item);
    
        if (isDayCell(cell)) {
          updateCell(cell, selectedDates);
        }
      });
    }
    
    function updateCell(cell, selectedDates) {
      var isCellSelected = selectedDates.some(function(selected) {
        return selected === dateFromCell(cell).getTime();
      });
    
      if (isCellSelected) {
        cell.addClass('selected');
    
      } else {
        cell.removeClass('selected');
      }
    }
    
    function isDayCell(cell) {
      return /^\d{1,2}$/.test(cell.find('a').text());
    }
    
    function dateFromCell(cell) {
      return new Date(convertDataValue(cell.find('a').attr('data-value')));
    }
    
    //convert from 'YYYY/MM/DD', where MM = 0..11
    function convertDataValue(date) {
      var regex = /\/(\d+)\//;
      var month = +date.match(regex)[1] + 1;
    
      return date.replace(regex, '/' + month + '/');
    }
    

    实例:

    https://jsfiddle.net/iyegoroff/a8ma6a1j/

    【讨论】:

    • 非常感谢您发布此信息!前 3 种样式的目的是什么?当我删除它们时,我没有看到任何变化。
    • 嗨 @ThatGuyGrant,这些类是针对日历小部件的,如果您取消注释 initCalendar($("#calendar").kendoCalendar(), selectedDates.slice()); 行并删除它们,您会看到不同之处。
    • @ThatGuyGrant,我用更多剑道式的解决方案更新了我的原始答案,所以如果你愿意,可以查看一下。
    【解决方案2】:

    我不太确定,但据我所知,目前不支持多选行为,因为日期选择器日历只能有一个日期作为选定值。但如果你真的需要这个选项,你可以自定义它

    http://demos.telerik.com/kendo-ui/datepicker/template

    并在范围内添加一个通用图像(如下划线)并使用循环给出日期。 在日历中,您可以更改其背景颜色。

    这是您可以尝试的示例代码:

    http://onabai.wordpress.com/2012/09/19/kendo-ui-setting-background-for-specific-dates/

    如果你喜欢这个选项,请尽快投票:

    http://kendoui-feedback.telerik.com/forums/127393-telerik-kendo-ui-feedback/suggestions/4122749-add-range-select-to-datepicker
    

    (我是新来的,所以我不能放很多链接)

    希望有帮助!!祝你好运

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-08
    相关资源
    最近更新 更多