2017-10-01 4 views
0

J'ai du contenu qui est dynamiquement ajouté dans la page d'index via des appels ajax avec l'API d'historique (j'utilise pushstate et onpopstate).jQuery événement cliqué délégué à datetimepicker besoin de cliquer deux fois

Pour une page spécifique qui sera chargé, j'ai un formulaire avec un champ de date comme ceci:

<tr> 
    <td class='input-group date' id='datetimepicker1'> 
    <input style='width: 250px; border: 0; outline: none; name='invoicedate' value='2017-10-01' data-date-format='YYYY-MM-DD'> 
    <span class='input-group-addon'> 
     <span class='glyphicon glyphicon-calendar'></span> 
    </span> 
    </td> 
</tr> 

de la page d'index Je veux joindre un événement de clic pour DateTimePicker1 afin que le widget datetimepicker INITIALISATION montrer. J'utilise cet extrait:

$("#container").on("click", "#datetimepicker1", function(){ 
    $("#datetimepicker1").datetimepicker({ 
    locale: 'nl', 
    format: 'YYYY-MM-DD', 
    allowInputToggle: true, 
    useCurrent: false, 
    }); 
}); 

Le problème est que je dois cliquer deux fois sur le datepicker avant le widget apparaît.

Après cela, le fichier datepicker s'affiche directement lorsque vous cliquez pour la troisième fois.

J'ai essayé d'envelopper ce qui précède avec $ (document) .ready (function() {} mais cela n'a pas fonctionné, parce que je pense que le contenu ajouté avec des appels ajax via innerhtml ne déclenche pas un rechargement de page. Les gens ont dit d'utiliser des événements délégués que je fais comme vous pouvez le voir et ça ne marche toujours pas

Quelqu'un a eu des idées sur ce pourquoi cela se produit? J'ai également essayé d'inspecter le code avec les outils de développement de Google à partir du volet de la console: monitorEvents (window, "click") et $ ._ data (($ 0), "events") mais il est trop verbeux et je ne sais pas comment utiliser les informations pour le débogage comme le bubbling de l'événement

Merci de votre aide !

+0

Je n'utilise pas jQuery, mais j'imagine que la méthode '.datetimepicker()' définit le comportement sur l'élément lors de l'exécution, donc de la façon dont vous l'avez en ce moment, il n'est pas configuré vous cliquez, donc naturellement son comportement spécial ne sera pas déclenché jusqu'au prochain clic. Mais à chaque clic, il se ré-installe à nouveau. Au lieu de cela, vous devrez exécuter 'datetimepicker()' immédiatement après le chargement du contenu AJAX. – llama

Répondre

0

Votre problème est que vous ajoutez datepicker click sur #container - c'est probablement une div qui enveloppe tout:

$("#container").on("click", "#datetimepicker1", function(){ 
    $("#datetimepicker1").datetimepicker({ 
    locale: 'nl', 
    format: 'YYYY-MM-DD', 
    allowInputToggle: true, 
    useCurrent: false, 
    }); 
}); 

Alors première fois que vous cliquez sur vous ajoutez en fait datepicker sur votre conteneur, votre code devrait ressembler à ceci sans aucun événement onclick:

$("#datetimepicker1 input[name='invoicedate']").datetimepicker({ 
    locale: 'nl', 
    format: 'YYYY-MM-DD', 
    allowInputToggle: true, 
    useCurrent: false, 
}); 

Vous devez également envelopper ce sur la création d'éléments si cela est fait dynamiquement.

+0

Cela ne fonctionne pas, il ne peut pas se connecter à datetimepicker1 dans le dom avant le chargement du contenu AJAX. Que voulez-vous dire par la création d'éléments? – Xenioz

+0

C'est exactement ce que je veux dire par création d'élément - vous le créez dynamiquement sur un appel ajax, donc au moment où vous créez un élément vous pouvez y attacher du datpicker, je peux vous aider mais j'ai besoin de voir le code 'est en train de créer un élément - une partie de succès ajax - ou même un meilleur moment exact où vous créez # datetimepicker1 td et où vous y ajoutez une boîte de saisie. – pegla

+0

J'ai regardé la fonction javascript qui envoie la requête ajax et insère les données avec document.getElementById ("content"). InnerHTML = xmlhttp.responseText; et j'ai ajouté la partie datetimepicker() et cela fonctionne maintenant. Je vous remercie. – Xenioz