2009-03-20 19 views
11

Ho il seguente DIV markup:contenuti DIV mostra sulla pagina invece di JQuery Dialog

<div id="dialog" title="Membership Renewal"> 
Your membership is going to expire. 
</div> 

Ho il seguente javascript per eseguire la JQuery:

<script type="text/javascript"> 
function showjQueryDialog() { 
    $("#dialog").dialog("open"); 
    //alert("Time to renew Membership!"); 
} 

$(document).ready(function() { 
    $("#dialog").dialog({ 
     autoOpen: false, 
     modal: true, 
     buttons: { "Renew Membership": function() { $(this).dialog("close"); } } 
    }); 
}); 
</script> 

ho un asp: Button che si trova all'interno di un controllo e il controllo si trova su una pagina principale. La prima cosa che noto è che quando la pagina viene caricata, viene visualizzato il div e poi scompare quando la pagina viene caricata. Quando clicco il bottone esegue il seguente:

if (timeSpan.Days >= 30) 
{ 
//Show JQuery Dialog Here 
ScriptManager.RegisterClientScriptBlock(this, typeof(Page), "showExpiration",  
"showjQueryDialog()", true); 
} 

quando clicco sul tasto, invece di una finestra di dialogo popping up, il contenuto del div diventa appena visibile.

+0

È possibile visualizzare l'output di ScripManager.RegisterClientScriptBlock per noi? Ho l'impressione che stia semplicemente inviando javascript direttamente sulla pagina e sparando prima di $ (document) .ready. – Min

risposta

16

Credo che tu abbia due problemi correlati qui.

Il motivo per cui il DIV viene visualizzato quando si carica per la prima volta è perché non lo si è ancora avvertito. Lo script jQuery che rende il comportamento DIV come una finestra di dialogo non viene eseguito finché non viene caricato il DOM HTML e fino a quel momento non verrà nascosto il DIV. Una soluzione semplice consiste nel nascondere il DIV per impostazione predefinita tramite CSS.

<div id="dialog" title="Membership Renewal" style="display:none;"> 
Your membership is going to expire. 
</div> 

Il problema click pulsante è connessi: RegisterClientScriptBlock uscita volontà di uno script che viene eseguito non appena si incontra, in modo che il codice jQuery che lo trasforma in una finestra di dialogo non ha avuto la possibilità di correre ancora. Per dargli la possibilità di farlo, puoi cambiare il codice C# per usare RegisterStartupScript, che ritarderà l'esecuzione di showjQueryDialog() fino al termine del caricamento della pagina e il codice jQuery ha avuto la possibilità di convertire il DIV in una finestra di dialogo.

if (timeSpan.Days >= 30) 
{ 
    //Show JQuery Dialog Here 
    ScriptManager.RegisterStartupScript(this, typeof(Page), 
     "showExpiration", "showjQueryDialog()", true); 
} 
+0

Ho cambiato la visualizzazione div in none e questo nasconde il div e ho cambiato il codice per utilizzare RegisterStartupScript, ma la finestra di dialogo non viene visualizzata ora. – Xaisoft

+0

Cosa succede se si modifica lo script, ma si omette il display: nessuno? –

+0

non ho mai avuto fortuna con mettere style = "display: none;" sull'elemento reale, sembra sempre che jQuery non possa modificare la visualizzazione di esso se specificato in questo modo. –

0

assicurati di specificare il doctype corretto nella parte superiore della pagina, questa sembra essere la causa di alcuni problemi che ho visto.

edit:

anche, per evitare che si lampeggiare, all'inizio si può avere qualcosa di simile

#debug { display: none; } 

da qualche parte prima che l'elemento (molto probabilmente il vostro foglio di stile o nella testa).

un'altra cosa che potrebbe aiutare è se si mette insieme:

OnClientClick="showjQueryDialog(); return false;"; 

nel caricamento della pagina o simile, in questo modo non avrete bisogno di un postback (asincrono o altro).

+0

Nel controllo non è presente doctype, ma quello nella pagina principale è: Xaisoft

+0

potresti provare per il tuo doctype? –

+0

Vorrei in secondo luogo l'idea di utilizzare OnClientClick se possibile. –

0

Il motivo per cui non viene visualizzato è perché il documento probabilmente non è ancora stato caricato. e document.ready non è stato chiamato, quindi dialog ("open") viene chiamato prima della finestra di dialogo ({options}); quindi per risolvere questo problema basta aggiungere il codice a una chiamata doc.ready.

Inoltre, il tuo unico caricare la finestra di una volta, in modo che non si ha realmente bisogno per inizializzare come AutoOpen: true, utilizzare il display: none poi vederlo come John Boker detto

function showjQueryDialog() { 
    $(document).ready(function() { 
    $("#dialog").dialog({ 
     modal: true, 
     buttons: { "Renew Membership": function() { $(this).dialog("close"); } }); 
    $("#dialog").show(); // sets display:block; 
    //alert("Time to renew Membership!"); 
    }); 
} 

<div id="dialog" style="display:none"> 
    <!--..--> 
</div> 
+0

Grazie, il display: nessun problema mi ha inchiodato (ripenso), questo è molto utile. – FSBarker

19

So che questo è vecchio ora Tuttavia, imposta la classe sull'interfaccia utente jQuery integrata in ui-helper-hidden.

<div id="dialog" title="Membership Renewal" class="ui-helper-hidden"> 
    Your membership is going to expire. 
</div> 

Questo risolverà il comportamento indesiderato del cameo.

+0

Quindi qual è il meccanismo con cui 'class =" ui-helper-hidden "' aiuta? Ho bisogno di una sorta di CSS corrispondente o JS si prende cura di esso? –

+1

jQuery si prende cura di esso quando si utilizza un file css jQuery. Tutti i file css di jquery themeroller hanno questa classe. per esempio http://code.jquery.com/ui/1.10.2/themes/smoothness/jquery-ui.css di più su http://jqueryui.com/themeroller/ –

+2

Grazie, amico! Questo funziona totalmente ed è l'approccio giusto. –

Problemi correlati