JQuery UI datepicker открывается автоматически в диалоговом окне
У меня есть datepicker, который используется в диалоговом окне jQuery. Источник содержимого диалогового окна загружается с помощью .load()
. В диалоговом окне я создал script, который создает датупик для ввода текста.
$("#date").datepicker({ ... });
Когда я открываю диалоговое окно в первый раз - все в порядке, но если я закрою его и снова заново открою, датапикер запускается автоматически (и нет такой опции, как autoOpen:false
).
Есть ли способ предотвратить это или что я делаю неправильно?
Ответы
Ответ 1
У меня была эта точная проблема и она была решена с небольшим изменением техники tvanfosson. По какой-то причине мне пришлось вручную привязать событие "click" к полю datepicker, как показано ниже.
$('#dialog').dialog({
open: function(event, ui) {
$(ui).find('#date').datepicker().click(function(){
$(this).datepicker('show');
});
},
close: function(event,ui) {
$(ui).find('#date').datepicker('destroy');
}});
(Извините - я бы предпочел опубликовать это как комментарий к сообщению tvanfosson, но не имеет необходимой репутации.)
Ответ 2
Намного проще найти:
$("#dialogPopper").click(
function() {
$("#date").datepicker("disable");
$("#dialog").dialog("open");
$("#date").datepicker("enable");
return false;
}
);
Ответ 3
Когда вы устанавливаете поле datepicker в начале диалога, оно открывается автоматически. Вы можете поместить скрытый ввод в начале диалога.
<input type="text" style="width: 0; height: 0; top: -100px; position: absolute;"/>
Ответ 4
Возможно, вам захочется подумать об уничтожении datepicker, когда диалог будет закрыт, и создав его в обработчике открытых событий для диалога, вместо того, чтобы включать его в качестве script в создании диалога.
$('#dialog').dialog({
open: function(event, ui) {
$(ui).find('#date').datepicker();
},
close: function(event,ui) {
$(ui).find('#date').datepicker('destroy');
}
});
Вы также можете экспериментировать с различными событиями/методами, чтобы увидеть, действительно ли вам нужно его воссоздать, но я думаю, что это сработает.
Ответ 5
Причина в том, что ваш первый элемент внутри модальной формы - это текстовое поле datepicker, и когда модаль уволен, активным элементом управления является тот, который содержит параметр datepicker.
Я обнаружил два альтернативных решения:
-
Измените порядок своих полей. Избегайте того, на котором есть датапикер, чтобы оставаться на первом месте.
-
Не устанавливайте datepicker в поле в отдельном фрагменте кода, выполняйте его внутри функции, которая открывает диалоговое окно (сразу после открытия $("#dialog").dialog("open");
).
Ответ 6
Выбор причины сам по себе, заключается в том, что поле ввода остается сфокусированным после того, как вы открываете сборщик в первый раз.
Вам нужно размыть его:
$input.datepicker({
onClose: function(dateText) {
$(this).trigger('blur');
}
});
Ответ 7
У меня была аналогичная проблема. У меня есть jquery datepicker внутри диалогового окна jquery ui. Когда я открыл диалоговое окно, программа выбора даты автоматически открывалась в IE. Это не делалось в Firefox или Chrome... Я исправил эту проблему, отключив датпикер после создания в $(документе). Уже вот так:
$('.ConfirmMove #from').datepicker({
duration: ''
}).datepicker('disable');
Затем, когда я открывал диалоговое окно с этим параметром datepicker, я включил его в открывшемся обработчике событий диалогового окна:
$(".ConfirmMove").dialog({
close: function() {
$('.ConfirmMove #from').datepicker('disable');
},
open: function() {
$('.ConfirmMove #from').datepicker('enable');
}
});
Вы также должны помнить об отключении его при закрытии диалогового окна.
Таким образом, вы также не уничтожаете и не воссоздаете datepicker каждый раз, когда вы открываете и закрываете диалог.
Ответ 8
Это то, что я сделал, чтобы исправить мою проблему.
Этот код находится в создании диалога.
document.getElementById('date').disabled = true;
setTimeout('document.getElementById("date").disabled = false;', 100);
Таким образом, после открытия диалога, он будет фокусироваться на другом элементе управления.
Вы можете проверить тайм-аут на меньшую задержку, но для меня было 100.
Ответ 9
Я знаю, что это старый вопрос, но одно решение, которое сработало для меня, запускало значок календаря:
$( ".date" ).datepicker({
showOn: "button",
buttonImage: "../css/imgs/calendar.gif",
buttonImageOnly: true
});
Ответ 10
По какой-то причине календарь прекратил свое поведение, когда я заполнил параметр анимации в инициализаторе:
showAnim: Drop
Ответ 11
Из исходного кода я обнаружил, что jQuery.Dialog
всегда отслеживает событие focusin
для элементов внутри диалога и запускает событие focus
в этом элементе после того, как диалог активирует активное состояние. Чтобы предотвратить это поведение, просто прекратите распространение событий в пузырьках с элемента, в который сосредоточено.
$("#input").on("focusin", function (e) {
return false; // or e.stopPropagation();
}).datepicker();
Ответ 12
Это просто фокус диалога: api.jqueryui.com/dialog/
При открытии диалога фокус автоматически перемещается в первый элемент, который соответствует следующему
- Первый элемент в диалоговом окне с атрибутом автофокуса
- Первый: tabbable-элемент внутри содержимого диалога
- Первый: tabbable-элемент в панели кнопок диалога
- Кнопка закрытия диалогового окна
- Сам диалог
Решение заключается в использовании атрибута autofocus
для других полей, чем datepicker
.