2009-05-31 7 views
28

У меня есть datepicker, который используется в диалоговом окне jQuery. Источник содержимого диалогового окна загружается с использованием .load(). В диалоговом окне я создал скрипт, который создает датупик для ввода текста.jQuery UI datepicker открывается автоматически в диалоговом окне

$("#date").datepicker({ ... }); 

При открытии диалогового окна в первый раз - все в порядке, но если я его закрыть и открыть снова, DatePicker запускается автоматически (и нет такого варианта, как autoOpen:false) Есть ли способ предотвратить это или что я делаю неправильно?

ответ

15

У меня была эта точная проблема и она была решена с небольшим изменением в технике 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

Хорошее решение, хотя мне пришлось изменить ui на это. Это необходимо, если у вас нет готового диалога (в DOM), но динамически создайте его с помощью JS. – alekwisnia

8

Возможно, вам захочется подумать об уничтожении datepicker, когда диалог закрыт, и создать его в обработчике открытого события для диалога, вместо того, чтобы включать его в качестве скрипта в создании диалога.

$('#dialog').dialog({ 
    open: function(event, ui) { 
     $(ui).find('#date').datepicker(); 
    }, 
    close: function(event,ui) { 
     $(ui).find('#date').datepicker('destroy'); 
    } 
}); 

Вы можете также экспериментировать с различными событиями/методы, чтобы увидеть, если вам действительно нужно, чтобы воссоздать его, но я думаю, что это будет работать.

+0

Я пробовал это, и он не работает :( Возможно, это связано с загрузкой содержимого с помощью ajax, например: $ ('# dialog'). Load ({...}). Dialog ({.. .}); – turezky

+0

Что не работает - датапикер не создан или он все еще появляется при повторном открытии? Возможно, вам следует опубликовать полный код. – tvanfosson

+0

спасибо tvanfosson.It работает. – krishna

2

У меня была аналогичная проблема. У меня есть jquery datepicker внутри диалогового окна jquery ui. Когда я открыл диалоговое окно, программа выбора даты автоматически открывалась в IE. Это не делает, что в Firefox или Chrome ... Я исправил проблему, отключив DatePicker при создании в $ (документ) .ready так:

$('.ConfirmMove #from').datepicker({ 
    duration: '' 
}).datepicker('disable'); 

Тогда, когда я открывала диалоговое окно, содержащее этот DatePicker Я включил его в открытом обработчик события диалога:

$(".ConfirmMove").dialog({ 
    close: function() { 
    $('.ConfirmMove #from').datepicker('disable'); 
    }, 
    open: function() { 
    $('.ConfirmMove #from').datepicker('enable'); 
    } 
}); 

вы также должны помнить, чтобы отключить его обратно при закрытии диалогового окна.

Таким образом, вы также не уничтожаете и не воссоздаете датупик при каждом открытии и закрытии диалога.

32

Гораздо более простой способ я нашел:

$("#dialogPopper").click(
        function() { 
         $("#date").datepicker("disable"); 
         $("#dialog").dialog("open"); 
         $("#date").datepicker("enable"); 
         return false; 
        } 
       ); 
+0

это работает. очень красиво и просто. – 2012-01-25 22:26:26

+0

Мой диалог содержит результат ajax, поэтому мне пришлось добавить в мои параметры datepicker и после Я добавил . Работает как шарм. – Palantir

+0

Это отлично поработало для меня, ура! –

20

Когда вы кладете поле Datepicker в начале диалога он открывается автоматически. Вы можете поместить скрытый ввод в начале диалога.

<input type="text" style="width: 0; height: 0; top: -100px; position: absolute;"/> 
+1

Это единственное жизнеспособное решение, когда модаль у кого-то else, если вы не хотите модифицировать их плагин. –

+1

Приятная техника гетто. У меня был некоторый ввод раньше, но они были «скрыты», и, похоже, это не считается. Добавление бесполезного ввода перед началом работы отлично, но при этом добавить бесполезный дом элемент, и когда вы публикуете свою форму, у вас есть это значение ни за что. – Carlos2W

0

Я знаю, что это старый вопрос, но одно решение, которое работало для меня было вызвав значком календаря:

$(".date").datepicker({ 
    showOn: "button", 
    buttonImage: "../css/imgs/calendar.gif", 
    buttonImageOnly: true 
}); 
1

Это то, что я сделал, чтобы исправить мою проблему.

Этот код находится в создании диалога.

document.getElementById('date').disabled = true; 
setTimeout('document.getElementById("date").disabled = false;', 100); 

Таким образом, после открытия диалогового окна он будет фокусироваться на другом контроле.

Вы можете проверить тайм-аут на меньшее количество задержек, но 100 были в порядке для меня.

5

Причина в следующем: ваш первый элемент внутри модальной формы - это текстовое поле datepicker, а когда модальный уволен, активным элементом управления является тот, который содержит дату.

Я нашел два альтернативных решения:

  1. изменить порядок ваших полей. Избегайте того, чтобы набирать даты на первом месте.

  2. Не устанавливайте датупипетку в поле в отдельной части кода, делайте это внутри функции, которая открывает диалог (сразу после открытия $("#dialog").dialog("open");).

0

По какой-то причине календаря прекращался таким поведением, когда я заполнил в опции анимации в инициализаторе:

showAnim: Drop

4

Початкоотделитель причины открывается сам по себе, является то, что поле ввода остается сосредоточенным после того, как вы открываете сборщик в первый раз.

Вы должны размыть его:

$input.datepicker({ 
    onClose: function(dateText) { 
    $(this).trigger('blur'); 
    } 
}); 
+0

Приятный и простой, я назвал размытие сразу после открытия диалога, и он решил мою проблему. –

0

Из исходного кода я обнаружил, что jQuery.Dialog всегда отслеживает focusin события на элементах в диалоге, и запускают focus события на этом элемент после диалога выгоды активного состояния. Чтобы предотвратить такое поведение просто остановить кипящее распространение события от элемента фокусируясь в

$("#input").on("focusin", function (e) { 
    return false; // or e.stopPropagation(); 
}).datepicker(); 
1

Это просто диалогом фокусировка:. api.jqueryui.com/dialog/

После открытия диалога нажмите автоматически перемещается на первый элемент, который соответствует следующим

  1. Первый элемент в диалоге с атрибутом автофокусировкой
  2. Первый: tabbable элемент в содержимое диалогового окна в
  3. Первый: tabbable элемент внутри Диалог buttonpane
  4. кнопка закрытия окна редактора
  5. сам диалог

Решение заключается в использовании атрибута autofocus в других полях, кроме datepicker.

+0

Мне нравится вариант автофокуса лучший. Простой и следует t он документация jquery – Kevbo