it-swarm.com.ru

Проверить, есть ли в элементе элемент jQuery datepicker

У меня есть форма со многими элементами ввода. Некоторые из них представляют собой поля даты с прикрепленным списком параметров jQuery UI:

$("#someElement").mask("9?9/99/9999").datepicker({showOn: 'button', buttonText:'Click here to show calendar', duration: 'fast', buttonImageOnly: true, buttonImage: /images/calicon.gif' });

Тогда у меня есть ключевая команда, связанная с этой функцией:

function openCalendar() {
    var selection = document.activeElement;

    // { Need to test here if datepicker has already been initialized 
        $(selection).datepicker("show");
    // }
}

Это прекрасно работает для элементов, на которых уже есть указатель даты. Однако любые другие поля приведут к ошибке JavaScript. Мне интересно, как лучше всего проверить, инициализирован ли указатель даты в этом поле. 

36
macca1

Ничего себе не могу поверить, что я пропустил это Строка 108 из ui.datepicker.js:

/* Class name added to elements to indicate already configured with a date picker. */
markerClassName: 'hasDatepicker',

Так что мне просто нужно проверить на hasClass('hasDatepicker'). Это кажется самым простым способом. Кроме того, этот оператор проверяет, открыт ли в настоящий момент DatePicker (для всех, кто заинтересован):

if ($("#ui-datepicker-div").is(":visible") && $("#ui-datepicker-div").html() != "") {
    // datepicker is open. you need the second condition because it starts off as visible but empty
}
65
macca1

1) Если код выдает ошибку при попытке открыть средство выбора даты, вы можете поместить код в try..catch

2) Вы можете установить некоторые данные в поле ввода при инициализации DatePicker

$("#someElement").data("datepicker-initialized", true);

3) Вы можете использовать данные, хранящиеся в плагине datepicker

if($("#someElement").data("datepicker") != null){
   // datepicker initialized
}

или же

if($.data($('#someElement').get(0), 'datepicker')){
   // datepicker initialized
}

4) DatePicker внутренне использует функцию _getInst

if($.datepicker._getInst($('#someElement')[0]) != null){}

метод делает почти то же самое, что и пример 3.

Не могу найти лучшего решения.

10
Rafael

Одно из основных решений - установить атрибут во время вложения datepicker, а затем проверить это:

$("#someElement").mask("9?9/99/9999")
.datepicker({showOn: 'button', buttonText:'Click here to show calendar', duration: 'fast', buttonImageOnly: true, buttonImage: /images/calicon.gif' })
.attr("data-calendar", "true");

Тогда вы могли бы сделать:

if ($(selection).attr("data-calendar") == "true")
    $(selection).datepicker("show");

Есть ли более прямой путь?

1
macca1

У меня есть еще один случай. Мой скрипт копирует последние элементы таблицы, включая DatePicker.

JQuery не будет работать, потому что скопированный элемент имеет пометку «hasDatepicker».

Чтобы активировать указатель даты в новом элементе, удалите это имя класса и инициируйте его, как это.

 $("#yournewelementid").attr("class","your-class-name"); 
 $("#yournewelementid").datepicker();    
0
Ahmad

Если section является вашим элементом dom для средства выбора даты, проверьте, инициализирована ли уже, а если нет, сначала инициализируйте его как средство выбора даты (вы можете добавить свойства), а затем покажите его!

    // If already initialized        
    if ( typeof selection !== 'undefined' && selection.length > 0)
         $(selection).datepicker('show');
    // otherwise initialize first and show
    else 
         $(selection).datepicker().datepicker('show');
0
Zhelyo Hristov