【发布时间】:2014-09-18 03:59:11
【问题描述】:
嗨,有没有办法让 kendodatepicker 允许多选?所以选择多个日期并让它们都保持突出显示?
【问题讨论】:
标签: kendo-ui calendar kendo-asp.net-mvc
嗨,有没有办法让 kendodatepicker 允许多选?所以选择多个日期并让它们都保持突出显示?
【问题讨论】:
标签: kendo-ui calendar kendo-asp.net-mvc
您可以使用我的plugin 选择多个日期。
仍然没有官方方法可以在 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 + '/');
}
实例:
【讨论】:
initCalendar($("#calendar").kendoCalendar(), selectedDates.slice()); 行并删除它们,您会看到不同之处。
我不太确定,但据我所知,目前不支持多选行为,因为日期选择器日历只能有一个日期作为选定值。但如果你真的需要这个选项,你可以自定义它
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
(我是新来的,所以我不能放很多链接)
希望有帮助!!祝你好运
【讨论】: