Jquery对话框只打开一次

时间:2009-11-25 02:11:44

标签: jquery jquery-ui dialog

清一色 我知道这已被问过,但以前的解决方案似乎并不适用于我的情况。

我有一个简单的表,每行有许多记录,最后一列是删除超链接。我正在尝试使用该对话框弹出并确认删除。如果我使用对话框所在的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>

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

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

  1. 如果你不破坏对话框(),那么它在旧名称下的DOM中并不存在。这就是为什么第二次总是未定义的原因。
  2. 即使你破坏对话框,你仍然找不到它。那是因为当对话框理论上将它返回到pre-init状态时,它会通过将它放在body标签之前的DOM底部来实现。所以,它不再是“prev”或“prevAll”。
  3. 我通过将对话框的名称设置为与调用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;
        });
    

答案 1 :(得分:0)

问题似乎很可能是因为实际上没有正确选择实际的对话框div。而且(据我了解情况而言)源于你的错误要求的更大问题。

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

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

<div id="dialog"/>

myDiag = $('#dialog');

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

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