TL; DR : событие щелчка перемещает фокус на элемент, по которому щелкнули. Следовательно, при щелчке по дате в средстве выбора удаляется фокус с ввода и запускается событие focusout
. Перед настройкой входного значения сборщик выполняет различные операции. Следовательно, значение остается пустым на focusout
. Следовательно, предупреждение остается в интерфейсе пользователя.
Объяснение : При щелчке / фокусировке поля date
открывается datepicker
. Настоящая проблема возникает при нажатии на date
в datepicker
. Как только вы нажмете на нее, вы увидите, что поле даты теряет фокус (мигающая каретка исчезает) немедленно. Сборщик закрывается сразу же, как мы настроили autoclose:true
. Ниже приведена функция скрытия, написанная внутри средства выбора даты.
hide: function() {
return this.isInline || !this.picker.is(":visible") ? this : (this.focusDate = null,
this.picker.hide().detach(),
this._detachSecondaryEvents(),
this.setViewMode(this.o.startView),
this.o.forceParse && this.inputField.val() && this.setValue(),
this._trigger("hide"),
this)
- Заставляет сборщика прятаться.
detach()
позволяет удалить соответствующие элементы, не затрагивая детали элемента, в случае повторной установки элементов.
- Удаляет вложенные вторичные события из средства выбора даты.
- Устанавливает видовой режим на настроенный (поскольку он не настроен в нашей задаче, он устанавливается на режим по умолчанию).
- Анализирует выбранное значение и устанавливает проанализированный результат в поле ввода.
- Запускает пользовательский обратный вызов (если есть), настроенный в опциях
Таким образом, перед установкой значения на входе происходит событие onfocusout
. И поскольку в это время значение отсутствует, отображается ошибка.
Чтобы этого не происходило, добавьте обработчик событий hide
в средство выбора (как показано ниже) и выполните ту же проверку оттуда. Этот пользовательский обработчик событий запускается после установки входных значений (как описано выше).
$(function() {
$("#editEventForm").validate({
rules: {
full_name: {
required: true,
},
event_date: {
required: true,
},
},
messages: {
full_name: "Please enter your full name!",
event_date: "Please enter valid date!",
},
onfocusout: function(element) {
$(element).valid();
},
});
$('#eventDate').datepicker({
autoclose: true,
orientation: "bottom right"
}).on("hide",function(){
$("#editEventForm").data("validator").settings.ignore="";
$(this).valid();
}).on("focus",function(){
$("#editEventForm").data("validator").settings.ignore="#eventDate, :hidden";
});
});
<link id="bs-css" href="https://netdna.bootstrapcdn.com/bootstrap/3.0.3/css/bootstrap.min.css" rel="stylesheet">
<link id="bsdp-css" href="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-datepicker/1.8.0/css/bootstrap-datepicker.css" rel="stylesheet">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/jquery-validation@1.17.0/dist/jquery.validate.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-datepicker/1.7.1/js/bootstrap-datepicker.min.js"></script>
<form id="editEventForm">
<div class="form-group">
<div>
<label for="eventDate">Full Name * </label>
<input class="form-control" id="fullName" name="full_name" type="text">
</div>
<div>
<label for="eventDate">Event Date * </label>
<input class="form-control" id="eventDate" name="event_date" placeholder="MM/DD/YYYY" type="text">
</div>
</div>
<input type="submit" value="ClickMe">
</form>
Редактировать : Как уже было сказано, мы не можем предотвратить запуск события focusout
. Но требование может быть достигнуто с помощью обходного пути.
В фокусе, ignore
проверка и на hide
, удалить игнорируемую проверку и подтвердить.
Для ясности проигнорируйте проверку для указанного элемента с помощью
$("#editEventForm").data("validator").settings.ignore="#eventDate, :hidden";`
(:hidden
- значение по умолчанию, поэтому не опускайте его). Во время проверки плагин внутренне использует селектор jQuery not
для игнорирования элементов. При скрытии средства выбора даты (либо путем выбора даты / клика), удалите элемент из конфигурации и примените проверку.