StackOverflow上有几篇关于这个主题的帖子,但没有一个答案对我有帮助。 我正在使用DataList控件,该控件由SELECT通过DataAdapter填充。 建议使用一个概念,即只能打开一个对话框实例,但不能应用此方法
html的结构是:
<asp:DataList ID="DataList" runat="server">
<ItemStyle />
<ItemTemplate>
<a href="" class="link"/></a>
<div class = "dialog" id="dynamicID" style="display:none">
</ div>
</ ItemTemplate>
</ asp: DataList>
我正在使用的jQuery代码是:
<script language="javascript" type="text/javascript">
$ (function () {
$ (". link. ") click (function () {
var id = '#' + ($ (this). siblings ('. dialog'). attr ('id'));
$ (id). dialog ({
AutoOpen: false,
closeOnEscape: true,
resizable: false,
draggable: false,
modal: true,
width: 800,
height: 600,
overlay: {backgroundColor: "# 000", opacity: 0.5},
top: 20,
show: 'fade',
hide: 'fade',
buttons: {
"Close": function () {
$ (id). dialog ('close');
}
}
});
$ (id). dialog ('open');
});
});
</ script>
答案 0 :(得分:6)
想象一下 HTML
<asp:DataList ID="dataList" runat="server">
<ItemTemplate>
<div class="row">
<p>
Result: <strong>
<%# Container.DataItem.ToString() %></strong></p>
<a href="#" class="link" data-open="dialog_<%# Container.ItemIndex %>" />Click
To Open</a>
<div class="dialog" id="dialog_<%# Container.ItemIndex %>">
<h2>
This is the text inside the dialog #
<%# Container.ItemIndex %>.</h2>
<p>
</p>
</div>
</div>
</ItemTemplate>
</asp:DataList>
使用此 javascript
$(function () {
// create dialogs
$(".dialog").dialog({
autoOpen: false,
closeOnEscape: true,
buttons: {
"Close": function () {
$(id).dialog('close');
}
}
});
// hook up the click event
$(".link").bind("click", function () {
// console.log($(this).parent());
// open the dialog
var dialogId = $(this).attr("data-open");
$("#" + dialogId).dialog("open");
return false;
});
});
很可爱。
用你的方法工作示例 can be found here
有什么问题?
你正在一个方法中创建对话框,这应该在$(document).ready()
内部创建,因此,每次单击时,它都会创建一个对话框,但是......它已经存在并且搞砸了所有内容。
使用对话框时:
.dialog()
.dialog('open')
即可显示该对话框.dialog('close')
隐藏该对话框默认情况下,jQuery UI CSS会自动配置对话框(display:none;
),因此您无需执行此类操作。
答案 1 :(得分:1)
通常只是在关闭时销毁对话框会解决问题。
$( "#dialogbox" ).dialog({
close: function (event, ui) {
$(this).dialog("destroy");
}
});
答案 2 :(得分:0)
当对话框显示时,它会从标记流程中掉出来。所以当你致电var id = '#' + ($ (this).siblings('.dialog').attr('id'));
时,你什么也得不到。您可以在第一次打开时将对话框的id添加到数组,然后如果$(this).siblings ('.dialog')
结果为空,则可以从数组中获取对话框元素ID。
<script type="text/javascript">
var registeredDialogs = [];
function registerDialog(link, dialogDiv) {
var linkId = $(link).attr("id");
if (!registeredDialogs[linkId])
registeredDialogs[linkId] = dialogDiv;
}
function getDialog(link) {
var linkId = $(link).attr("id");
return this.registeredDialogs[linkId];
}
$(function () {
$(".link").click(function () {
var dialogDiv = $(this).siblings('.dialog');
if (dialogDiv.length !== 0) {
registerDialog(link, dialogDiv);
}
else {
dialogDiv = this.getDialog(link);
}
dialogDiv.dialog({
AutoOpen: false,
closeOnEscape: true,
resizable: false,
draggable: false,
modal: true,
width: 800,
height: 600,
overlay: { backgroundColor: "# 000", opacity: 0.5 },
top: 20,
show: 'fade',
hide: 'fade',
buttons: {
"Close": function () {
$(id).dialog('close');
}
}
});
$(id).dialog('open');
});
});
</script>