У меня есть форма с полем ввода для дат. Даты должны быть подтверждены: допускаются только даты с сегодняшнего дня + максимум 3 года. Если дата действительна, появится модальная мода, иначе появится сообщение с сообщением об ошибке.onchange + проверка + введите ключевое странное поведение
Предполагая, что Сомон меняет дату на 26.10.2099:
Все работает, как ожидалось, если один выходит из поля ввода (нажав где-нибудь еще с помощью мыши):
- появляется сообщение об ошибке
- дата получает автоматически изменяется обратно
- не модальный показывает
НО если один нажимает Enter вместо того чтобы просто оставить поле ввода, то происходит следующее:
- сообщения об ошибке не показывает
- даты получает автоматически изменяется обратно
- модальные показывает вверх
Моей мысль что изменение даты до ее первоначального значения приводит к тому, что событие onchange будет запущено снова, а затем дата будет действительна и покажет модальность. Но это не относится к первому сценарию. Во втором сценарии событие запускается дважды SOMETIMES, но не всегда.
Вы можете проба себя здесь: https://jsfiddle.net/6x9n53fx/3/
Или прочитать код ниже:
HTML:
<div class="container">
<form method="post" action="" enctype="multipart/form-data">
<div class="row">
<div class="col-sm-6">
<div class="form-group">
<label for="review_date">Valid until *</label>
<input id="review_date" type="text" name="review_date" value="26.10.2016" class="form-control">
<p>Please set a validation date. (max 3 years)</p>
</div>
</div>
</div>
</form>
</div>
<!-- Modal -->
<div class="modal fade" id="info_modal" tabindex="-1" role="dialog" aria-labelledby="modal_title">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button>
<h4 class="modal-title" id="modal_title">Dialog</h4>
</div>
<div class="modal-body">
<div class="form-group mbn">
<p class="mb10">Date successfully changed.</p>
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-primary" data-dismiss="modal">Ok</button>
</div>
</div>
</div>
</div>
Javascript:
var datumfeld = $("#review_date");
var initialdatum = datumfeld.val();
var i = 0;
datumfeld.datepicker({
minDate: 0,
maxDate: "3y",
dateFormat: 'dd.mm.yy'
});
datumfeld.change(function() {
i++;
console.log('onchange triggered: ' + i);
if (validateDatum()) {
$("#info_modal").modal({
backdrop: "static",
keyboard: false
});
}
});
function validateDatum() {
var dateParts = datumfeld.val().split(".");
var review_date = new Date(dateParts[2], (dateParts[1] - 1), (parseInt(dateParts[0]) + 1));
if (((new Date(review_date - (new Date()))).getFullYear() - 1970) > 2) {
alert("Error: The date must not exceed 3 years from now.");
datumfeld.val(initialdatum);
return false;
}
if ((review_date - (new Date)) < 0) {
alert("Error: The date must not be in the past.");
datumfeld.val(initialdatum);
return false;
}
return true;
}
EDIT:
Вот окончательное решение, я пошел с:
datumfeld.on('keydown', function(e) {
// when keydown is ENTER (13)
if (e.keyCode == 13) {
// Hide the datepicker
$(this).datepicker('hide');
// Trigger a change event to trigger the validation
$(this).trigger('change');
}
})
откуда у ¨R вызова validateDatum()? – user1844933
datumfeld.change() где validateDatum() называется – Danmoreng
Onchange будет срабатывать, когда вы покинете фокус, поэтому вам нужно использовать onkeypress слишком – user1844933