Проверить, есть ли в элементе элемент jQuery datepicker - PullRequest
39 голосов
/ 05 апреля 2010

У меня есть форма со многими элементами ввода. Некоторые из них являются полями даты с прикрепленным списком дат 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. Мне интересно, как лучше всего проверить, инициализирован ли указатель даты в этом поле.

Ответы [ 6 ]

68 голосов
/ 06 апреля 2010

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

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

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

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
}
12 голосов
/ 05 апреля 2010

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

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

$("#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.

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

1 голос
/ 05 апреля 2010

Одним из основных решений является установка атрибута во время вложения 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");

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

0 голосов
/ 23 января 2019

Если 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 голосов
/ 04 июня 2015

Это было мое решение:)

if(typeof jQuery.fn.datepicker !== "undefined")
0 голосов
/ 30 июля 2012

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

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

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

 $("#yournewelementid").attr("class","your-class-name"); 
 $("#yournewelementid").datepicker();    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...