【问题标题】:jQuery - Dialogs vanish when one is closed/destroyedjQuery - 对话框在关闭/销毁时消失
【发布时间】:2011-07-20 17:54:44
【问题描述】:

我正在构建一个广泛使用 jQuery UI 对话框的应用程序。我在一次打开多个对话框时遇到了一个问题,如果可能的话,我真的不知道如何解决它。

基本上是这样的:

  • 用户打开对话框A(顶部:100px,高度:300px)
  • 用户打开对话框B(顶部:100px,高度:300px)
  • 用户关闭对话框A
  • 对话框A 向上移动后打开的所有对话框。例如:对话框 B top 属性减去对话框 A height (100px - 300px = -200px):对话框消失。

我通过使用 Firebug Inspect 和 Web Developer 得出了这个结论。

如果对话框B(在对话框A之后打开)先关闭,则不会出现问题。我也尝试过使用 vanilla UI(即:没有加载除 jQuery 之外的样式表),但它仍然会发生。对话框关闭时似乎有一个我无法覆盖的触发器。

使用 position: fixed; (由 @TheVillageIdiot 建议)修复它,但在对话框被销毁时仍然会发生。 p>

这是一个例子:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
    <title></title>

    <link type="text/css" rel="stylesheet" media="all" href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.7.2/themes/ui-lightness/jquery-ui.css">
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/jquery-ui.min.js"></script>

</head>
<body>

<div id="dialog-1">

</div>
<div id="dialog-2">

</div>

<script type="text/javascript">
$('#dialog-1').dialog({
    close: function() {
        $(this).dialog('destroy');      
    },
    height: 300,
    position: [100, 100],  
    show: 'scale',
    hide: 'drop',
    resizable: false,
    title: 'A',
});

$('#dialog-2').dialog({
    close: function() {
        $(this).dialog('destroy');      
    },
    height: 300,
    position: [100, 100],
    show: 'scale',
    hide: 'drop',
    resizable: false,
    title: 'B',
});
</script>

</body>
</html>

非常感谢任何建议。

【问题讨论】:

  • 您应该显示代码。关闭处理程序可能有问题?
  • 我认为当顶部对话框关闭时,它后面的其他对话框会重新流动。您是否尝试过使用position:fixed 进行对话?
  • @spacevillain:我会的,但老实说,这是 jQuery UI Dialog 最基本的用法。
  • @TheVillageIdiot:它有效,但我发现了问题(但不是解决方案)。即使位置是fixed,当对话框被销毁时,它仍然会发生。
  • 添加示例代码(您可以按原样实际尝试)。

标签: javascript jquery jquery-ui dialog jquery-ui-dialog


【解决方案1】:

可能是因为您的对话框不在position: absolute 中,所以对话框B 的位置(即top:X)是相对于对话框A 的位置(top:Y)计算的。

假设对话框 B 的绝对位置是 top: 20px,对话框 A 是 top: 10px,对话框 B 的分配 CSS 位置将是 top: 10px,因为它是相对于对话框 A。因此,当对话框A 被销毁时,对话框B (top: 10px) 的位置将相对于对话框A 之前的元素,很可能更高,因此在您的窗口中向上。

解决方案非常简单:将对话框 CSS position 属性设置为 absolute。 jQuery UI 应该会赶上并正确计算位置。

P.S.:只需确保在加载 jQuery UI CSS 样式表之后定义 CSS 绝对位置,以确保覆盖 jQuery。

【讨论】:

    【解决方案2】:

    从 UI 的角度来看,我有点担心您会同时触发多个对话框。在 UI 模式中,一些研究得出结论,模态对话框非常具有破坏性,因此理想情况下,它应用于您绝对必须中断其余过程以使某些事情发生或警告用户的情况。在非模态环境中使用向导等模式可能会更好地完成一个接一个的对话。

    或者,有多个通知小部件可以很好地完成这类事情。例如:

    http://www.erichynds.com/examples/jquery-notify/

    http://www.thinkbohemian.com/2010/04/22/stack-overflow-style-notifications-using-jquery/

    好的,话虽如此,我已经这样做了几次,特别是当我提醒用户某个过程正在发生,然后告诉他们该过程已经成功/失败时。与其同时抛出并销毁一个,解决方案是抛出一个,销毁它,然后依次实例化其他的。对于需要用户交互的示例,这可以通过在 jQuery 对话框代码本身中单击按钮来完成,或者可以通过服务器端脚本自动完成,该脚本“告诉”UI 在通知进程时销毁一个并构建另一个.无论哪种方式,实例化一个旨在多次创建单个元素然后期望它“堆叠”的脚本都会引发所有浏览器问题(咳嗽,咳嗽 IE)的错误。

    【讨论】:

    • 感谢您的关注,但我的对话框不是模态的。我也没有将它用于警报,它更像是一个工作区(您可以一次打开多个对话框)。
    猜你喜欢
    • 2017-08-13
    • 1970-01-01
    • 1970-01-01
    • 2011-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-09
    • 2017-10-13
    相关资源
    最近更新 更多