problème lors du clonage jQuery UI datepicker
J'ai un div dans lequel il y a un datepicker. J'utilise quelque chose comme cela pour le clone:
mydiv = $('#someDiv');
//works fine so far
mydiv.find('input.datefield').datepicker();
//clone without the events and insert
newDiv = myDiv.clone(false).insertAfter(myDiv);
//datepicker won't re-init if this class is present
newDiv.find('.hadDatepicker').removeClass('hadDatepicker');
//reinitialize datepicker
newDiv.find('input.datefield').datepicker();
C'est une version allégée de mon code. Il fonctionne et le calendrier s'affiche comme prévu où il est prévu .. mais quand une date est cliqué, la précédente datepicker la valeur est mise à jour.. (celle à partir de laquelle il a été cloné).
J'ai essayé de détruire le (inexistants) instance avant comme ceci:
newDiv.find('input.datefield').datepicker('destroy').datepicker();
Pas de chance ..
J'ai vérifié la façon dont il effectue le suivi des instances et désactivées manuellement les données comme ceci:
newDiv.find('input.datefield').data('datepicker', false).datepicker('destroy').datepicker();
Toujours pas de chance.
Ce que je ne comprends pas, c'est que seule la sélection de la date de comportement est buggé, tout le reste fonctionne comme prévu.
Je ne sais vraiment pas quoi d'autre à vérifier maintenant ..
source d'informationauteur h3.
Vous devez vous connecter pour publier un commentaire.
Voici le problème. datepicker crée basé sur l'UUID attributs ID pour les champs de saisie, il se lie lors de l'initialisation. Vous le clonage de ces éléments entraîne plus d'éléments avec le même ID (jQuery n'aime pas) ou un ID différent si votre clone de routine, qu'il gère (ce qui signifie datepicker ne connaissent pas les clones). En d'autres termes, datepicker seulement initialise tous les éléments correspondant à votre sélection au moment de l'appel. il fait moins de sens pour essayer de détruire/désactiver/activer, quand vous pouvez juste envelopper l'init appeler à l'intérieur quelle que soit la fonction que vous utilisez pour créer des clones.
Parce que mon clone fonctions généralement copie de caché des éléments du DOM, plutôt que ceux qui sont visibles, j'ai le luxe de décider si j'ai besoin de lier l'avant ou après le clonage. Donc, faire #templateDiv un élément masqué sur votre page avec l'élément d'ENTRÉE déjà là.
et assez bien fait. Clone(vrai) à chaque fois que vous le pouvez, il vous permettra de gagner des maux de tête dans le long terme.
Cela fonctionne pour moi avec l'INTERFACE utilisateur de jQuery 1.7.2
Vérifier http://jsbin.com/ahoqa3/2 pour une démonstration rapide
btw. vous semblez avoir différentes erreurs dans le code de votre question. La classe css est
hasDatepicker
pashadDatepicker
et à un moment vous avez écritmydiv
et la prochaine fois que la variable estmyDiv
qui n'est pas le même.Si vous appelez
.datepicker('destroy').removeAttr('id')
avant le clonage et puis re-init le sélecteur de date cela va fonctionner.Ce qui semble être un bug avec le détruire puisqu'il est censé retourner l'élément retour à son état d'origine.
il suffit de ne
avant le clonage de la div.
Puis après insérer le clone de lier le datepicker de nouveau
une sorte de " hacky solution, mais il fonctionne parfaitement.
il fonctionne bien.
Mais il suffit de faire ceci, datepicker va s'ouvrir sur cloné d'entrée et de fixer la date de l'entrée d'origine (parce qu'ils ont le même ID)
pour résoudre ce problème, vous devez modifier attribut id de l'cloné entrée.
et il sera parfait!
Voici comment cela a fonctionné pour moi:
Vous devez d'abord supprimer la classe hasDatepickerfrom les éléments clonés,parce que c'est ce qui empêche le datepicker de s'attacher à l'élément spécifique.
Alors tu dois supprimer le id attribut de chacun des éléments clonés d'autre .datepicker() supposons que datepicker est ajouté à cet élément.
Après l'appel .datepicker() sur l'élément cloné.
Que sur la modification de l'ordre?
Honnêtement, je ne sais pas comment datepicker fonctionne en interne. Mon intuition est qu'il stocke quelque chose en jQuery DOM stockage. Il faut éviter de le copier à tout prix.
(Vous pourriez avoir des affaires à long logique entre ces lignes de code. Le point est d'avoir une sauvegarde de #someDiv avant de mettre un datepicker.)
Assurez-vous que vos nouveaux clones datepicker a un autre nom et l'ID que l'original. Si ils ont le même nom, alors le comportement que vous décrivez est normal.
Essayez de modifier que la dernière ligne pour quelque chose comme:
La solution complète qui fonctionne pour moi.
Et le code html de table td.
Espère que cela vous aide.
Bonne journée
Cela pourrait être un peu en retard, mais toutes les suggestions ci-dessus ne fonctionne pas pour moi, je suis venu avec une solution simple pour cela.
D'abord, quelle est l'origine du problème:
JQuery attribuer datepicker à l'id de l'élément. si vous avez choisi l'élément, puis même code peut être cloné. qui jQuery n'aime pas. Vous pourriez vous retrouver avec la réception de nulle erreur de référence ou de la date assignée au premier champ de saisie, peu importe le champ de saisie vous cliquez sur.
Solution:
1) détruire datepicker
2) attribuer de nouveaux identifiants uniques pour tous les champ de saisie
3) attribuer datepicker pour chaque entrée
Assurez-vous que votre entrée est quelque chose comme cela
Avant de cloner, détruire datepicker
Après vous clone, ajouter ces lignes ainsi
et la magie se produit