Я хочу предотвратить ввод других элементов управления, чем активный jQuery DatePicker (активный datepicker = фокус на его текстовое поле или открыть календарь), пока я не проверил дату со сценарием.
Я пытался сделать это, предотвращая размытие, которое отлично работает, когда вы выходите из поля. Но когда, например, пользователь нажимает флажок, этот флажок будет отмечен/снят до того, как событие размытия будет запущено в текстовом поле DatePicker.
Это был мой первоначальный план с помощью валидаторов asp.net (пользовательский валидатор для допустимых дат и пользовательский валидатор для проверки daterange):
$('#myCalendar').blur(function(){
return Page_ClientValidate('myValidationGroup');
});
Как я могу предотвратить ввод на других элементах управления, пока выбранная/введенная дата недействительна, не помещая проверки на другие элементы управления? Я предпочитаю не отключать все остальные элементы управления.
Обновление. Кажется, что предупреждение будет отменять событие на другом элементе управления. Теперь, почему это так, и могу ли я использовать это в своих интересах таким образом, чтобы не требовалось предупреждение?
Событие размытия не пузырится в Internet Explorer. Поэтому скрипты, которые полагаются на делегирование событий с событием размытия, не будут работать последовательно в браузерах. Начиная с версии 1.4.2, jQuery работает вокруг этого ограничения, сопоставляя размытие с событием фокуса в своих методах делегирования событий.live() и.delegate().
Это из документации jquery api.
Вы пробовали использовать пользовательский валидатор на стороне клиента?
Мы помещаем этот код в наш глобальный файл core.js.
function dateValidator(source, arguments) {
var d = new Date(arguments.Value);
return arguments.IsValid = !isNaN(d.valueOf());
}
затем используйте пользовательский валидатор, вызывающий скрипт.
<asp:CustomValidator ID="cvInstallationDate" runat="server" Display="Dynamic" ErrorMessage="Invalid Installation Date."
ControlToValidate ="txtInstallationDate" EnableClientScript="true" ClientValidationFunction ="dateValidator">
<img src='/Images/WarningIcon.png' width='16' height='16' title='Invalid Installation Date' />
</asp:CustomValidator>
Это так же хорошо, как я могу получить его сам, теперь достаточно:
$(document).ready(function () {
$("input.DatePicker:text").on("blur.MyNamespace", function () { return dp_FireValidators(this, null); });
});
var rewriteHandlers = 'click.MyNamespace, dblclick.MyNamespace, change.MyNamespace, focusin.MyNamespace, keydown.MyNamespace, keypress.MyNamespace, mousedown.MyNamespace';
function dp_FireValidators(sender, args) {
$(sender).removeClass('CalenderInvalidDate');
if (sender.Validators.length > 0) {
var vGroup = sender.Validators[0].validationGroup;
if (vGroup == undefined)
Page_ClientValidate();
else
Page_ClientValidate(vGroup);
for (var i = 0; i < sender.Validators.length; i++) {
if (!sender.Validators[i].isvalid) {
dp_PreventChangesWhileDateIncorrect();
$(sender).addClass('CalenderInvalidDate');
$(sender).focus();
return false;
}
}
}
$("input:checkbox, select").off(rewriteHandlers);
return true;
}
function dp_PreventChangesWhileDateIncorrect() {
$("input:checkbox, select").on(rewriteHandlers, function (e) {
e.preventDefault();
return false;
});
}
Только dblclick на флажке в IE проскользнет.
blur
срабатывает в первую очередь, чем событиеclick
. пожалуйста, посмотрите на jsfiddle: jsfiddle.net/bSfT2