Testez si l'élément a déjà jQuery datepicker

J'ai un formulaire avec de nombreux éléments d'entrée. Certains sont des champs de date avec un jQuery UI datepicker alraedy attaché:

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

Ensuite, j'ai une commande clé liée à cette fonction:

 function openCalendar() { var selection = document.activeElement; // { Need to test here if datepicker has already been initialized $(selection).datepicker("show"); // } } 

Cela fonctionne bien pour les éléments qui ont déjà le datepicker sur eux. Cependant, tout autre domaine générera une erreur javascript. Je me demande la meilleure façon de tester pour voir si datepicker a déjà été initialisé sur ce domaine.

Wow ne peut pas croire que j'ai raté celui-ci. Ligne 108 de ui.datepicker.js:

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

Je dois donc tester hasClass('hasDatepicker') . Cela semble être le moyen le plus direct. En outre, cette déclaration vérifie si le datepicker est actuellement ouvert (pour toute personne intéressée):

 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 } 

1) Si le code lance une erreur lors de l'ouverture du programme de date, vous pouvez mettre le code en essayant … capture

2) Vous pouvez définir certaines données dans le champ de saisie lors de l'initialisation du datepicker

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

3) Vous pouvez utiliser les données stockées par le plugin datepicker

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

ou

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

4) datepicker interne utilise une fonction _getInst

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

La méthode fait presque la même chose que l'exemple 3.

Impossible de trouver une meilleure solution.

Une solution de base est de définir un attribut au moment de la pièce jointe datepicker, puis testez cela:

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

Ensuite, vous pourriez:

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

Y a-t-il une façon plus directe?

J'ai eu un autre cas. Mon script copie les derniers éléments de table, y compris datepicker.

Le jquery ne fonctionnera pas parce que l'élément copié a marqué qu'il "aDatepicker".

Pour activer datepicker dans un nouvel élément, supprimez ce nom de classe et lancez-le, comme ceci.

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

C'était ma solution 🙂

 if(typeof jQuery.fn.datepicker !== "undefined")