2009-03-20 2 views
11

Je le balisage DIV suivant:contenu DIV montre à la page au lieu de JQuery Dialog

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

Je le javascript suivant pour exécuter le 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> 

je un aspic: Bouton qui est à l'intérieur d'un contrôle et le contrôle est sur une page maître. La première chose que je remarque est que lorsque la page est chargée, la div est affichée, puis disparaît lorsque la page est chargée. Lorsque je clique sur le bouton, il exécute la commande suivante:

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

Lorsque je clique sur le bouton, au lieu d'une boîte de dialogue apparaître, le contenu de la div tout devient visible.

+0

Pouvez-vous afficher la sortie de ScripManager.RegisterClientScriptBlock pour nous? J'ai l'impression qu'il est juste sortie javascript directement sur la page et tirant avant le $ (document) .ready. – Min

Répondre

16

Je crois que vous avez deux problèmes connexes ici.

La raison pour laquelle le DIV est affiché lors du premier chargement est parce que vous ne lui avez pas encore dit de ne pas le faire. Le script jQuery qui fait que le DIV se comporte comme une boîte de dialogue ne s'exécute pas tant que le DOM HTML n'est pas chargé, et jusque-là il ne cache pas le DIV. Une solution simple consiste à masquer la DIV par défaut en utilisant CSS.

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

Le bouton problème de clic est lié: RegisterClientScriptBlock émet un script qui fonctionne dès qu'il est rencontré, de sorte que le code jQuery qu'il se transforme en une boîte de dialogue n'a pas eu la chance de courir encore. Afin de lui donner une chance de le faire, vous pouvez modifier le code C# pour utiliser RegisterStartupScript, ce qui retardera l'exécution de showjQueryDialog() jusqu'à ce que la page ait fini de se charger et que le code jQuery ait eu la chance de transformer le DIV en boîte de dialogue.

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

J'ai changé l'affichage div à none et cela cache la div et j'ai changé le code pour utiliser RegisterStartupScript, mais la boîte de dialogue n'apparaît pas maintenant. – Xaisoft

+0

Que se passe-t-il si vous modifiez le script, mais ignorez l'affichage: aucun? –

+0

Je n'ai jamais eu de chance avec mettre style = "display: none;" sur l'élément réel, semble toujours que jquery ne peut pas modifier l'affichage de celui-ci si spécifié de cette façon. –

0

assurez-vous que vous spécifiez le doctype correct en haut de votre page, cela semble être la cause de certains problèmes que j'ai vus.

modifier:

aussi, pour l'empêcher de clignoter au début, vous pouvez avoir quelque chose comme

#debug { display: none; } 

quelque part avant l'élément (plus probable que votre feuille de style ou dans la tête).

une autre chose qui pourrait aider est si vous mettez ensemble:

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

la charge de la page ou similaire, de cette façon vous n'aurez pas besoin d'un postback (asynchrone ou autre).

+0

Il n'y a pas de doctype dans le contrôle, mais celui de la page maître est: Xaisoft

+0

pourriez-vous essayer pour votre doctype? –

+0

Je voudrais appuyer l'idée d'utiliser OnClientClick si possible. –

0

La raison pour laquelle cela n'apparaît pas est que le document n'a probablement pas encore été chargé. et document.ready n'a pas été appelé, ainsi dialog ("open") est appelé avant le dialogue ({options}); Donc, pour résoudre ce problème, ajoutez simplement le code dans un appel doc.ready.

En outre, votre seul chargement de la boîte de dialogue une fois, si vous avez vraiment pas besoin de l'initialiser comme Autoopen: false, utilisez le display: none montre alors comme John Boker dit

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

Merci, l'affichage: aucun problème m'a cloué (je pense à nouveau), c'est très utile. – FSBarker

19

Je sais ce est vieux maintenant. Cependant, définissez votre classe sur l'interface utilisateur jQuery intégrée dans ui-helper-hidden.

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

Ceci résoudra le comportement de cam de votre div non désiré.

+0

Alors, quel est le mécanisme par lequel 'class =" ui-helper-hidden "' aide? Ai-je besoin d'une sorte de CSS correspondant, ou JS s'en occupe-t-il? –

+1

jQuery s'en occupe lorsque vous utilisez un fichier css jQuery. Tous les fichiers css de jquery themeroller ont cette classe. par exemple http://code.jquery.com/ui/1.10.2/themes/smoothness/jquery-ui.css plus sur http://jqueryui.com/themeroller/ –

+2

Merci, mate! Cela fonctionne totalement et est la bonne approche. –

Questions connexes