Проблема при изменении вида путем выпадания даты загрузки
Я сталкиваюсь с проблемой с bootstrap datepicker, когда я пытаюсь изменить представление datepicker в соответствии с режимом, выбранным в раскрывающемся списке.
Ниже приведен код HTML:
Mode : <select id="mode">
<option value="1">Day</option>
<option value="2">Month</option>
<option value="3">Year</option>
</select>
<br><br>
From : <input type="text" id="from" />
To : <input type="text" id="to" />
Код jQuery:
$("#from").datepicker({
autoclose: true,
startDate: '+1d',
endDate: '+1y',
clearBtn: true,
todayHighlight: true,
});
$("#to").datepicker({
autoclose: true,
startDate: '+1d',
endDate: '+1y',
clearBtn: true,
todayHighlight: true,
orientation: "top right"
});
$("#mode").change(function(){
jQuery("#to").removeAttr('disabled');
$("#from").val('');
$("#to").val('');
$("#from").datepicker('update');
$("#to").datepicker('update');
$("#from").datepicker("remove");
$("#to").datepicker("remove");
if ($(this).val() == 2){
$("#from").datepicker({
autoclose: true,
startDate: '0',
endDate:'+1y',
startView: 1,
minViewMode: 1,
clearBtn: true,
});
$("#to").datepicker({
autoclose: true,
startDate: '0',
startView: 1,
endDate:'+1y',
minViewMode: 1,
clearBtn: true,
orientation: "top right"
});
$("#from").datepicker().on("clearDate", function(){
$("#to").val('');
$("#to").datepicker('update');
});
$("#to").datepicker().on("clearDate", function(){
$("#from").val('');
$("#from").datepicker('update');
});
$("#from").datepicker().on("changeDate", function(){
var fromDate = $("#from").datepicker("getDate");
if (fromDate != "Invalid Date" && fromDate != '' ) {
fromDate.setMonth(fromDate.getMonth() + 1, 1);
$("#to").datepicker("setDate", fromDate);
$("#to").datepicker("setStartDate", fromDate);
$("#to").datepicker("update");
}
});
$("#to").datepicker().on("changeDate", function(){
var toDate = $("#to").datepicker("getDate");
if (toDate != "Invalid Date") {
$("#from").datepicker("setEndDate", toDate);
$("#from").datepicker("update");
}
});
}else if($(this).val() == 3){
jQuery("#to").attr('disabled', 'disabled');
$("#from").datepicker({
autoclose: true,
startDate: '0',
endDate:'+1y',
startView: 0,
minViewMode: 0,
clearBtn: true,
});
//clear event for the datepicker
$("#from").datepicker().on("clearDate", function(){
$("#to").val('');
$("#to").datepicker('update');
});
$("#to").datepicker().on("clearDate", function(){
$("#from").val('');
$("#from").datepicker('update');
});
//set startdate event for the datepicker
$("#from").datepicker().on("changeDate", function(){
var fromDate = $("#from").datepicker("getDate");
if (fromDate != "Invalid Date") {
fromDate.setDate(fromDate.getDate() + 365);
$("#to").datepicker("setDate", fromDate);
$("#to").datepicker("setStartDate", fromDate);
}
});
$("#to").datepicker().on("changeDate", function(){
var toDate = $("#to").datepicker("getDate");
if (toDate != "Invalid Date") {
$("#from").datepicker("setEndDate", toDate);
}
});
}else{
$("#from").datepicker({
autoclose: true,
startDate: '+1d',
endDate: '+1y',
clearBtn: true,
todayHighlight: true,
});
$("#to").datepicker({
autoclose: true,
startDate: '+1d',
endDate: '+1y',
clearBtn: true,
todayHighlight: true,
orientation: "top right"
});
}
});
То, что я пытаюсь сделать, у меня есть три типа режимов: День, Месяц и Год. Когда я выбираю месяц в раскрывающемся списке, в его событии изменения мне нужно удалить все предыдущие события, связанные с datepicker, и связать новые события с datepickers.
Но, после изменения режима несколько раз события больше не привязаны, и он прекращает установку значения в полях ввода.
Я не уверен, что это правильный способ сделать это. Если есть другой способ сделать это, это будет очень полезно.
Любая помощь будет назначена. Спасибо заранее.
Это ссылка jsfiddle для кода: http://jsfiddle.net/tejashsoni111/aL9vB/2/
Это ссылка на документацию: http://bootstrap-datepicker.readthedocs.org/en/release/
Ответы
Ответ 1
Просто одним из способов, создайте прототип для вашей даты/времени, как этот
<div id="fake_from_container" style="display:none">
<input type="text" class="fake_text" />
</div>
<div id="from_container>
</div>
Затем, когда вы хотите запустить дату/время, попробуйте
$('#from_container').html($('#fake_from_container').html());
$('.fake_text', $('#from_container')).attr('id', 'from');
$("#from").datepicker().....
Идея такова: во-первых, fake_from_container - это просто хранить HTML-код для ввода,
Каждый раз, когда вы хотите перезапустить дату/время, вы создадите ввод с начала, скопировав html-код из $('# fake_from_container') в $('# from_container'), после этого #from_container будет
<div id="from_container>
<input type="text" class="fake_text" />
</div>
Затем установите идентификатор для элемента ввода внутри #from_container
$('.fake_text', $('#from_container')).attr('id', 'from');
У вас будет
<div id="from_container>
<input type="text" class="fake_text" id='from' />
</div>
Затем вы можете ввести дату/время с помощью любой опции для нового ввода #from
Ответ 2
похоже, что вам нужно .input-daterange
.
HTML
<br>Mode :
<select id="mode">
<option value="1">Day</option>
<option value="2">Month</option>
<option value="3">Year</option>
</select>
<br /><br />
<div id="datepicker-container"> </div>
Теперь загрузите .input-daterange
в #datepicker-container
динамически (каждый раз, когда изменяется окно выбора):
<div class="input-daterange" id="datepicker">from:
<input type="text" name="start" />to:
<input type="text" name="end" />
</div>
Затем каждый раз, когда изменяется selectbox (#mode
), инициируйте функцию .input-daterange
с помощью datepicker()
на основе выбранной опции в selectbox (#mode
).
т.е. полный javascript:
function initDatepicker(mode){
$('#datepicker-container').html(''+
'<div class="input-daterange" id="datepicker">from:'+
'<input type="text" name="start" />to:'+
'<input type="text" name="end" />'+
'</div>');
var $dtpicker=$('#datepicker-container > .input-daterange');
$dtpicker.find(':input').val('');
if (mode == 1) {//Day
$dtpicker.datepicker({
autoclose: true,
startDate: '+1d',
endDate: '+1y',
clearBtn: true,
todayHighlight: true,
});
} else if (mode == 2) {//Month
$dtpicker.datepicker({
autoclose: true,
startDate: '0m',
endDate: '+1y',
clearBtn: true,
startView: 1,
minViewMode: 1
});
} else if (mode == 3) {// Year
$dtpicker.datepicker({
autoclose: true,
startDate: "0y",
endDate: "+1y",
clearBtn: true,
startView: 2,
minViewMode: 2
});
}
}
$("#mode").change(function () {
$('#datepicker-container > .input-daterange').datepicker('remove');
initDatepicker($(this).val());
});
initDatepicker(1);// for first time initiate Day
Ответ 3
Просто используйте
$('#ID').datepicker('destroy');
Перед созданием вида datepicker,
Он уничтожит предыдущий и применит новый datepicker ui, как вы хотите