【问题标题】:jQuery UI Dialog Box - does not open after being closedjQuery UI 对话框 - 关闭后不打开
【发布时间】:2010-09-26 21:09:23
【问题描述】:

jquery-ui dialog box 有问题。

问题是当我关闭对话框然后点击触发它的链接时,除非我刷新页面,否则它不会再次弹出。

如何在不刷新实际页面的情况下回调对话框。

下面是我的代码:

$(document).ready(function() {
    $('#showTerms').click(function()
    {
        $('#terms').css('display','inline');
        $('#terms').dialog({
            resizable: false,
            modal: true,
            width: 400,
            height: 450,
            overlay: { backgroundColor: "#000", opacity: 0.5 },
            buttons:{ "Close": function() { $(this).dialog("close"); } },
            close: function(ev, ui) { $(this).remove(); },
    }); 
});

谢谢

【问题讨论】:

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


    【解决方案1】:

    您实际上应该使用$("#terms").dialog({ autoOpen: false }); 来初始化它。 然后你可以用$('#terms').dialog('open');打开对话框,$('#terms').dialog('close');关闭它。

    【讨论】:

    • 这非常有效。 jQuery UI 文档在这里不是很清楚。但是dialog 函数用于初始化、显示和隐藏的想法对我来说很有意义。谢谢。
    • 如果您从可以动态更改的 HTML 加载此对话框,那么它为什么不起作用是非常不直观的。有人有什么好的解决方案可以普遍适用于这些情况吗?
    • @Milimetric 您可以随时使用 $(this).remove();函数在每个对话框按钮的末尾,这样当你再次调用它时,整个对话框将从头开始完全重新制作。请注意,此函数的作用不同于 $(this).dialog("destroy");因为它只会将对话框设置回其初始化前状态,而不会破坏对象。
    【解决方案2】:

    我解决了。

    我使用了destroy而不是close函数(它没有任何意义),但它起作用了。

    $(document).ready(function() {
    $('#showTerms').click(function()
    {
        $('#terms').css('display','inline');
        $('#terms').dialog({resizable: false,
            modal: true,
            width: 400,
            height: 450,
            overlay: { backgroundColor: "#000", opacity: 0.5 },
            buttons:{ "Close": function() { $(this).dialog('**destroy**'); } },
            close: function(ev, ui) { $(this).close(); },
        });         
    });   
    $('#form1 input#calendarTEST').datepicker({ dateFormat: 'MM d, yy' });
    });
    

    【讨论】:

    • 如果你使用该方法,Destroy 将起作用,但要使 close() 起作用,首先实例化对话框,然后使用 dialog.show() 显示它,然后使用 dialog.close() 关闭它,它会毫无问题地重新打开。
    • 差不多。你先初始化它是对的,但在那之后它是 .dialog("open") 和 .dialog("close")
    【解决方案3】:

    在最后一行,不要使用$(this).remove(),而是使用$(this).hide()

    编辑:澄清一下,在关闭单击事件中,您正在从 DOM 中删除 #terms div,这就是它不回来的原因。你只需要隐藏它。

    【讨论】:

      【解决方案4】:

      我相信你只能初始化对话框一次。上面的示例尝试在每次单击#terms 时初始化对话框。这会导致问题。相反,初始化应该发生在点击事件之外。您的示例应该如下所示:

      $(document).ready(function() {
          // dialog init
          $('#terms').dialog({
              autoOpen: false,
              resizable: false,
              modal: true,
              width: 400,
              height: 450,
              overlay: { backgroundColor: "#000", opacity: 0.5 },
              buttons: { "Close": function() { $(this).dialog('close'); } },
              close: function(ev, ui) { $(this).close(); }
          });
          // click event
          $('#showTerms').click(function(){
              $('#terms').dialog('open').css('display','inline');      
          });
          // date picker
          $('#form1 input#calendarTEST').datepicker({ dateFormat: 'MM d, yy' });
      });
      

      我在想,一旦你把它弄清楚了,它应该可以解决你描述的“从链接打开”问题。

      【讨论】:

        【解决方案5】:

        对我来说,这种方法有效:

        可以通过单击对话框上的 X 或单击“注意”来关闭对话框。我正在添加一个(任意)id,因为我需要确保添加到 dom 的每一位 html 都在之后被删除。

        $('<div id="dossier_edit_form_tmp_id">').html(data.form)
        .data('dossier_id',dossier_id)
        .dialog({
                title: 'Opdracht wijzigen',
                show: 'clip',
                hide: 'clip',
                minWidth: 520,
                width: 520,
                modal: true,
                buttons: { 'Bewaren': dossier_edit_form_opslaan },
                close: function(event, ui){ 
                                          $(this).dialog('destroy'); 
                                          $('#dossier_edit_form_tmp_id').remove();
                       }
        });
        

        【讨论】:

          【解决方案6】:
           <button onClick="abrirOpen()">Open Dialog</button>
          
          <script type="text/javascript">
          var $dialogo = $("<div></div>").html("Aqui tu contenido(here your content)").dialog({
                 title: "Dialogo de UI",
                 autoOpen: false,
                 close: function(ev, ui){
                         $(this).dialog("destroy");
                 }
           function abrirOpen(){
                 $dialogo.dialog("open");
           }
          });
          
          //**Esto funciona para mi... (this works for me)**
          </script>
          

          【讨论】:

            【解决方案7】:

            这是一个超级旧的帖子,但由于答案甚至说“这没有任何意义”,我想我会添加答案......

            原帖使用 $(this).remove();在关闭处理程序中,这实际上会从 DOM 中删除对话框 div。尝试再次初始化对话框将无法正常工作,因为 div 已被删除。

            使用 $(this).dialog('destroy') 调用对话框对象中定义的方法destroy,不会将其从 DOM 中删除。

            来自文档:

            销毁()

            完全删除对话框功能。这会将元素返回到其 >>pre-init 状态。 此方法不接受任何参数。

            也就是说,只有在你有充分理由的情况下才销毁或移除。

            【讨论】:

              【解决方案8】:
              $(this).dialog('destroy');
              

              有效!

              【讨论】:

                【解决方案9】:

                .close() 更通用,可用于引用更多对象。 .dialog('close') 只能与对话框一起使用

                【讨论】:

                  【解决方案10】:

                  我将对话框用作对话框文件浏览器和上传器,然后我像这样重写代码

                  var dialog1 = $("#dialog").dialog({ 
                                autoOpen: false, 
                                height: 480, 
                                width: 640 
                  }); 
                  $('#tikla').click(function() {  
                      dialog1.load('./browser.php').dialog('open');
                  });   
                  

                  一切似乎都很好。

                  【讨论】:

                    【解决方案11】:

                    我在 jquery-ui 覆盖对话框中遇到了同样的问题 - 它只会工作一次然后停止,除非我重新加载页面。我在他们的一个例子中找到了答案 -
                    同一页面上的多个叠加层
                    flowplayer_tools_multiple_open_close
                    - 谁会,对吧? :-) -

                    重要的设置似乎是

                    oneInstance: false
                    

                    所以,现在我有这样的 -

                    $(document).ready(function() {
                    
                     var overlays = null;
                    
                     overlays = jQuery("a[rel]");
                    
                     for (var n = 0; n < overlays.length; n++) {
                    
                        $(overlays[n]).overlay({
                            oneInstance: false, 
                            mask: '#669966',
                            effect: 'apple',
                            onBeforeLoad: function() {
                                overlay_before_load(this);
                            }
                        });
                    
                      }
                    
                    }
                    

                    一切正常

                    希望这对某人有帮助

                    哦。

                    【讨论】:

                      【解决方案12】:

                      jQuery 文档有指向这篇文章的链接 'Basic usage of the jQuery UI dialog' 这解释了这种情况以及如何解决它。

                      【讨论】:

                        猜你喜欢
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 2012-11-10
                        • 2012-12-04
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        相关资源
                        最近更新 更多