jQuery对话框仅显示第一次

时间:2012-05-04 23:02:34

标签: c# asp.net-mvc-3 jquery-ui jquery

有一个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>

3 个答案:

答案 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>