51 votes

Erreur JQuery : Impossible d'appeler des méthodes sur le dialogue avant l'initialisation ; tentative d'appeler la méthode "close".

Je reçois soudainement cette erreur de jQuery :

Erreur : Impossible d'appeler des méthodes sur le dialogue avant l'initialisation ; tentative d'appeler la méthode 'close'.

Plugins

 <script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
 <script src="http://code.jquery.com/ui/1.9.1/jquery-ui.js"></script> 

Code jQuery

Je reçois ces messages dans la fonction suivante :

$(document).ready(function() {
  if ($('#results').html().length != 0) {
    alert('has information');

    $('#dialog').dialog({
      modal: true,
      buttons: {
        Ok: function() {
          // If I use $(this).dialog($(this)).dialog('close'), the UI is displayed,
          // however I do not see the OK button and no errors 
          $(this).dialog('close');
        }
      }
    });
  } else {
    alert('has no data');
  }
});

HTML

<div id="dialog" title="Server Response">
  <p><span class="${icon}" style="float: left; margin: 0 7px 50px 0;"></span>
    <label id="results">${results}</label>
  </p>      
</div>

1 votes

Je ne reçois pas cette erreur : jsfiddle.net/ztPUj . Mais le bidule utilise jQuery UI 1.9.2, si cela fait une différence. Si ce n'est pas le cas, un autre code, que vous n'avez pas affiché, doit causer le problème et si vous ne fournissez pas plus d'informations, nous ne pourrons pas vous aider.

0 votes

C'est jQuery UI 1.9.2 et cela a fonctionné. Vous pouvez inclure une réponse pour que je l'accepte.

1 votes

Vous pouvez même envisager la version 1.10.2 qui semble être la version stable actuelle.

26voto

Behr Points 439

J'ai eu un problème similaire en ouvrant un dialogue avec une mise en page partielle dans asp.net MVC. Je chargeais la bibliothèque jquery sur la page partielle ainsi que sur la page principale, ce qui provoquait l'apparition de cette erreur.

1 votes

Merci, merci, merci, merci. J'ai perdu une journée mais vous m'avez sauvé.

1 votes

Merci ! C'était exactement mon problème.

0 votes

C'est le réponse correcte et devrait être la réponse numéro 1.

22voto

Evil Raat Points 676

Il semblerait que vos boutons ne soient pas déclarés correctement (selon les règles de l'UE). Dernière documentation sur jQuery UI de toute façon).

essayez ce qui suit :

$( ".selector" ).dialog({ 
   buttons: [{ 
      text: "Ok", 
      click: function() { 
         $( this ).dialog( "close" ); 
      }
   }]
});

6 votes

La documentation dit : "Plusieurs types supportés : - Objet : Les clés sont les libellés des boutons et les valeurs sont les callbacks lorsque le bouton associé est cliqué. - Tableau : [...] ". On dirait que c'est ce que le PO a et selon la documentation, c'est parfait.

0 votes

Très vrai. Peut-être y a-t-il quelque chose d'autre dans le code qui n'est pas montré dans l'OP...

4 votes

Il est parfaitement logique que ce soit la réponse acceptée. Elle résout le problème, car certains exemples dans la documentation de jqueryui sont erronés (en particulier la variante {name:callback}). Source : J'ai eu exactement le même problème, j'ai changé mes définitions de boutons, et le problème est résolu.

16voto

EdsonF Points 429

Essayez ceci - ça marche pour moi :

$(".editDialog").on("click", function (e) {
    var url = $(this).attr('href');
    $("#dialog-edit").dialog({
        title: 'Edit Office',
        autoOpen: false,
        resizable: false,
        height: 450,
        width: 380,
        show: { effect: 'drop', direction: "up" },
        modal: true,
        draggable: true,
        open: function (event, ui) {
            $(this).load(url);
        },
        close: function (event, ui) {
            $("#dialog-edit").dialog().dialog('close');
        }
    });

    $("#dialog-edit").dialog('open');
    return false;
});

J'espère que cela vous aidera

2 votes

Quelqu'un qui a voté en haut lieu peut-il expliquer ce qui a fait la différence ? Je vois un deuxième appel à dialog() , cette fois avec dialog('open') mais j'ai essayé et ça n'a fait aucune différence. Qu'est-ce qui est différent ici ?

5 votes

Pour moi, il s'agissait de déclarer explicitement le nom du dialogue, au lieu d'utiliser 'this'.

10voto

J'ai également obtenu la même erreur : cannot call methods on dialog prior to initialization ; attempted to call method 'close'.

Ce que j'ai fait, c'est que j'ai déclenché l'événement du bouton de fermeture qui se trouve dans l'en-tête de la boîte de dialogue. comme

Cela fonctionne bien pour moi pour fermer le dialogue.

function btnClose() {
$(".ui-dialog-titlebar-close").trigger('click');
}

0 votes

Cela a aidé à déboguer. Merci

3voto

Peter Herdenborg Points 2171

J'ai eu la même erreur dans la version 1.10.2. Dans mon cas, je voulais qu'un clic sur la superposition d'arrière-plan cache la boîte de dialogue actuellement visible, quel que soit l'élément sur lequel elle était basée. J'avais donc ceci :

$('body').on("click", ".ui-widget-overlay", function () {
    $(".ui-dialog").dialog('destroy');
});

Cela fonctionnait auparavant, donc je pense qu'ils ont dû supprimer le support dans JQUI pour appeler .dialog() sur la popup elle-même à un moment donné.

Ma solution de contournement ressemble à ceci :

$('body').on("click", ".ui-widget-overlay", function () {
    $('#' + $(".ui-dialog").attr('aria-describedby')).dialog('destroy');
});

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