DIV 内容显示在页面而不是 JQuery 对话框上

Posted

技术标签:

【中文标题】DIV 内容显示在页面而不是 JQuery 对话框上【英文标题】:DIV content shows on page instead of JQuery Dialog 【发布时间】:2010-10-14 15:33:17 【问题描述】:

我有以下 DIV 标记:

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

我有以下 javascript 来执行 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>

我有一个 asp:Button,它位于控件内,并且该控件位于母版页上。我注意到的第一件事是,当页面加载时,div 会显示,然后在页面加载完成后消失。当我单击按钮时,它会执行以下操作:

if (timeSpan.Days >= 30)

//Show JQuery Dialog Here
ScriptManager.RegisterClientScriptBlock(this, typeof(Page), "showExpiration",    
"showjQueryDialog()", true);

当我单击按钮时,不会弹出对话框,而是显示 div 的内容。

【问题讨论】:

你能为我们展示一下 ScripManager.RegisterClientScriptBlock 的输出吗?我有一种预感,它只是直接在页面上输出 javascript 并在 $(document).ready 之前触发。 【参考方案1】:

我知道这已经过时了。但是,请将您的类设置为 ui-helper-hidden 中内置的 jQuery UI。

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

这将解决您的 div 不需要的客串行为。

【讨论】:

那么class="ui-helper-hidden" 提供帮助的机制是什么?我需要某种相应的 CSS,还是由 JS 处理? 当您使用 jQuery css 文件时,jQuery 会处理它。所有的 jquery themeroller css 文件都有这个类。例如code.jquery.com/ui/1.10.2/themes/smoothness/jquery-ui.css 更多jqueryui.com/themeroller【参考方案2】:

我相信你在这里有两个相关的问题。

首次加载时显示 DIV 的原因是您尚未告诉它不要这样做。使 DIV 表现为对话框的 jQuery 脚本在加载 html DOM 之前不会运行,并且在此之前它不会隐藏 DIV。一个简单的解决方案是默认使用 CSS 隐藏 DIV。

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

按钮点击问题相关:RegisterClientScriptBlock会输出一个脚本,一遇到就运行,所以把它变成对话框的jQuery代码还没来得及运行。为了给它一个这样做的机会,您可以将 C# 代码更改为使用 RegisterStartupScript,这将延迟 showjQueryDialog() 的执行,直到页面完成加载并且 jQuery 代码有机会将 DIV 变为一个对话框。

if (timeSpan.Days >= 30)

  //Show JQuery Dialog Here
    ScriptManager.RegisterStartupScript(this, typeof(Page), 
        "showExpiration", "showjQueryDialog()", true);

【讨论】:

我将 div 显示更改为 none 并隐藏了 div,我将代码更改为使用 RegisterStartupScript,但对话框现在没有显示。 如果您更改脚本,但忽略 display:none 会发生什么? 我从来没有运气把 style="display:none;"在实际元素上,如果以这种方式指定,jquery 似乎总是无法修改它的显示。 @John - 我不确定这是否只是我的问题,还是普遍存在的。在这种情况下,使用样式声明绝对是要走的路。 我删除了 style="display:none",但保留了 RegisterStartupScript,它直接在页面上显示 div 的内容,而不是对话框。【参考方案3】:

确保您在页面顶部指定了正确的文档类型,这似乎是我看到的一些问题的原因。

编辑:

另外,为了防止它在开始时闪烁,您可以使用类似的东西

#debug  display: none; 

元素之前的某处(很可能是您的样式表或头部)。

另一件可能有帮助的事情是如果你把 set:

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

在页面加载或类似情况下,您不需要回发(异步或其他方式)。

【讨论】:

控件中没有doctype,但是母版页中的那个是:ttp://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" rel="nofollow" target="_blank">w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" > 您可以尝试 ttp://www.w3.org/TR/html4/strict.dtd" rel="nofollow" target="_blank">w3.org/TR/html4/strict.dtd"> 作为您的文档类型吗? 如果可能的话,我会支持使用 OnClientClick 的想法。 OnClientClick 的问题是我只想在用户的过期日期为 如果满足该条件,您可以在代码隐藏中添加 OnClientClick。【参考方案4】:

它没有显示的原因是因为文档可能还没有加载。并且 document.ready 没有被调用,所以 dialog("open") 在 dialog(options) 之前被调用;所以要解决这个问题,只需将代码添加到 doc.ready 调用中。

另外,你只加载一次对话框,所以你不需要将它初始化为 autoOpen:false,使用 display:none 然后按照 John Boker 所说的那样显示它

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>

【讨论】:

谢谢,display:none 问题让我很受用(我再想想),这很有帮助。

以上是关于DIV 内容显示在页面而不是 JQuery 对话框上的主要内容,如果未能解决你的问题,请参考以下文章

如何设置jquery的datepicker,让它进入页面就自动显示在页面的某个位置,而不是点击了才显示

使用微调器加载 jQuery 整个 HTML 页面

JQuery如何实现在弹窗中点击按钮,继续弹出一个新弹窗,而不是打开新页面

修复了 jquery UI 对话框顶部的内容

jquery - dom 操作

用jquery代码如何实现当我点击“查看”按钮时,在弹出窗口或弹出页面,显示数据库的详细数据