Jquery对话框只打开一次

全部 – 我知道这已被问到,但之前的解决方案似乎并不适用于我的情况。

我有一个简单的表,每行有许多记录,最后一列是删除超链接。 我正在尝试使用该对话框弹出并确认删除。 如果我使用对话框所在的div的显式名称(我将它恰好位于表所在的div上方的一个div),这可以完美地工作。 我首先使用一个破坏似乎解决了“只打开一次”的问题,只要我命名对话框div。 我正在尝试使代码通用化,所以我宁愿远离显式命名对话框所在的div,而是参考prev div。 这是第一次使用,但后续点击不会:

 $(".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; });  

有任何想法吗?

好的,所以希望这将有助于未来的人。 我实际上有两个问题:

  1. 如果你不破坏对话框(),那么它在旧名称下的DOM中并不存在。 这就是为什么第二次总是未定义的原因。
  2. 即使你破坏了对话框,你仍然无法找到它。 那是因为当对话理论上将它返回到pre-init状态时,它通过将它放在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; }); 

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

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

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

 

 myDiag = $('#dialog'); 

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

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