4 votes

problème de datepicker lors de l'utilisation de la fonction JavaScript call()

J'essaie de remplacer mon plugin de datepicker et de mettre en œuvre mon propre datepicker personnalisé. Je place mon code dans un fichier js global afin de le remplacer dès le chargement de la page.

(function($) {
    var originalVal = $.fn.datepicker;
    $.fn.datepicker = function(val1, val2, val3) {
        console.log(val1); // option
        console.log(val2); // maxDate
        console.log(val3); // 09/06/2017
        // var dp = originalVal.clone();
        // console.log(dp);
        var _options = {
            changeYear: true,
            changeMonth: true
        }

        if (val1 == "option") {
            _options[val2] = val3
            console.log(_options[val2]);
        }
        else {
            _options = $.extend(_options, val1)
        }

        console.log(_options); //Object { changeYear: true, changeMonth: true, maxDate: Date 2017-09-06T06:52:32.449Z }

        return originalVal.call(this, _options);
    };
})(jQuery);

Cela fonctionne parfaitement car la page se charge et changeYear et changeMonth est disponible avec la restriction de la date maximale comme 09/06/2017.

Voici le code de ma page :

</head>
<body>
    <input type="text"  id="pickDate2" >
    <input type="text"  id="pickDate3" >
    <script>
    $("#pickDate2").datepicker();
    $("#pickDate3").datepicker('option','maxDate',new Date());
    $("#pickDate2").change(function(){
        var val = $(this).val();
        $("#pickDate3").datepicker('option','minDate',Date.parse(val));
    })
    </script>
</body>
</html>

Maintenant, après le chargement de la page, lorsque le code ci-dessous est exécuté, la date minimum n'est pas définie.

$("#pickDate2").change(function(){
    var val = $(this).val();
    $("#pickDate3").datepicker('option','minDate',09/03/2017);
})

Lorsque je vérifie dans la console le code de remplacement de mon plugin, les paramètres semblent corrects.

console.log(_options);//Object { changeYear: true, changeMonth: true, minDate: Date 2017-09-03T18:15:00.000Z }

Pour autant que je sache, la fonction d'appel JavaScript ne s'exécute pas la deuxième fois. Je n'ai rien trouvé de concret puisque j'ai fait des recherches sur le web à ce sujet. Je veux que le plugin accepte les paramètres la deuxième fois également.

1voto

T.J. Crowder Points 285826

Votre code appelle la fonction originale du sélecteur de date, mais toujours comme s'il initialisait un sélecteur de date à partir de zéro. Vous interceptez un "option" et le transforme en un appel init. En clair, cela ne permet pas les initialisations multiples.

Au lieu de cela, vous devez détecter si un appel d'initialisation ou de "méthode" est effectué, et effectuer l'appel de méthode s'il s'agit d'un appel de méthode. Séparément, vous n'avez pas besoin d'intercepter "option" à moins qu'il ne s'agisse d'un réglage changeYear o changeMonth à quelque chose que vous ne voulez pas.

Quelque chose de ce genre (des ajustements supplémentaires peuvent être nécessaires) :

(function($) {
    var originalVal = $.fn.datepicker;
    $.fn.datepicker = function(val1, val2, val3) {
        if (val1 === "option") {
            if (val2 === "changeYear" || val2 === "changeMonth") {
                return this; // Ignore it
            }
        }
        if (typeof val1 === "string") {
            // Method call, pass through
            return originalVal.apply(this, arguments); 
        }
        // Init call, ensure our options are set and pass it on
        var _options = $.extend({}, val1, {
            changeYear: true,
            changeMonth: true
        });
        return originalVal.call(this, _options);
    };
})(jQuery);

Ce qui précède fonctionne pour moi. Voici votre exemple sans le changement ci-dessus, juste avec jQuery normal et jQuery UI (J'ai ajouté le $("#pickDate3").datepicker(); ) :

$("#pickDate2").datepicker();
$("#pickDate3").datepicker();
$("#pickDate3").datepicker('option', 'maxDate', new Date());
$("#pickDate2").change(function() {
  var val = $(this).val();
  $("#pickDate3").datepicker('option', 'minDate', Date.parse(val));
})

<link href="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.css" rel="stylesheet"/>

<input type="text" id="pickDate2">
<input type="text" id="pickDate3">

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.js"></script>

Et le voici avec la modification ci-dessus ; notez que votre changeYear y changeMonth sont ajoutées comme prévu, et les options maxDate est également respecté lorsque nous modifions la première entrée :

(function($) {
    var originalVal = $.fn.datepicker;
    $.fn.datepicker = function(val1, val2, val3) {
        if (val1 === "option") {
            if (val2 === "changeYear" || val2 === "changeMonth") {
                return this; // Ignore it
            }
        }
        if (typeof val1 === "string") {
            // Method call, pass through
            return originalVal.apply(this, arguments); 
        }
        // Init call, ensure our options are set and pass it on
        var _options = $.extend({}, val1, {
            changeYear: true,
            changeMonth: true
        });
        return originalVal.call(this, _options);
    };
})(jQuery);
$("#pickDate2").datepicker();
$("#pickDate3").datepicker();
$("#pickDate3").datepicker('option', 'maxDate', new Date());
$("#pickDate2").change(function() {
  var val = $(this).val();
  $("#pickDate3").datepicker('option', 'minDate', Date.parse(val));
})

<link href="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.css" rel="stylesheet"/>

<input type="text" id="pickDate2">
<input type="text" id="pickDate3">

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.js"></script>

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