【问题标题】:Jquery dialog only opening onceJquery对话框只打开一次
【发布时间】:2009-11-25 02:11:43
【问题描述】:

所有- 我知道有人问过这个问题,但以前的解决方案似乎不适用于我的情况。

我有一个简单的表,每行有许多记录,最后一列是删除超链接。我正在尝试使用对话框弹出并确认删除。如果我使用对话框所在的 div 的显式名称(我将它正好定位在表格所在的 div 上方的一个 div 上),这将非常有效。我首先使用破坏,这似乎解决了“只打开一次”问题,只要我命名对话框 div。我正在尝试通用化代码,因此我宁愿避免明确命名对话框所在的 div,而是参考 prev div。这第一次有效,但随后的点击无效:

<code>
   $(".deleteLinkDiag a").livequery('click',function() {

    var myParent = $(this).parents("div:eq(0)"); //container div to be replaced
    var myDiag   = $(myParent).prev("div");     //one div before container div
    var urlLoad = $(this).attr("href");
    $(myDiag).dialog('destroy');
    $(myDiag).dialog({ 
            bgiframe: true,
            resizable: false,
            height:140,
            modal: true,
            autoOpen: false,
            overlay: {
                backgroundColor: '#000',
                opacity: 0.5
            },
            buttons: {
                    "Confirmz":function() 
                    { 
                        myParent.load(urlLoad, function() { });
                        $(this).dialog("close");
                     },
                    Cancel: function() 
                    {  
                        $(this).dialog("close");
                    }
            },
            //close: function(ev, ui) { $(this).dialog('destroy');}
      });
     $(myDiag).dialog('open');
return false;
});
</code>

有什么想法吗?

【问题讨论】:

  • var myDiag = $(myParent).prev("div"); 是否总是为每个按钮选择不同的 div,还是总是选择相同的 div?
  • 你能在某处上传一个例子来证明这对你不起作用吗?我发现很难想象
  • 当然:163.150.129.104/j/index.php 所以我们的想法是,有两个数据表,每个数据表的每一行都有一个唯一的删除列,每个数据表在表 div 之前都有一个不同的对话框。工程第一次弹出对话框,但不是在那之后。如果我将类的名称放在对话框(“打开”)中,它可以正常工作,但我希望能够只针对一个 div 而不制作该函数的多个副本。
  • 只是为了回答 dcneiner 的问题:myDiag 第一次选择了正确的 div。单击链接的所有后续时间都返回未定义。我的猜测是,在打开对话框的过程中,div 在 DOM 中的位置实际上被移动了,所以它不再是“prev”或“prevAll”。奇怪的是我在关闭时运行破坏,所以应该将 div 设置回它以前的位置,使我能够用 prev 抓住它。

标签: jquery jquery-ui dialog


【解决方案1】:

好的,所以希望这会帮助别人。我实际上遇到了两个问题:

  1. 如果您不销毁 dialog(),那么它就不会以旧名称真正存在于 DOM 中。这就是为什么第二次总是未定义的原因。
  2. 即使您确实销毁了对话框,您仍然找不到它。这是因为当对话框 理论上 将其返回到预初始化状态时,它通过将其放在 DOM 底部的 body 标记之前来实现。因此,它不再位于 "prev" 或 "prevAll" 中。

我只是通过将对话框的名称设置为与调用 div 相同,并附加“Diag”来解决此问题。然后无论 jquery 把它放在哪里,我都可以跟踪它。呼。

$(".deleteLinkDiag a").livequery('click',function() {
            var urlLoad = $(this).attr("href");
            var myParent = $(this).parents("div:eq(0)"); //container div to be replaced
            var myDiag = myParent.attr('id') + 'Diag';
            $("#" + myDiag).dialog({
                    bgiframe: true,
                            resizable: false,
                            height:140,
                            modal: true,
                            autoOpen: false,
                            overlay: {
                                    backgroundColor: '#000',
                                    opacity: 0.5
                            },
                    buttons: {
                                    "Confirm":function()
                                    {
                                            myParent.load(urlLoad, function() { });
                                            $(this).dialog("close");
                                     },
                                    Cancel: function()
                                    {
                                            $(this).dialog("close");
                                    }
                              },
                    close: function(ev, ui) {
                            $(this).dialog("destroy");
                    }
      });
     $("#" + myDiag).dialog('open');
    return false;
    });

【讨论】:

    【解决方案2】:

    问题似乎很可能在于实际对话框 div 没有被正确选择。这(据我了解情况)源于您的错误要求的更大问题。

    如果你想引用一个特定的 div,那么你应该引用那个特定的 div。然而,我听到你说你想引用一个特定的 div(它实际上是唯一用作对话框的 div),同时你说你害怕通过 ID 引用该 div。

    基本上,如果只有一个 div 用作对话框,那么就接受它并为该 div 命名:

    <div id="dialog"/>
    

    .

    myDiag = $('#dialog');
    

    这样就不会混淆您是否选择了正确的 div。

    但是,如果由于某种原因我所说的不是一个选项,那么您可以在分配 myDiag 的位置在 firebug 中设置断点,这样您就可以看到 myDiag 在执行时实际上是什么。

    【讨论】:

    • 感谢您的回复。我不想通过 ID 引用特定 div 的原因是因为我希望能够在多个页面上通用地使用此功能(甚至可能在同一页面上使用多组删除按钮),所以 div id可以改变。我会用 Firebug 试试你的建议。
    猜你喜欢
    • 2010-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多