63 votes

Comment supprimer *complètement* un datepicker jQuery UI ?

J'ai un champ de texte de date que je souhaite seulement parfois à un DatePicker, car j'ai certains de mes propres scripts de traitement de texte qui gèrent des chaînes de dates partielles. L'appel de .remove ou .destroy laisse cependant un comportement de formatage de texte sur le champ de saisie, ce qui convertit ma chaîne "8" en "8/18/2010". Pire encore, si je commence à effacer, le système suppose que, lorsque j'atteindrai "18/8/20", j'aurai besoin d'une nouvelle date. en fait voulait "8/18/2020".

Quel serait le meilleur moyen de supprimer complètement, entièrement, comme si c'était jamais arrivé, le sélecteur de date de ma page ? Je peux aussi l'utiliser s'il ignore complètement et à tout moment le texte que je saisis, mais dans ce cas, je préférerais qu'il apparaisse lors d'un double-clic / d'une image comme bouton, pas toujours.

éditer :

Tout cela se passe dans une grille jqGrid, où le "sélecteur" est une zone de texte sur une colonne de date :

function showPicker(selector) {
    $(selector).datepicker({
        onClose: function() {
            $(selector).datepicker('remove'); 
            // or 'destroy' or $('.datepicker').remove(); or $(this).datepick('remove');
        }
    });
}

Cela l'empêche de revenir, mais pas de manipuler mon champ de texte. Aucun autre code (à ma connaissance) ne manipule le contenu de ce champ, juste jqGrid qui attend la touche d'entrée pour envoyer les données. En regardant le code généré de la page, le div datepicker est même toujours en bas.

edit2 : J'obtiens exactement le même comportement si je fais cela :

<html>
<body>
<script type="text/javascript" src="http://code.jquery.com/jquery-1.4.2.js"></script>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.4/jquery-ui.js"></script>
<link href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.4/themes/base/jquery-ui.css" rel="stylesheet" type="text/css"  />
<script type="text/javascript">
$(document).ready( function(){
 $("#pickle").datepicker({
  onClose: function(){
   $(this).datepicker('remove');
  }
 });
});
</script>
<input type="text" id="pickle" />
</body>
</html>

Cela provoque un comportement identique à celui que je vois, mais le changer en 'destroy' fonctionne. aquí mais pas sur ma page. C'est bizarre.

124voto

Omar Points 1218

Cela supprime .datepicker COMPLÈTEMENT :

$( selector ).datepicker( "destroy" );
$( selector ).removeClass("hasDatepicker").removeAttr('id');

Documentation :
https://api.jqueryui.com/datepicker/#method-destroy
Lisez également les commentaires ci-dessous

5 votes

A quoi sert la deuxième ligne ? Apparemment, la destruction réinitialise l'entrée à cet état initial.

2 votes

@eka808 la première ligne désactive seulement le sélecteur de date, mais il est toujours dans votre DOM. La deuxième ligne s'occupe de cela.

0 votes

J'ai toujours une <div id="ui-datepicker-div"> qui n'était pas là avant d'appeler .datepicker(...) après avoir exécuté ce code

8voto

Peter Rose Points 11

J'ai résolu le problème en supprimant les classes du sélecteur de date, puis en appelant la méthode unbind sur l'élément lié au sélecteur de date. Cela semble l'avoir éliminé !

eg :

$('#myelement').datepicker();

/////////datepicker attached to myelement//////

et ensuite :

$('#myelement').removeClass('calendarclass');
$('#myelement').removeClass('hasDatepicker');
$('#myelement').unbind();

La suppression des classes permet toujours à l'élément d'entrée d'invoquer le sélecteur de date lorsqu'il est cliqué, éventuellement. unbind() ferait l'affaire à elle seule, mais je suis plutôt du genre ceinture et bretelles.

0 votes

@jasonmarcher je pense que vous avez mal écrit. #emyelement (La dernière ligne). Cela ne devrait-il pas être #myelement ?

0 votes

Je ne l'ai pas fait, mais je vais arranger ça.

0 votes

C'est la seule solution qui a fonctionné pour moi. J'ai juste ajouté $('myelement').removeAttr('id'). merci !

3voto

µBio Points 6959

En fonction de votre situation, vous pourriez le faire côté serveur

Ex. dans la sytaxe de type asp

<% if( showDatePicker ) {%>
    $('#dp-div').DatePicker(); // or whatever
<% } %>

Modifier
Et si vous définissiez le dateFormat de l'indicateur de date ? c'est-à-dire

$( ".selector" ).datepicker({ dateFormat: 'yy-mm-dd' });

vous pourriez vouloir

$( ".selector" ).datepicker({ dateFormat: '...' });

0 votes

Simple, je suis d'accord. Mais tout cela est côté client, et cela nécessiterait de reconstruire tout ce qui est contenant le code du sélecteur, et probablement aussi des données JS. Il semble qu'il s'ajoute au reste de la page ailleurs, ce qui est probablement ce qui traîne après que je l'ai soi-disant supprimé / détruit. Je ne suis pas sûr que cela permette de le gérer, à moins de rafraîchir toute la page (trop cher).

0 votes

@Groxx donc l'idée est de pouvoir laisser l'utilisateur taper OU utiliser un sélecteur de date ? et quand le sélecteur de date est fermé, vous voulez que le texte soit rendu avec votre css, pas celui de DatePicker ?

0 votes

@Lucas : Mon... css ? Je ne suis pas tout à fait sûr de ce que vous voulez dire. J'ai édité de nouveau, et j'ai trouvé un cas réduit qui duplique mon comportement mais pas apparemment mon cause si vous voulez voir.

0voto

HS Shin Points 1

Dans une application à page unique, même si le contenu de la page change, l'interface utilisateur de Jquery reste vide. C'est pourquoi j'aime ce type d'application à page unique.

(function($) {

    if ($.ui !== null && typeof $.ui !== typeof undefined) {
        /**
         * dialog fix
         */
        var $oDialog = $.fn.dialog
        $.fn.dialog = function(mth, dialogOpts) {
            if (mth !== null && typeof mth === 'string') {
                if (mth === 'clean') {
                    var id = $(this).attr('id');   // you must set id
                    if (id !== null && typeof id !== typeof undefined) {
                        // garbage jquery ui elements remove
                        $('[aria-describedby="' + id + '"]', document).each(function() {
                            if ($(this).dialog('instance')) {
                                $(this).dialog('destroy');
                            }
                            $(this).remove();
                        });
                    }
                    return this;
                } else if (mth === 'open' && dialogOpts !== null && typeof dialogOpts === 'object') {
                    if ($oDialog.apply(this, ['instance'])) {
                        $oDialog.apply(this, ['option', dialogOpts]);
                        return $oDialog.apply(this, ['open']);
                    } else {
                        return $oDialog.apply(this, dialogOpts);
                    }
                }
            }

            return $oDialog.apply(this, arguments);
        };
    }
})(jQuery);

utiliser comme ceci dans la page script

// target layer in my page
var $xlsDiv = $('#xlsUpFormDiv');

$xlsDiv.dialog('clean');    // clean garbage dialog

var dialogOpts = {
    autoOpen: false,
    closeOnEscape: true,
    height: 800,
    width: 600,
    modal: true,
    buttons: ...,
    close: function() {
        $xlsForm.reset();
    }
};

// initialize original jquery ui
$xlsDiv.dialog(dialogOpts);

// open button click
$('#btnViewXlsUpForm').on("click", function() {
    $xlsDiv.dialog('open', dialogOpts);
});

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