【问题标题】:jQuery Dialog Only Shows First TimejQuery 对话框只显示第一次
【发布时间】:2012-05-04 23:02:34
【问题描述】:

遇到 j​​Query 对话框问题。当有人单击 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>

【问题讨论】:

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


    【解决方案1】:

    这是一个有效的陈述吗?

    $currentDialog.dialog("close");
    

    我认为在这一点上它超出了范围。

    也许如果你在 $().ready 之前定义它

    var $currentDialog;
    $().ready(function () {
      ...
    

    【讨论】:

    • 在这种情况下它是一个全局变量,所以它在范围内。尽管如此,这仍然不是一件好事。
    • 我使用全局变量,所以当点击覆盖时我可以访问对话框,这允许用户点击页面上的任意位置来关闭对话框。如果有更好的方法来做到这一点,请告诉我。我发布了对此问题的解决方案,如果您可以使用该解决方案更正全局变量的使用,将不胜感激,我只是不知道该怎么做。
    【解决方案2】:

    您需要重置对话框。

    contentdiv.dialog("destroy").dialog(....
    

    注意:如果你这样做了

     var contentdiv = $(entryDiv).next('.leaveRequestPopup');
    

    那么 contentdiv 已经是一个 jQuery 对象,所以你可以这样说:

    contentdiv.click(function(){
      //code here
    });
    

    您无需再次将其包装在 $(contentdiv) 中。

    当你调用这个函数时:

    getAndShowDialogContents(this);
    

    它将作为参数传递原始文档对象,而不是 jQuery 对象,使用:

    getAndShowDialogContents($(this));
    

    传递当前的jQuery对象

    【讨论】:

    • 我认为双句点存在语法错误。
    • 谢谢,不管怎样,你帮助了更多人注意错字,然后是那些投反对票的代码(没有错字)有效的sn-p
    • 感谢您的回答,但我想我错过了我在代码中调用破坏的地方。我会在创建对话框之前在我的 ajax 成功函数中销毁它吗?
    • 另外,感谢有关传递 jQuery 对象的提示。我应该更清楚,我会适当地修复我的代码。
    • 感谢您的帮助,但我解决了我的问题并发布了完整的解决方案。当我只需要重用一个 div 时,我试图在我的解决方案中使用多个 div。原始 div 丢失了,我无法重复使用它们。
    【解决方案3】:

    我认为周末为这个问题增添了新的视角。有效的代码如下。基本上,我没有为每个条目使用弹出 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>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-05
      • 1970-01-01
      • 2023-04-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多