用stop()加速Jquery延迟()

时间:2014-07-14 21:15:07

标签: jquery

这里有一个问题:

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
}

因此,如果按钮B 没有返回任何数据并显示警告,我会快速点击确实有数据的按钮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
}

很好,所以现在成功的查询会删除警报(如果已显示)。但是,如果(如上所述)我单击按钮B,得到错误(触发警报),然后单击按钮C并删除警报...然后我再次(快速)单击按钮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();

但它似乎仍然不起作用。我假设这是因为由于延迟导致队列中没有动画,所以stop函数实际上从未删除任何内容。

我做错了什么?

2 个答案:

答案 0 :(得分:2)

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);
    });

答案 1 :(得分:1)

您是否尝试过使用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函数禁用6000ms时间的按钮。