jQuery UI datepicker s'ouvre automatiquement dans la boîte de dialogue

J'ai un datepicker qui est utilisé dans l'objet jQuery dialog. La source du contenu de la boîte de dialogue est chargée à l'aide de .load(). Dans la boîte de dialogue, j'ai créé un script qui crée un datepicker pour la saisie de texte.

$("#date").datepicker({ ... });

Quand j'ouvre la boîte de dialogue pour la première fois-tout va bien, mais si je la ferme et rouvre à nouveau, le datepicker est déclenché automatiquement (et il n'y a pas une telle option comme autoOpen:false) Est-il un moyen d'empêcher cela ou ce que je fais mal?

28
demandé sur turezky 2009-05-31 20:42:44

12 réponses

J'ai eu ce problème exact et l'ai résolu avec seulement une légère variation sur la technique de tvanfosson. Pour une raison quelconque, j'ai dû attacher manuellement l'événement "click" au champ datepicker comme ci-dessous.

 $('#dialog').dialog({
 open: function(event, ui) {
    $(ui).find('#date').datepicker().click(function(){
        $(this).datepicker('show');
    });
 },
 close: function(event,ui) {
    $(ui).find('#date').datepicker('destroy');
 }});

(Désolé-j'aurais préféré poster ceci comme un commentaire au post de tvanfosson mais je n'ai pas le représentant requis.)

15
répondu belacqua 2009-06-07 21:06:18

Beaucoup plus simple que j'ai trouvé:

$("#dialogPopper").click(
                    function() {
                        $("#date").datepicker("disable");
                        $("#dialog").dialog("open");
                        $("#date").datepicker("enable");
                        return false;
                    }
                  );
32
répondu Hupperware 2010-10-22 20:03:44

Lorsque vous placez le champ datepicker au début de la boîte de dialogue, il s'ouvre automatiquement. Vous pouvez placer une entrée masquée au début de la boîte de dialogue.

<input type="text" style="width: 0; height: 0; top: -100px; position: absolute;"/>
22
répondu jsonx 2010-11-22 21:29:50

Vous pouvez penser à détruire le datepicker lorsque la boîte de dialogue est fermée et à la créer dans le gestionnaire d'événements ouvert pour la boîte de dialogue au lieu de l'inclure en tant que script dans la création de la boîte de dialogue.

 $('#dialog').dialog({
     open: function(event, ui) {
        $(ui).find('#date').datepicker();
     },
     close: function(event,ui) {
        $(ui).find('#date').datepicker('destroy');
     }
 });

Vous pouvez également expérimenter avec différents événements / méthodes pour voir si vous avez vraiment besoin de le recréer, mais je pense que cela fonctionnerait.

8
répondu tvanfosson 2009-05-31 16:58:15

La raison en est: votre premier élément dans le formulaire modal est le champ de texte datepicker, et lorsque le modal est déclenché, le contrôle actif est celui qui contient le datepicker.

J'ai trouvé deux solutions alternatives:

  1. Modifier l'ordre de vos champs. Évitez celui avec datepicker pour rester à la première place.

  2. Ne définissez pas datepicker sur le champ dans un morceau de code séparé, faites-le dans la fonction qui ouvre la boîte de dialogue (juste après l'ouverture $("#dialog").dialog("open");).

5
répondu Juliandrea85 2012-10-30 17:13:18

La raison pour laquelle le sélecteur s'ouvre par lui-même, est que le champ de saisie reste concentré après avoir ouvert le sélecteur pour la première fois.

Vous devez le flouter:

$input.datepicker({
  onClose: function(dateText) {
    $(this).trigger('blur');
  }
});
4
répondu Pawel Furmaniak 2013-12-09 17:51:42

J'avais un problème similaire. J'ai un datepicker jquery dans une boîte de dialogue jQuery ui. Le sélecteur de date s'ouvrait automatiquement dans IE lorsque j'ai ouvert la boîte de dialogue. Il ne le faisait pas dans Firefox ou Chrome... J'ai résolu le problème en désactivant le datepicker lors de la création dans le $(document).prêt comme ça:

$('.ConfirmMove #from').datepicker({
  duration: ''
}).datepicker('disable');

Ensuite, lorsque j'ouvrais la boîte de dialogue contenant ce datepicker, Je l'ai activée dans le gestionnaire d'événements ouvert de la boîte de dialogue:

$(".ConfirmMove").dialog({
  close: function() { 
     $('.ConfirmMove #from').datepicker('disable'); 
  },
  open: function() {
     $('.ConfirmMove #from').datepicker('enable');
  }
});

Vous devez également vous rappeler de le désactiver lorsque vous fermez la boîte de dialogue.

De cette façon, vous ne détruisez pas et ne recréez pas le datepicker chaque fois que vous ouvrez et fermez la boîte de dialogue.

2
répondu EtienneT 2012-02-14 16:56:04

C'est Ce que j'ai fait pour résoudre mon problème.

Ce code est dans la création de la boîte de dialogue.

document.getElementById('date').disabled = true;
setTimeout('document.getElementById("date").disabled = false;', 100);

De cette façon, si la boîte de dialogue s'ouvre, elle se concentrera dans un autre contrôle.

Vous pouvez tester le délai d'attente pour une plus petite quantité de retard, mais 100 était ok pour moi.

1
répondu Zorkind 2012-08-15 19:12:34

C'est juste de la boîte de dialogue focus: api.jqueryui.com/dialog/

Lors de l'ouverture d'une boîte de dialogue, le focus est automatiquement déplacé vers le premier élément correspondant à

  1. le premier élément de la boîte de dialogue avec l'attribut autofocus
  2. le premier: élément tabbable dans le contenu de la boîte de dialogue
  3. le premier: élément tabbable dans le buttonpane de la boîte de dialogue
  4. le bouton de fermeture de la boîte de dialogue
  5. La boîte de dialogue elle-même

Une solution consiste à utiliser l'attribut autofocus sur d'autres champs que datepicker.

1
répondu user1080588 2016-04-13 20:26:32

Je sais que c'est une vieille question, mais une solution qui a fonctionné pour moi a déclenché une icône de calendrier:

$( ".date" ).datepicker({
  showOn: "button",
  buttonImage: "../css/imgs/calendar.gif",
  buttonImageOnly: true
});
0
répondu bena45 2012-06-17 00:36:16

Pour une raison quelconque, le calendrier a cessé d'avoir ce comportement lorsque j'ai rempli l'option d'animation dans l'initialiseur:

ShowAnim: Drop

0
répondu thiago marini 2013-10-29 11:54:05

À partir du code source, j'ai trouvé que jQuery.Dialog suit toujours focusin événement sur les éléments dans dialog, et déclenche focus événement sur cet élément après que dialog gagne l'état actif. Pour éviter ce comportement, arrêtez simplement la propagation des événements bouillonnants À partir de l'élément focalisé.

$("#input").on("focusin", function (e) {
   return false; // or e.stopPropagation();
}).datepicker();
0
répondu hawk 2015-05-05 07:36:59