jquery ui Dialog: Vor der Initialisierung können keine Methoden für den Dialog aufgerufen werden

101

Ich habe eine App auf JQuery 1.5 mit gut funktionierenden Dialogen. Obwohl ich viele .live-Handler habe, habe ich dies in .on geändert. Dafür muss ich jquery aktualisieren (jetzt 1.8.3 und jquerui 1.9.1).

Jetzt habe ich: Error: cannot call methods on dialog prior to initialization; attempted to call method 'close'

Es folgt der Code:

Javascript

var opt = {
        autoOpen: false,
        modal: true,
        width: 550,
        height:650,
        title: 'Details'
};

$(document).ready(function() {
$("#divDialog").dialog(opt);
    $("#divDialog").dialog("open");
...    

HTML Quelltext

<div id="divDialog">
<div id="divInDialog"></div>
</div>

Irgendeine Idee, warum dies passieren könnte?

core-chain.io
quelle

Antworten:

136

Versuchen Sie dies stattdessen

$(document).ready(function() {
  $("#divDialog").dialog(opt).dialog("open");
});

Sie können auch tun:

var theDialog = $("#divDialog").dialog(opt);
theDialog.dialog("open");

Dies liegt daran, dass der Dialog nicht in $('#divDialog')einem neuen Div gespeichert wird, der im laufenden Betrieb erstellt und von der .dialog(opt)Funktion zurückgegeben wird.

Knie vor dem ZOD
quelle
5
Das hat bei mir funktioniert. Muss ich den Dialog jedes Mal initialisieren, wenn ich ihn so oder nur beim ersten Mal öffnen möchte? Es gibt viele Dialoge. Gibt es keine Möglichkeit, die Optionen initiali festzulegen und dann die Dialoge über Schaltflächen zu öffnen?
core-chain.io
6
Ich habe festgestellt, dass diese Lösung auch den Fehler "Methoden können im Dialogfeld vor der Initialisierung nicht aufgerufen werden; es wurde versucht, die Methode 'open' aufzurufen" behoben hat, der auftritt, wenn ein Dialogfeld erfolgreich geöffnet und geschlossen wird und die Benutzer dann versuchen, das Dialogfeld ein zweites Mal zu öffnen . Danke @ZOD
spadelives
Hat dir +1 gegeben, weil es auch mein Problem behoben hat, aber kannst du bitte erklären, warum es funktioniert?
Igor L.
2
@IgorLacik Ich gehe davon aus, dass .dialog () eine Instanz von sich selbst zurückgibt, damit Sie eine Verkettung durchführen können. Daher instanziiert .dialog (opt) .dialog ('open') ein Dialogobjekt (den ersten Aufruf) und führt dann 'open' dafür aus. Ich gehe dann davon aus, dass durch das Aufrufen von $ (obj) .dialog (opt) und anschließend von $ (obj) .dialog ('open') separate Dialogobjekte auf dem jquery-Objekt instanziiert werden, sodass das zweite Objekt das erste nicht sehen kann Einstellmöglichkeiten. Ohne weiter in den Dialogcode einzutauchen, ist es allerdings schwer zu sagen, und ich habe nicht die Zeit dafür: D
nealio82
Ich habe die Frage aktualisiert, um zu erklären, was Sie zu erklären versucht haben.
JotaBe
22

Wenn Sie jQuery nicht aktualisieren können und Folgendes erhalten:

Uncaught Error: cannot call methods on dialog prior to initialization; attempted to call method 'close'

Sie können es so umgehen:

$(selector).closest('.ui-dialog-content').dialog('close');

Wenn Sie die Ansicht steuern und wissen, dass auf der gesamten Seite überhaupt keine anderen Dialogfelder verwendet werden sollen, können Sie Folgendes tun:

$('.ui-dialog-content').dialog('close');

Ich würde dies nur empfehlen, wenn die Verwendung closestein Leistungsproblem verursacht. Es gibt wahrscheinlich andere Möglichkeiten, dies zu umgehen, ohne alle Dialoge global zu schließen.

Cymen
quelle
10

Ich habe diesen Fehler erhalten, als ich nur die jquery-Bibliothek aktualisiert habe, ohne die jqueryui-Bibliothek parallel zu aktualisieren. Ich habe jquery 1.8.3 mit jqueryui 1.9.0 verwendet. Als ich jedoch jquery 1.8.3 auf 1.9.1 aktualisierte, wurde der obige Fehler angezeigt. Als ich die fehlerhaften .closeMethodenzeilen auskommentierte, gab es einen Fehler, dass ich nicht gefunden habe.browserin der jquery-Bibliothek, die in jquery 1.8.3 veraltet und aus jquery 1.9.1 entfernt wurde. Grundsätzlich war die Bibliothek jquery 1.9.1 nicht mit der Bibliothek jquery ui 1.9.0 kompatibel, obwohl auf der Download-Seite von jquery ui angegeben wurde, dass sie mit jquery 1.6+ funktioniert. Im Wesentlichen gibt es nicht gemeldete Fehler, wenn versucht wird, unterschiedliche Versionen der beiden zu verwenden. Wenn Sie die jquery-Version verwenden, die im Lieferumfang des jqueryui-Downloads enthalten ist, sind Sie sicher in Ordnung, aber wenn Sie verschiedene Versionen verwenden, sind Sie abseits der ausgetretenen Pfade und erhalten Fehler wie diese. Zusammenfassend ist dieser Fehler also auf falsch übereinstimmende Versionen zurückzuführen (in meinem Fall sowieso).

johntrepreneur
quelle
4
Ich habe dieses Problem gelöst, indem ich auch meine jquery ui-Version auf 1.9.2 aktualisiert habe, und dann hat es funktioniert. Also, jquery 1.9.1 mit jquery ui 1.9.2 beseitigt den obigen Fehler.
johntrepreneur
4

Also benutzt du das:

var theDialog = $("#divDialog").dialog(opt);
theDialog.dialog("open");

Wenn Sie eine MVC-Teilansicht im Dialogfeld öffnen, können Sie im Index eine ausgeblendete Schaltfläche und ein JQUERY-Klickereignis erstellen:

$("#YourButton").click(function()
{
   theDialog.dialog("open");
   OR
   theDialog.dialog("close");
});

dann in Teilansicht HTML rufen Sie Button Trigger Klick wie:

$("#YouButton").trigger("click")

Tschüss.

Danilo Antonietto
quelle
2

Wenn Sie den Dialog sofort öffnen möchten, wenn der Dialog initialisiert oder die Seite fertig ist, können Sie den Parameter autoOpenauch trueim Optionsobjekt des Dialogs auf Folgendes setzen:

var opt = {
        autoOpen: true,
        modal: true,
        width: 550,
        height:650,
        title: 'Details'
};

Sie müssen also nicht das `$ (" # divDialog "). Dialog (" open ") aufrufen;

Wenn das Dialogobjekt initialisiert wird, wird der Dialog automatisch geöffnet.

Gašper Sladič
quelle
2

Mit der neuen jQuery-UI-Version können Sie keine UI-Methoden für nicht initialisierte Dialoge aufrufen. Um dieses Problem zu umgehen, können Sie anhand der folgenden Überprüfung überprüfen, ob der Dialog aktiv ist.

if (modalDialogObj.hasClass('ui-dialog-content')) {
    // call UI methods like modalDialogObj.dialog('isOpen')
} else {
    // it is not initialized yet
}
Tomin
quelle
0

Dies ist auch eine Lösung:

$("div[aria-describedby='divDialog'] .ui-button.ui-widget.ui-state-default.ui-corner-all.ui-button-icon-only.ui-dialog-titlebar-close").click();
Damian Królikowski
quelle
0

Ich musste einfach den ScriptManager zur Seite hinzufügen. Problem gelöst.

Gnardizzi
quelle
0

In meinem Fall bestand das Problem darin, dass ich $("#divDialog").removeData();im Rahmen des Zurücksetzens meiner Formulardaten im Dialogfeld angerufen hatte .

Dies führte uiDialogdazu, dass ich eine Datenstruktur mit dem Namen löschte, was bedeutete, dass der Dialog neu initialisiert werden musste.

Ich habe durch .removeData()spezifischere Löschvorgänge ersetzt und alles hat wieder funktioniert.

AnthonyVO
quelle
0

Mein Fall ist anders, er schlägt aufgrund des Umfangs von " dies " fehl :

//this fails:
$("#My-Dialog").dialog({
  ...
  close: ()=>{
    $(this).dialog("close");
  }
});

//this works:
$("#My-Dialog").dialog({
  ...
  close: function(){
    $(this).dialog("close");
  }
});
datdinhquoc
quelle
-1

Ich habe diese Fehlermeldung erhalten, weil ich das div-Tag in der Teilansicht anstelle der übergeordneten Ansicht hatte

user1152145
quelle
1
Und was bedeutet das genau?
AaA
1
Dies ist schlecht erklärt, aber gültig. In MVC hatte ich das enthaltende div-Tag für den Dialog in meiner Teilansicht. Als ich das enthaltende div-Tag auf die übergeordnete Seite verschoben habe, funktionierte der Dialog ordnungsgemäß.
Paulj