2011-10-31 16 views
7

Sto tentando di chiudere automaticamente la finestra di dialogo tre secondi dopo l'apertura. Ho provato i seguenti metodi:Finestra di dialogo dell'interfaccia utente jQuery Auto-Close con setTimeout

setTimeout($("#mydialog").dialog('close'), 3000); 

Qui è in context:

$("#acknowledged-dialog").dialog({ 
    height: 140, 
    modal: true 
}); 

setTimeout($("#acknowledged-dialog").dialog('close'), 3000); 

Ma con questo metodo, non ha nemmeno mostrare! Immagino che il metodo close venga chiamato immediatamente dopo che è stato mostrato nella pagina. Il registro non mostra errori.

Ho anche provato il legame con l'evento dialogopen:

$("#acknowledged-dialog").bind('dialogopen', function(event, ui) { 
    setTimeout($(this).dialog('close'), 3000); 
}); 
$("#acknowledged-dialog").dialog({ 
    height: 140, 
    modal: true 
}); 

Gli spettacoli di dialogo, ma non lo fa chiusura automatica. Nessun errore nei log qui.

Non riesco a utilizzare "questo" nell'argomento $ in setTimeout?

risposta

13

setTimeout sta chiamando il valore restituito di $ ("# mydialog"). Dialog ("close") dopo 3 secondi. vuoi buttare il tutto come una stringa, e dovrebbe funzionare bene. Inoltre, non penso che tu voglia associare 'dialogopen' prima di inizializzare la finestra di dialogo. Di seguito dovrebbe funzionare perfettamente:

$("#acknowledged-dialog").dialog({ 
    height: 140, 
    modal: true, 
    open: function(event, ui){ 
    setTimeout("$('#acknowledged-dialog').dialog('close')",3000); 
    } 
}); 
+0

e no, a meno che non seguiate @toby e includiate la funzione, ho trovato che non posso usare 'this' nel codice precedente per setTimeout. – DefyGravity

+1

Volevo solo sottolineare che, in situazioni in cui quella stringa non funziona (come quando stavo creando un'estensione di Chrome), puoi semplicemente trasformare la stringa in una funzione anonima. –

+0

Si noti che se l'utente chiude manualmente la finestra di dialogo prima del timeout, il timer nel codice sopra continuerà a funzionare e tenterà di chiudere la finestra di dialogo una seconda volta - questo è ok se la finestra di dialogo non viene distrutta. Ma se la finestra di dialogo viene visualizzata una seconda volta prima del primo timeout, il primo timer chiuderà la finestra di dialogo in anticipo. –

8

Ho scritto uno article appositamente per il problema riscontrato. Per favore, leggilo

In breve, si desidera avvolgere $("#mydialog").dialog('close') con una funzione in linea ovunque si desideri venga eseguita a causa di un ritardo o di un evento innescato.

setTimeout(function(){ 
    $("#mydialog").dialog('close') 
}, 3000); 

La finestra di dialogo non mostra nemmeno perché hai chiuso non appena si è aperto in ogni caso.

+0

Risolto, a causa di DefyGravity che indica che non è possibile fare riferimento a 'this' all'interno del callback. – airportyh

+1

Per riferimento futuro, è possibile utilizzare 'this' memorizzato in una variabile. Ciò funziona convenientemente quando potresti avere una finestra di dialogo dinamica che non ha necessariamente un id. Basta memorizzare 'this' prima di' setTimeout' all'interno del callback 'open' e usare la variabile come una chiusura. Questo lo rende anche più portatile. 'open: function (event, ui) {var $ this = $ (this); setTimeout (function() {$ this.dialog ('close')}, 3000); } ' – Demonslay335

Problemi correlati