【发布时间】:2012-07-25 23:16:04
【问题描述】:
tl;dr: 如何让点击处理程序可见的 DOM 元素成为关闭 body 之前的最后一个元素,即使正在附加动态生成的元素?
本质上,我希望打开元素的单击也将其在 DOM 中移动到最后一个,即使在附加了一些动态元素之后也是如此。
我的问题源于一个模态在另一个模态中打开,而一个页面上有多个模态。一个问题是,在页面加载时,子模式存在于 DOM 中,而主模式在点击时被实例化(子模式使用不同的代码来生成,而主模式使用 jQuery UI 对话框)。
如果你打开一个模态然后打开子模态一切都很好。如果您打开第二个模态,然后在重新打开第一个模态时将其关闭,则子模态将不会出现,因为它隐藏在第二个模态下方。如果我将这些子模态附加到正文,从而将它们放在任何生成的模态之后,它们看起来很好(但这会产生其他问题)。尽管看起来这似乎不是 z-index 问题(我已经尝试了与此相关的所有事情,但没有运气),它似乎与这些模态在 DOM 中的位置有关。
代码可能更清晰:
这是页面加载时 html 的样子:
<div id='submodal_1' class='submodal'>foo</div>
<div id='submodal_2' class='submodal'>bar</div>
</body>
点击打开第一个主模态窗口后:
<div id='submodal_1'>subfoo</div>
<div id='submodal_2'>subbar</div>
<div id='primary_modal_1' class='ui-dialog' style='display:block'>foo</div>
</body>
点击打开该模态的子模态后,我必须将子模态移动到主模态下方,否则它不会出现(同样,z-index 不会影响此阻塞):
$('#submodal_1').insertAfter('#primary_modal_1');
此时,如果您关闭 #primary_modal_1,它将被隐藏,但仍存在于 DOM 中。如果您再打开一秒钟,代码现在将如下所示:
<div id='submodal_2' class='submodal'>subbar</div>
<div id='primary_modal_1' class='ui-dialog' style='display:none'>foo</div>
<div id='submodal_1' class='submodal'>subfoo</div>
<div id='primary_modal_2' class='ui-dialog' style='display:block'>bar</div>
</body>
此时如果您重新打开第一个主模态并尝试打开其子模态,则子模态将不会出现。但是,如果您将子模态移动到最后一个主模态下方,如下所示:
<div id='submodal_2' class='submodal'>subbar</div>
<div id='primary_modal_1' class='ui-dialog' style='display:block'>foo</div>
<div id='primary_modal_2' class='ui-dialog' style='display:none'>bar</div>
<div id='submodal_1' class='submodal'>subfoo</div> //<-- moved this line
</body>
子模态将正确显示。我想确保子模态总是在 DOM 中最后,无论附加了多少主模态。
【问题讨论】:
标签: javascript jquery dom modal-dialog