有一个jQuery对话框问题。当人们点击calDayContentEntry div时,我想利用ajax在对话框窗口中呈现日历内容。以下代码适用于第一次单击,但在关闭对话框后,我再也无法再显示该条目的对话框。其他条目也是第一次使用,但是次要点击不会再次打开对话框。
以下是我遇到问题的相关代码(所有内容都在同一个asp.net mvc 3 razor视图中)。有没有人有一些可以解决这个问题的调整?
...
<div class="calDayContent">
@foreach (var content in day.Contents)
{
<div class="calDayContentEntry">
<input type="hidden" value="@content.Entry.Id" class="hiddenId" />
<div class="@content.DisplayClass">@content.Entry.Hours.ToString() hrs</div>
</div>
<div class="leaveRequestPopup"></div>
}
</div>
...
<script type="text/javascript">
$().ready(function () {
$('.calDayContentEntry').click(function () {
getAndShowDialogContents(this);
});
// Register close event for dialog if overlay is clicked
$('.ui-widget-overlay').live("click", function () {
//Close the dialog
$currentDialog.dialog("close");
});
});
function getAndShowDialogContents(entryDiv) {
var entryId = $(entryDiv).find('input[type="hidden"]').val();
var contentdiv = $(entryDiv).next('.leaveRequestPopup');
var x = $(entryDiv).position().left + jQuery(entryDiv).outerWidth();
var y = $(entryDiv).position().top - jQuery(document).scrollTop();
$.ajax(
{
type: 'POST',
url: 'Request/GetCalendarDetails',
data: { id: entryId },
success: function (result) {
$(contentdiv).html(result);
$(contentdiv).dialog({
autoOpen: false,
modal: true,
title: 'Details',
width: 400,
height: 300,
draggable: false
});
$(contentdiv).dialog("option", "position", [x, y]);
$currentDialog = $(contentdiv).dialog('open');
}
});
}
</script>
答案 0 :(得分:0)
这是一个有效的陈述吗?
$currentDialog.dialog("close");
我认为此时它超出了范围。
也许如果你在$()。ready
之前定义它var $currentDialog;
$().ready(function () {
...
答案 1 :(得分:0)
您需要重置对话框。
contentdiv.dialog("destroy").dialog(....
注意:如果你这样做
var contentdiv = $(entryDiv).next('.leaveRequestPopup');
然后contentdiv已经是一个jQuery对象,所以你说的是:
contentdiv.click(function(){
//code here
});
您无需再次将其包装在$(contentdiv)中。
当你调用这个函数时:
getAndShowDialogContents(this);
它将作为参数传递原始文档对象,而不是jQuery,使用:
getAndShowDialogContents($(this));
传递当前的jQuery对象
答案 2 :(得分:0)
我认为周末为这个问题增添了新的视角。有效的代码如下。基本上,我没有在每个条目中使用弹出div,而是在页面末尾使用了一个div。每个对话框都重用该div。我使用全局变量,所以当有人点击对话框外面关闭它时,我可以引用它。希望这有助于其他人。
...
<div class="calDayContent">
@foreach (var content in day.Contents)
{
<div class="calDayContentEntry">
<input type="hidden" value="@content.Entry.Id" class="hiddenId" />
<div class="@content.DisplayClass">@content.Entry.Hours.ToString() hrs</div>
</div>
}
</div>
...
<div class="leaveRequestPopup"></div>
...
<script type="text/javascript">
$().ready(function () {
$('.calDayContentEntry').click(function () {
getAndShowDialogContents(this);
});
// Register close event for dialog if overlay is clicked
$('.ui-widget-overlay').live("click", function () {
//Close the dialog
$currentDialog.dialog("close");
});
$currentDialog = $('.leaveRequestPopup').dialog({
autoOpen: false,
modal: true,
title: 'Details',
width: 400,
height: 300,
draggable: false
});
});
function getAndShowDialogContents(entryDiv) {
var entryId = $(entryDiv).find('input[type="hidden"]').val();
var x = $(entryDiv).position().left + jQuery(entryDiv).outerWidth();
var y = $(entryDiv).position().top - jQuery(document).scrollTop();
$.ajax(
{
type: 'POST',
url: 'Request/GetCalendarDetails',
data: { id: entryId },
success: function (result) {
$currentDialog.html(result);
$currentDialog.dialog("option", "position", [x, y]);
$currentDialog.dialog('open');
}
});
}
</script>