2009-11-25 142 views
0

全部- 我知道这个问题,但以前的解决方案似乎并不适用于我的情况。jquery对话框只能打开一次

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

任何想法?

+0

'var myDiag = $(myParent).prev(“div”);'总是为每个按钮选择不同的div,还是总是选择相同的div? – 2009-11-25 02:24:44

+0

你可以上传一个例子来说明这不适合你吗?我发现很难想像 – 2009-11-25 03:15:31

+0

确实如此:http://163.150.129.104/j/index。php 所以这个想法是,有两个数据表,每个数据表具有一个唯一的每行删除列,并且每个在表格div之前都有一个不同的对话框。第一次弹出对话框,但不是在此之后。如果我把对话框中的类的名称(“打开”),它的工作正常,但我希望能够只有一个div没有做这个函数的多个副本。 – EvilPluto 2009-11-25 17:15:02

回答

2

好吧,所以希望这会帮助一些人在路上。我实际上遇到了两个问题:

  1. 如果您不'销毁对话框(),那么它在旧名称下并不存在于DOM中。这就是为什么第二次总是未定义的原因。
  2. 即使您销毁对话框,您仍然无法找到它。这是因为当对话框理论上将其返回到预初始状态时,它会通过将其放在body标签之前的DOM底部来执行此操作。因此,它不再处于“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; 
    }); 
0

这似乎最有可能的问题在于实际的对话框div实际上没有被正确选择的事实。而且(就我所了解的情况而言)源于你的错误要求的更大问题。

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

基本上,如果只有一个,这些会用来作为对话格,然后接受并调用该分区的名称:

<div id="dialog"/> 

myDiag = $('#dialog'); 

这样就不会混淆如果你选择正确的div。但是,如果我所说的不是某种原因的选项,那么您可以在指定myDiag的位置设置萤火虫的中断点,以便您可以看到myDiag实际上处于执行时间。

+0

感谢您的回复。我不想通过ID来引用特定div的原因是因为我希望能够在多个页面上一般使用此功能(甚至可能在同一页面上有多组删除按钮),因此div ID可能会改变。我会试着用Firebug的建议。 – EvilPluto 2009-11-25 05:57:52