2010-09-07 19 views
3

je générer dynamiquement des années datepicker en ajoutant simplement le code HTML de champ à un div:générer dynamiquement une jQuery Datepicker avec altFields

<input type="text" value="" readonly="readonly" name="tier[2][publication_date]" id="publication_date_2" size="10" maxlength="10" tabindex="6" class="publication_date hasDatepicker"> 
<input type="hidden" name="tier[2][publication_date_db]" id="publication_date_db_2" value=""> 

En raison de la façon dont nous stockons les dates, nous avons un champ séparé (Altfield) pour le programme datepicker qui stocke la date formatée de notre base de données sélectionnée par l'utilisateur.

Pour gérer la sélection des multiples préparateurs de date-je attribuer une classe et d'utiliser livequery afin de détecter onClicks fois la page chargée:

$(".publication_date").livequery(function() { 
       $(this).datepicker({ 
        dateFormat: "dd M yy", 
        changeYear: true, 
        changeMonth: true, 
        onSelect: function(dateText, inst) { 
         console.log(inst); 
        } 
       }); 
      }); 

J'ai un problème qui, comment le datepicker savoir quel altfield à peupler? Sur une seule datepicker, on devrait normalement inclure:

altField: '#start_date_datepicker_altfield', 
altFormat: 'yy-mm-dd', 

pour la population à se produire.

Répondre

5

Je sais que la documentation dit qu'il faut un sélecteur, mais il peut aussi prendre un objet jQuery, donc il suffit d'utiliser $(this).next() pour obtenir le champ caché, comme ceci:

$(".publication_date").livequery(function() { 
    $(this).datepicker({ 
     altField: $(this).next(), 
     altFormat: 'yy-mm-dd', 
     dateFormat: "dd M yy", 
     changeYear: true, 
     changeMonth: true, 
     onSelect: function(dateText, inst) { 
     console.log(inst); 
     } 
    }); 
}); 

comme la plupart des plug-ins pour faire bouillir jusqu'à $(input) cette entrée peut être un sélecteur ou un objet jQuery ou un élément DOM et il va encore très bien fonctionner :)

+0

Tsk tsk, créant deux jQuerys où l'on ferait ... ;-) (Bonne approche, cependant.) –

+0

@TJCrowder - Il crée un objet jQuery chaque clic de toute façon (soit l'approche): '$ (altField). chaque (fonction() {$ (this) .val (dateStr);});', peu de frais + beaucoup plus facile à maintenir IMO :) –

+0

mais votre itérateur crée un * deux fois * à chaque clic: d'abord sur la première ligne de la fonction ('$ (this) .datepicker') et ensuite sur sa deuxième ligne (' altField: $ (this) .next(), '). Juste une sélection amicale (juste un peu une blague, vraiment), toute implication de performance est * énormément * dépassée par le fait que c'est un gestionnaire d'événements de toute façon ... :-) –

0

Je n'ai pas utilisé de requête en direct, mais d'après les apparences, vous pouvez obtenir le id de l'élément correspondant de this.id. Dans votre exemple HTML, ce sera "publication_date_2", à partir de laquelle il est relativement facile de créer l'identifiant nécessaire pour l'altfield "publication_date_db_2" (vous pouvez le rendre encore plus facile en changeant votre stratégie de nommer le champ).

Alors peut-être:

$(".publication_date").livequery(function() { 
    $(this).datepicker({ 
     dateFormat: "dd M yy", 
     changeYear: true, 
     changeMonth: true, 
     onSelect: function(dateText, inst) { 
      console.log(inst); 
     }, 
     altField: "#" + this.id.replace("_date_", "_date_db_"), 
     altFormat: 'yy-mm-dd' 
    }); 
}); 
+0

Merci, je viens de le réaliser. –

+0

Comment proposez-vous de changer la convention de dénomination des champs? –

+0

@ user275074: En fait, celui que vous avez est assez facile (voir ci-dessus). J'ai probablement utilisé un préfixe, mais ça n'a pas d'importance ... –