【问题标题】:JQuery Dialog - NOT OPENING Second TimeJQuery 对话框 - 第二次未打开
【发布时间】:2011-06-08 12:55:18
【问题描述】:

StackOverflow 上有几篇关于这个主题的帖子,但没有一个答案对我有帮助。 我正在使用由 SELECT 通过 DataAdapter 填充的 DataList 控件。 一个概念,建议只打开一个对话框实例,但不能应用此方法

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>

【问题讨论】:

标签: jquery-ui modal-dialog jquery-ui-dialog


【解决方案1】:

想象一下这个 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>
                    &nbsp;
                </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;),因此您无需执行任何类似操作。

【讨论】:

    【解决方案2】:

    通常只需在关闭时销毁对话框即可解决问题。

    $( "#dialogbox" ).dialog({ 
        close: function (event, ui) {
            $(this).dialog("destroy");
        }
    });
    

    【讨论】:

      【解决方案3】:

      当对话框显示时,它会从标记流中消失。因此,当您致电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>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-01-27
        • 1970-01-01
        • 1970-01-01
        • 2011-08-31
        相关资源
        最近更新 更多