271 votes

jQuery UI Datepicker onchange - Problème de fonctionnement

J'ai un code JS dans lequel la modification d'un champ appelle une routine de recherche. Le problème est que je n'arrive pas à trouver d'événements jQuery qui se déclenchent lorsque le Datepicker met à jour le champ de saisie.

Pour une raison quelconque, un événement de changement n'est pas appelé lorsque Datepicker met à jour le champ. Lorsque le calendrier s'affiche, il change le focus et je ne peux donc pas l'utiliser non plus. Une idée ?

0 votes

J'ai fini par utiliser stackoverflow.com/a/30132949/293792 car cela semble répondre directement à la question

412voto

T.J. Crowder Points 285826

Vous pouvez utiliser la fonction onSelect événement .

$(".date").datepicker({
    onSelect: function(dateText) {
        console.log("Selected date: " + dateText + "; input's current value: " + this.value);
    }
});

Exemple concret :

$(".date")
.datepicker({
    onSelect: function(dateText) {
        console.log("Selected date: " + dateText + "; input's current value: " + this.value);
    }
})
.on("change", function() {
    console.log("Got change event from field");
});

<link href="https://code.jquery.com/ui/1.9.2/themes/smoothness/jquery-ui.css" rel="stylesheet" />
<input type='text' class='date'>
<script src="https://code.jquery.com/jquery-1.8.3.min.js"></script>
<script src="https://code.jquery.com/ui/1.9.2/jquery-ui.js"></script>

Malheureusement, onSelect se déclenche chaque fois qu'une date est sélectionnée, même si elle n'a pas changé. Il s'agit d'un défaut de conception du sélecteur de date : il se déclenche toujours onSelect (même si rien n'a changé), et ne déclenche un événement sur l'entrée sous-jacente en cas de changement. (Si vous regardez le code de cet exemple, nous écoutons les changements, mais ils ne sont pas déclenchés). Il devrait probablement déclencher un événement sur l'entrée lorsque les choses changent (peut-être l'événement habituel change ou éventuellement un événement spécifique au datepicker).


Si vous le souhaitez, vous pouvez bien sûr faire le change sur l'événement input le feu :

$(".date").datepicker({
    onSelect: function() {
        $(this).change();
    }
});

Cela déclenchera change sur le sous-jacent input pour tout gestionnaire connecté via jQuery. Mais encore une fois, il toujours l'enflamme. Si vous souhaitez ne déclencher l'action qu'en cas de changement réel, vous devrez sauvegarder la valeur précédente (éventuellement par l'intermédiaire de la fonction data ) et de les comparer.

Exemple concret :

$(".date")
.datepicker({
    onSelect: function(dateText) {
        console.log("Selected date: " + dateText + "; input's current value: " + this.value);
        $(this).change();
    }
})
.on("change", function() {
    console.log("Got change event from field");
});

<link href="https://code.jquery.com/ui/1.9.2/themes/smoothness/jquery-ui.css" rel="stylesheet" />
<input type='text' class='date'>
<script src="https://code.jquery.com/jquery-1.8.3.min.js"></script>
<script src="https://code.jquery.com/ui/1.9.2/jquery-ui.js"></script>

1 votes

@user760092 : J'ai posté cette réponse puis je suis sorti, et littéralement en partant je me suis dit "Tu sais, tu pourrais déclencher la fonction change handler(s)" et j'ai donc mis à jour la réponse avec cela :-)

0 votes

J'ai un scénario dans lequel je modifie la date (à l'aide de setDate ) par programme. Quel événement peut aussi gérer cela ?

0 votes

+1 Joli ajout de déclenchement de l'événement de changement sur l'entrée ici

81voto

theChrisKent Points 10963

La réponse de T.J. Crowder ( https://stackoverflow.com/a/6471992/481154 ) est très bonne et reste précise. Déclencher l'événement de changement dans la fonction onSelect est aussi proche que possible.

Cependant, il existe une propriété intéressante sur l'objet datepicker ( lastVal ) qui vous permettra de déclencher conditionnellement l'événement de changement uniquement en cas de changements réels sans avoir à stocker la (les) valeur(s) vous-même :

$('#dateInput').datepicker({
     onSelect: function(d,i){
          if(d !== i.lastVal){
              $(this).change();
          }
     }
});

Il suffit ensuite de gérer les événements de changement comme d'habitude :

$('#dateInput').change(function(){
     //Change code!
});

1 votes

Quelqu'un a-t-il testé cela récemment ? Cela ne fonctionne pas pour moi. i.lastVal renvoie une valeur indéfinie et ne semble pas faire partie des propriétés disponibles.

0 votes

Je viens de le mettre en œuvre sans aucun problème. Cela fonctionne comme un charme.

0 votes

Cela ne fonctionne plus, lastval n'est plus défini

15voto

locrizak Points 6976

Vous recherchez le onSelect dans l'objet datepicker :

$('.selector').datepicker({
   onSelect: function(dateText, inst) { ... }
});

13voto

user583576 Points 354
$('#inputfield').change(function() { 
    dosomething();
});

17 votes

Je pensais que cela fonctionnerait, mais ce n'est malheureusement pas le cas. Il n'est déclenché que lorsque le champ est modifié à l'aide de la fonction clavier mais pas lors de la sélection à partir du sélecteur de date. C'est ennuyeux.

1 votes

Extrait de la documentation de jQuery UI : "Ce widget manipule la valeur de son élément de manière programmatique, il se peut donc qu'un événement de changement natif ne soit pas déclenché lorsque la valeur de l'élément change."

0 votes

Ce qui est amusant, c'est que je reçois le message opposé de cela - lorsque je modifie l'entrée à la main via le clavier, aucun événement n'est déclenché. Mais lorsque je modifie la valeur du champ via le widget, l'événement change est déclenché. C'est bizarre.

13voto

CodeDreamer68 Points 66

J'ai écrit ceci parce que j'avais besoin d'une solution pour déclencher un événement seulement si la date changeait.

C'est une solution simple. Chaque fois que la boîte de dialogue se ferme, nous vérifions si les données ont changé. Si c'est le cas, nous déclenchons un événement personnalisé et réinitialisons la valeur stockée.

$('.datetime').datepicker({
    onClose: function(dateText,datePickerInstance) {
        var oldValue = $(this).data('oldValue') || "";
        if (dateText !== oldValue) {
            $(this).data('oldValue',dateText);
            $(this).trigger('dateupdated');
        }
    }
});

Nous pouvons maintenant mettre en place des gestionnaires pour cet événement personnalisé...

$('body').on('dateupdated','.datetime', function(e) {
    // do something
});

0 votes

Je l'utilise avec knockout, je n'ai pas réussi à déclencher un événement lorsque l'utilisateur a supprimé ou modifié manuellement la date sans sélectionner une date dans le sélecteur. Très utile.

0 votes

Mon problème avec les champs datepicker de jQuery n'est pas exactement le même que celui posté ici. Il s'agit de l'événement de changement qui se déclenche plusieurs fois. J'ai essayé plusieurs solutions et celle-ci est la seule qui fonctionne dans ma situation.

0 votes

J'ai fait plus ou moins la même chose que cette solution et je pense que c'est celle qui fonctionne le mieux. Je posterai ce que j'ai fait dans une réponse séparée...

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X