jquery ui Dialog: non è possibile chiamare metodi nella finestra di dialogo prima dell'inizializzazione


101

Ho un'app su jquery 1.5 con finestre di dialogo che hanno funzionato bene. Anche se ho molti gestori .live, l'ho cambiato in .on. Per questo, devo aggiornare jquery (ora 1.8.3 un jquerui 1.9.1).

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

Di seguito è riportato il codice:

Javascript

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

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

codice html

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

Qualche idea del perché potrebbe succedere?

Risposte:


136

Prova questo invece

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

Puoi anche fare:

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

Questo perché la finestra di dialogo non è memorizzata in $('#divDialog'), ma su un nuovo div creato al volo e restituito dalla .dialog(opt)funzione.


5
Questo ha funzionato per me. Devo inizializzare la finestra di dialogo ogni volta che voglio aprirla in questo modo o solo la prima volta? ci sono molte finestre di dialogo. Non c'è modo di impostare le opzioni initiali e quindi aprire le finestre di dialogo tramite i pulsanti?
core-chain.io

6
Ho scoperto che questa soluzione ha anche risolto l'errore "Impossibile chiamare i metodi nella finestra di dialogo prima dell'inizializzazione; si è tentato di chiamare il metodo" open "" che si verifica quando una finestra di dialogo viene aperta e chiusa con successo, quindi gli utenti tentano di aprire la finestra di dialogo una seconda volta . Grazie @ZOD
spadelives

Ti ho dato +1, perché ha risolto anche il mio problema, ma potresti spiegare perché funziona?
Igor L.

2
@IgorLacik Presumo che .dialog () restituisca un'istanza di se stesso in modo da poter eseguire il concatenamento. Pertanto .dialog (opt) .dialog ('open') crea un'istanza di un oggetto dialog (la prima chiamata) e quindi esegue 'open' su di esso. Presumo quindi che chiamando $ (obj) .dialog (opt) e quindi $ (obj) .dialog ('open') in seguito istanzerà oggetti di dialogo separati sull'oggetto jquery, quindi il secondo non può vedere il primo opzioni di configurazione. Senza approfondire ulteriormente il codice della finestra di dialogo è difficile dirlo con certezza, e non ho tempo per questo: D
nealio82

Ho aggiornato la domanda per spiegare cosa hai cercato di spiegare.
JotaBe

23

Se non riesci ad aggiornare jQuery e ottieni:

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

Puoi aggirarlo in questo modo:

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

Oppure, se controlli la visualizzazione e sai che nessun'altra finestra di dialogo dovrebbe essere in uso sull'intera pagina, potresti fare:

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

Consiglierei di farlo solo se l'utilizzo closestcausa un problema di prestazioni. Probabilmente esistono altri modi per aggirare il problema senza eseguire una chiusura globale in tutte le finestre di dialogo.


10

Ho ricevuto questo errore quando ho aggiornato solo la libreria jquery senza aggiornare la libreria jqueryui in parallelo. Stavo usando jquery 1.8.3 con jqueryui 1.9.0. Tuttavia, quando ho aggiornato jquery 1.8.3 a 1.9.1 ho ricevuto l'errore sopra. Quando ho commentato le .closerighe del metodo incriminato , ha generato un errore di non ricerca.browsernella libreria jquery che era deprecata in jquery 1.8.3 e rimossa da jquery 1.9.1. Quindi, in sostanza, la libreria jquery 1.9.1 non era compatibile con la libreria jquery ui 1.9.0 nonostante la pagina di download dell'interfaccia utente jquery affermasse che funziona con jquery 1.6+. Essenzialmente, ci sono bug non segnalati quando si cerca di utilizzare versioni diverse dei due. Se utilizzi la versione jquery fornita in bundle con il download di jqueryui, sono sicuro che starai bene, ma è quando inizi a utilizzare versioni diverse che esci dai sentieri battuti e ricevi errori come questo. Quindi, in sintesi, questo errore proviene da versioni non corrispondenti (nel mio caso comunque).


4
Ho risolto questo problema aggiornando anche la mia versione dell'interfaccia utente di jquery alla 1.9.2 e poi ha funzionato. Quindi, jquery 1.9.1 con jquery ui 1.9.2 elimina l'errore sopra.
johntrepreneur

4

Quindi usi questo:

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

e se apri una vista parziale MVC nella finestra di dialogo, puoi creare nell'indice un pulsante nascosto e un evento clic JQUERY:

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

quindi all'interno della visualizzazione parziale html chiami il pulsante di attivazione del pulsante come:

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

ci vediamo.


2

Se vuoi aprire la finestra di dialogo immediatamente quando la finestra di dialogo è inizializzata o la pagina è pronta, puoi anche impostare il parametro autoOpensu truenell'oggetto opzioni della finestra di dialogo:

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

Quindi, non è necessario chiamare la finestra di dialogo `$ (" # divDialog "). (" Open ");

Quando l'oggetto di dialogo viene inizializzato, la finestra di dialogo viene aperta automaticamente.


2

La nuova versione dell'interfaccia utente di jQuery non ti consentirà di chiamare i metodi dell'interfaccia utente su una finestra di dialogo non inizializzata. Come soluzione alternativa, puoi utilizzare il controllo seguente per vedere se la finestra di dialogo è attiva.

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

0

Questo è anche un modo per aggirare:

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

0

Ho semplicemente dovuto aggiungere lo ScriptManager alla pagina. Problema risolto.


0

Nel mio caso il problema era che avevo chiamato $("#divDialog").removeData();come parte del ripristino dei dati dei moduli all'interno della finestra di dialogo.

Ciò ha comportato la cancellazione di una struttura dati denominata, il uiDialogche significava che la finestra di dialogo doveva essere reinizializzata.

Ho sostituito .removeData()con eliminazioni più specifiche e tutto ha ripreso a funzionare.


0

Il mio caso è diverso, fallisce a causa dell'ambito di " questo ":

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

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

-1

Ho ricevuto questo messaggio di errore perché avevo il tag div nella vista parziale invece della vista principale


1
E cosa significa esattamente?
AaA

1
Questo è spiegato male, ma valido. In MVC, avevo il tag div contenente per la finestra di dialogo nella mia vista parziale. Quando ho spostato il tag div contenente nella pagina principale, la finestra di dialogo ha funzionato correttamente.
Paulj
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.