jQuery-UI对话框-寻找定时关闭的智能解决方案

jQuery-UI对话框-寻找定时关闭的智能解决方案,jquery,jquery-ui,dialog,Jquery,Jquery Ui,Dialog,我写了以下内容: // Called with setTimeout(magicDialogDelayedClose, 2500); function magicDialogDelayedClose() { $(".ui-dialog").fadeOut(function() { dialog_general.dialog('close'); }); } 当我显示要在2.5秒内自动关闭的通知对话框时,使用setTimeout调用上述内容 我注意到的问题是,如果

我写了以下内容:

// Called with setTimeout(magicDialogDelayedClose, 2500);
function magicDialogDelayedClose() {
    $(".ui-dialog").fadeOut(function() {
        dialog_general.dialog('close');
    }); 
}
当我显示要在2.5秒内自动关闭的通知对话框时,使用setTimeout调用上述内容

我注意到的问题是,如果用户手动关闭对话框,这个计时器仍然在运行。如果用户随后打开一个新对话框(这是很有可能的),则计时器可以关闭该新对话框

处理这个问题的聪明方法是什么?通过将超时存储在变量中,然后使用
clearTimeout()
方法,可以清除超时(停止触发超时):

var timeout = setTimeout(magicDialogDelayedClose, 200);
clearTimeout(timeout);
因此,如果有人手动关闭了您的对话框,则停止超时,然后

清除超时的安全方法是在执行此操作之前确定
timeout
是否为空:

function safeClearTimeout(timeout) {
    if (timeout != null)
        clearTimeout(timeout);
}
通过将超时存储在变量中,然后使用
clearTimeout()
方法,可以清除超时(停止触发超时):

var timeout = setTimeout(magicDialogDelayedClose, 200);
clearTimeout(timeout);
因此,如果有人手动关闭了您的对话框,则停止超时,然后

清除超时的安全方法是在执行此操作之前确定
timeout
是否为空:

function safeClearTimeout(timeout) {
    if (timeout != null)
        clearTimeout(timeout);
}

粗略地说,在您的情况下,您不希望有一个全局应用的函数。您希望在每个对话框出现时对其进行排队关闭。从1.4版开始,jQuery已经实现了实现这一点的功能。它向动画队列中添加一个空操作,以便后续链接的动画函数在队列延迟之后出现

将按以下方式实施:

function insertDialog() {
  // substitute your insertion code here
  var d = $('<div class="ui-dialog"></div>').appendTo($('#dialog_area'));

  // add a 2.5s delay into the animation queue, then add
  // a fadeOut with $(this).close() as a callback
  d.delay(2500).fadeOut(function(){ $(this).close() });
}
函数插入对话框(){
//在此处替换插入代码
变量d=$('').appendTo($('#对话框区域');
//在动画队列中添加2.5s延迟,然后添加
//以$(this).close()作为回调的淡出
d、 delay(2500).fadeOut(函数(){$(this.close()});
}

粗略地说,在您的情况下,您不希望有一个全局应用的函数。您希望在每个对话框出现时对其进行排队关闭。从1.4版开始,jQuery已经实现了实现这一点的功能。它向动画队列中添加一个空操作,以便后续链接的动画函数在队列延迟之后出现

将按以下方式实施:

function insertDialog() {
  // substitute your insertion code here
  var d = $('<div class="ui-dialog"></div>').appendTo($('#dialog_area'));

  // add a 2.5s delay into the animation queue, then add
  // a fadeOut with $(this).close() as a callback
  d.delay(2500).fadeOut(function(){ $(this).close() });
}
函数插入对话框(){
//在此处替换插入代码
变量d=$('').appendTo($('#对话框区域');
//在动画队列中添加2.5s延迟,然后添加
//以$(this).close()作为回调的淡出
d、 delay(2500).fadeOut(函数(){$(this.close()});
}

另一个转折点,很忙,所以只在FireFox中尝试过,但效果不错

$('#dialogBox').html("Put some text message here.").dialog("open").delay(2500).fadeOut(function(){ $(this).dialog("close") });

另一个转折点,很忙,所以只在FireFox中尝试过,但效果很好

$('#dialogBox').html("Put some text message here.").dialog("open").delay(2500).fadeOut(function(){ $(this).dialog("close") });

我非常喜欢这个主意。问题是,若并没有设置超时,你们会得到一个未捕获的引用错误:对话框\并没有设置超时defined@AnApprentice然后在清除它之前检查它是否为null?如果为true,我只是设置了一个全局var超时。这就成功了。这是一个很好的解决方案。谢谢再过7分钟我就接受不了了(我讨厌stackoverflow。@anaprentice:为了便于将来参考,您可以在代码开头定义未定义的错误,或者通过
window.dialog\u timeout
显式查看
窗口中的
名称空间。不过,根据您的ultimat,这样的全局超时可能是次优的e希望。有关在插入函数中实现闭包的方法,请参阅我的解决方案。Marcus的解决方案虽然有效,但如果对话框B在+1s处插入,则在+0s处插入的对话框a在+3s之前不会关闭,这可能是您想要的,也可能不是您想要的。@AnApprentice:
magicDialogDelayedClose“全局”函数用词不当,但它的意思是,当且仅当调用
magic…
时,匹配其选择器的所有项都将关闭(由您的实现)。特定对话框不会独立于其他对话框关闭。如果您的延迟为2秒,并且它会在短于此的时间间隔内重置(例如,每1.5秒显示一个新对话框),越来越多的对话框中没有一个会关闭。Marcus和我的解决方案都有一个位置和时间,但了解两者的区别是很有帮助的。我非常喜欢这个想法。问题是,如果没有设置超时,你会得到一个未捕获的引用错误:dialog\u timeout不是defined@AnApprentice然后检查它是否为空在清除它之前?是的,我刚刚设置了一个全局变量超时。这就成功了。这是一个很好的解决方案。谢谢!我不能再接受7分钟了(我讨厌stackoverflow。@anaprentice:为了便于将来参考,您可以在代码开头定义未定义的错误,或者通过
window.dialog\u timeout
显式查看
窗口中的
名称空间。不过,根据您的ultimat,这样的全局超时可能是次优的e希望如此。有关在插入函数中实现闭包的方法,请参阅我的解决方案。Marcus的解决方案虽然有效,但如果对话框B在+1s处插入,则在+0s处插入的对话框a在+3s之前不会关闭,这可能是您想要的,也可能不是您想要的。@AnApprentice:
magicDialogDelayedClose
从这个意义上讲,作为一个“全局”函数用词不当,但它的意思是,当且仅当调用
magic…
时,匹配其选择器的所有项都将关闭(由您的实现)。特定对话框不会独立于其他对话框关闭。如果您的延迟为2秒,并且它会在短于此的时间间隔内重置(例如,每1.5秒显示一个新的对话框),越来越多的对话框都不会关闭。Marcus和我的解决方案都有一个位置和时间,但是能够知道它们之间的区别是很有帮助的。你能给我们看一下你的通知对话框代码吗?呼叫和上述代码所在的位置吗?你能给我们看一下你的通知吗