我遇到了Jquery UI模式对话框的问题。我有模态对话框(dialogA),它可以创建另一个模态对话框(dialogB)。在对话框B的第二次创建和关闭之后,dialogA的叠加层消失。
这是我的代码:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head><link type="text/css" rel="Stylesheet" href="ui-lightness/jquery-ui-1.8.custom.css" />
<script type="text/javascript" src="jquery-1.4.2.min.js"></script>
<script type="text/javascript" src="jquery-ui-1.8.custom.min.js"></script>
<script type="text/javascript">
function createDialog(dialogId) {
$('#' + dialogId).dialog({
autoOpen: true,
modal: true,
buttons: {
'close': function() {
$(this).dialog('close');
},
'create': function() {
var newDialogId = dialogId + '1';
$('body').append('<div id="' + newDialogId + '">' + newDialogId + '</div>');
createDialog(newDialogId);
}
},
close: function() {
$(this).dialog('destroy');
$(this).remove();
}
});
}
$(document).ready(function() {
$('#button1').click(function() {
var dialogId = 'dialog';
$('body').append('<div id="' + dialogId + '">' + dialogId + '</div>');
createDialog(dialogId);
});
});
</script>
</head>
<body>
<button id="button1">Create dialog</button>
</body>
</html>
重现步骤:
1.单击按钮
创建一个对话框(对话框)
2.通过单击第一个对话框中的“创建”按钮来创建另一个对话框(dialogA)
3.关闭对话A
4.重复步骤2-3
5.第一个对话框的叠加已经消失
由于
答案 0 :(得分:3)
此问题已被提出为bug并已关闭。最新的jQuery UI发布(1.8.10)将解决这个问题。有关详细信息,请查看此ticket。
答案 1 :(得分:2)
这就是我提出的,因为这显然是模态对话框的一个错误,我可以向你展示一个可行的“黑客”,但我认为它弄乱的原因是当你创建一个模态对话框,它添加了
<div class="ui-widget-overlay"></div>
在对话框div之上,并且因为你将所有对话框直接附加到正文,所以它会混淆哪些需要在一段时间后关闭(这只是我的假设,我真的不应该这样做):)
解决方法是每次调用CreateDalog时检查对话框的数量和叠加的数量,如果它们不匹配,您手动插入一个新的叠加层,这将解决您的问题。有一点是,由于这个叠加是手动添加的,因此对话框不知道它需要隐藏它,所以当你只回到一个对话框并关闭它时,叠加层会保留。这也需要手动隐藏。
我知道这不是最好的解决方案,但它是一种解决方法,它对我有用,所以我希望你可以使用它,直到有人提出更好的解决方案。
这是代码:
function createDialog(dialogId) {
$('#' + dialogId).dialog({
autoOpen: true,
modal: true,
buttons: {
'close': function() {
$(this).dialog('close');
},
'create': function() {
var newDialogId = dialogId + '1';
$('body').append('<div id="' + newDialogId + '">' + newDialogId + '</div>');
createDialog(newDialogId);
}
},
close: function() {
$(this).dialog('destroy');
$(this).remove();
resetOverlays();
}
});
var dialogs = $("div.ui-dialog");
var overlays = $("div.ui-widget-overlay");
var overlayStyle = $(overlays[0]).attr("style");
if(dialogs.length > overlays.length)
{
var overlay = $("<div></div>").addClass("ui-widget-overlay").attr("style", overlayStyle).css("z-index", "1001");
$("body").append(overlay);
}
}
function resetOverlays()
{
var dialogs = $("div.ui-dialog");
if(dialogs.length == 0)
{
$(".ui-widget-overlay").remove();
}
}
我添加了对话框和叠加层的检查:
var dialogs = $("div.ui-dialog");
var overlays = $("div.ui-widget-overlay");
var overlayStyle = $(overlays[0]).attr("style");
if(dialogs.length > overlays.length)
{
var overlay = $("<div></div>").addClass("ui-widget-overlay").attr("style", overlayStyle).css("z-index", "1001");
$("body").append(overlay);
}
负责在需要时添加额外的叠加层,并且我在您不再需要时添加了重置叠加层的功能
function resetOverlays()
{
var dialogs = $("div.ui-dialog");
if(dialogs.length == 0)
{
$(".ui-widget-overlay").remove();
}
}
在对话框脚本的结束部分中调用
,close: function() {
$(this).dialog('destroy');
$(this).remove();
resetOverlays();
}
我没有机会彻底测试它,但如果没别的话,这可能是一个开始......
祝你好运