以下是我的问题:
http://jsfiddle.net/5c8ZL/
我有三个按钮:
<button>Button A</button>
<button>Button B</button>
<button>Button C</button>每个按钮都会触发一些AJAX来提取数据,并根据响应进行响应。
如果没有返回数据,则会显示一个错误警报,延迟淡出,如下所示:
if ( no_data )
{
$error.show().delay(6000).fadeoutOut("slow");
}
else
{
// we have data, do some stuff
}因此,如果Button B没有返回任何数据并显示警报,并且我很快单击了包含数据的Button C,则错误警报将一直保持到延迟完成,这不是有意的。
我尝试将一个隐藏函数添加到else块中:
if ( no_data )
{
$error.show().delay(6000).fadeOut("slow");
}
else
{
$error.hide(); // we don't want the alert to keep showing
// we have data, do some stuff
}很好,所以现在一个成功的查询如果显示了警报,就会删除它。但是,如果(如前所述)我单击Button B,得到一个错误(警报被触发),然后单击Button C并删除警报.然后我再次单击Button B(快速),之前的延迟仍然在动画队列中,并且几乎立即删除警报。
有没有办法使:
if ( no_data )
{
$error.show().delay(6000).fadeOut("slow");
}
else
{
// kill the previous fadeOut, then...
$error.hide();
// do other stuff
}我尝试添加停止函数:
$error.stop(true, true).hide();但看起来还是不起作用。我认为这是因为队列中没有动画是由于延迟造成的,所以停止函数永远不会实际删除任何内容。
我做错了什么?
发布于 2014-07-14 21:44:47
setTimeout()和clearTimeout()可以修复这个问题:
var $a = $('#btn-a');
var $b = $('#btn-b');
var $c = $('#btn-c');
var $x = $('#alert');
var timerHandle;
$a.on('click', function (e) {
$x.show();
timerHandle = setTimeout(function () {
$x.fadeOut("slow");;
}, 6000);
});
$b.on('click', function (e) {
$x.show();
timerHandle = setTimeout(function () {
$x.fadeOut("slow");;
}, 6000);
});
$c.on('click', function (e) {
$x.hide();
clearTimeout(timerHandle);
});发布于 2014-07-14 21:31:17
您是否尝试过使用dequeue()来中断delay()函数?
你可以试试这样的方法:
if ( no_data ){
$error.show().delay(6000).fadeOut("slow");
}else{
// kill the previous fadeOut, then...
$error.dequeue();
// do other stuff
}在您的代码中,它应该如下所示:
$c.on('click', function(e) {
$x.hide();
$x.dequeue();
});尽管如此,我认为最好有一个状态机,您可以跟踪显示错误的状态,并且只在错误淡出事件完成时启用按钮A、B和C。您可以在没有显示错误时启用按钮,但当检测到错误时,可以使用setTimeout函数在6000 is时间内禁用这些按钮。
https://stackoverflow.com/questions/24746103
复制相似问题