2010-06-05 47 views
0

我想在n秒后显示对话框并在m秒后隐藏它,但它不适用于我!jquery对话框打开和关闭不起作用

$(document).ready(function() { 
    var advanced = $("div#advanced"); 
    $(advanced).dialog({ autoOpen: false, 
     modal: true, 
     buttons: { "Try it now": function() { window.location = 'myURL'; }, 
      "No thank's": function() { $(this).dialog("close"); } 
     }, 
     show: 'fade', 
     width: 350, 
     height: 130, 
     draggable: false, 
     resizable: false 
    }); 
    window.setTimeout(function() { 
     $(advanced).dialog("open"); 
    }, n); 
    window.setTimeout(function() { 
     $(advanced).dialog("close"); 
    }, m);}); 
+0

你知道它只会在(m - n)秒内打开吗?我没有看到其他问题...... – MvanGeest 2010-06-05 11:57:20

+1

把'advanced'设置为'$(“div#advanced”)''是多余的,然后总是把它称为'$(advanced)' - 这是一个不必要的函数调用 – Pointy 2010-06-05 11:59:38

回答

1

将setTimeout移动到打开对话框的定时器的回调中。您可能还想在对话框关闭时清除计时器。

$(function() { 
    var advanced = $("div#advanced"); 
    advanced.dialog({ autoOpen: false, 
     modal: true, 
     buttons: { "Try it now": function() { 
         window.location = 'myURL'; 
        }, 
      "No thank's": function() { 
         $(this).dialog("close");; 
        } 
     }, 
     close: clearTimer, 
     show: 'fade', 
     width: 350, 
     height: 130, 
     draggable: false, 
     resizable: false 
    }); 
    var closeTimer = null; 

    setTimeout(function() { 
     advanced.dialog("open"); 
     closeTimer = setTimeout(function() { 
      closeTimer = null; 
      advanced.dialog("close"); 
     }, m); 
    }, n); 

    function clearTimer() { 
     if (closeTimer) { 
      clearTimeout(closeTimer); 
      closeTimer = null; 
     } 
    } 

}); 
+0

确定您的方法词很好,但我想要一个像我自己的方法;) – Sadegh 2010-06-05 13:14:48

+0

@Sadegh - 除非打开,否则不需要关闭窗口。由于这些是依赖事件,因此关闭*的代码应取决于打开的对话框。您将它们设置为独立事件,并且如果您更改了到期时间以便第二个比第一个更长,则它将起作用,但这取决于数字是否正确。我的方式在对话框打开之前不会启动关闭计时器,然后它会在晚上关闭它,除非它已经被用户关闭。在打开的对话框中设置关闭计时器甚至可能会更好/更强大。 – tvanfosson 2010-06-05 14:00:44

+0

对不起,我明白你的意思是不好/不好的解决方案,事实上我不明白你的意思。感谢'你的更深入的解释 – Sadegh 2010-06-05 15:16:31

1

试着改变你的代码了一下,像这样:

$(document).ready(function() { 
    var advanced = $("div#advanced"); 
    advanced.dialog({ autoOpen: false, 
     modal: true, 
     buttons: { 
      "Try it now": function() { window.location = 'myURL'; }, 
      "No thank's": function() { $(this).dialog("close"); } 
     }, 
     show: 'fade', 
     width: 350, 
     height: 130, 
     draggable: false, 
     resizable: false 
    }); 
    setTimeout(function() { 
     advanced.dialog("open"); 
    }, n); 
    setTimeout(function() { 
     advanced.dialog("close"); 
    }, m); 
}); 

如尖在评论中指出的,你克隆advanced元素by wrapping it in $() again,这意味着元素你创建对话框上的元素试图打开它是单独的克隆,既不是原始的。直接使用advanced直接像我上面那样,它已经是一个jQuery对象:)

+0

@Nike ;-)再次感谢你的小英雄,你的位置是天堂 – Sadegh 2010-06-05 12:13:44

+1

我不认为它在这种情况下克隆jQuery元素实际上是有区别的,因为对话框重用了底层的DOM元素。如果小部件在DOM之外保持某种状态,那么它可能会,但重新创建对话框小部件应该没有关系。无论如何,在我的测试中似乎没有。我同意,一旦你创建了这个元素,你应该简单地使用它,但我不认为这是造成这个问题的原因。 – tvanfosson 2010-06-05 14:21:57