首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用stop()加快Jquery ()

使用stop()加快Jquery ()
EN

Stack Overflow用户
提问于 2014-07-14 21:15:07
回答 2查看 76关注 0票数 2

以下是我的问题:

http://jsfiddle.net/5c8ZL/

我有三个按钮:

代码语言:javascript
复制
<button>Button A</button>
<button>Button B</button>
<button>Button C</button>

每个按钮都会触发一些AJAX来提取数据,并根据响应进行响应。

如果没有返回数据,则会显示一个错误警报,延迟淡出,如下所示:

代码语言:javascript
复制
if ( no_data )
{
    $error.show().delay(6000).fadeoutOut("slow");
}
else 
{
    // we have data, do some stuff
}

因此,如果Button B没有返回任何数据并显示警报,并且我很快单击了包含数据的Button C,则错误警报将一直保持到延迟完成,这不是有意的。

我尝试将一个隐藏函数添加到else块中:

代码语言:javascript
复制
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(快速),之前的延迟仍然在动画队列中,并且几乎立即删除警报。

有没有办法使:

代码语言:javascript
复制
if ( no_data )
{
    $error.show().delay(6000).fadeOut("slow");
}
else 
{
    // kill the previous fadeOut, then...

    $error.hide();

    // do other stuff
}

我尝试添加停止函数:

代码语言:javascript
复制
$error.stop(true, true).hide();

但看起来还是不起作用。我认为这是因为队列中没有动画是由于延迟造成的,所以停止函数永远不会实际删除任何内容。

我做错了什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-07-14 21:44:47

setTimeout()和clearTimeout()可以修复这个问题:

代码语言:javascript
复制
    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);
    });
票数 2
EN

Stack Overflow用户

发布于 2014-07-14 21:31:17

您是否尝试过使用dequeue()来中断delay()函数?

你可以试试这样的方法:

代码语言:javascript
复制
 if ( no_data ){
   $error.show().delay(6000).fadeOut("slow");
 }else{
   // kill the previous fadeOut, then...

   $error.dequeue();

   // do other stuff
 }

在您的代码中,它应该如下所示:

代码语言:javascript
复制
 $c.on('click', function(e) {
   $x.hide();
   $x.dequeue();
 });

尽管如此,我认为最好有一个状态机,您可以跟踪显示错误的状态,并且只在错误淡出事件完成时启用按钮A、B和C。您可以在没有显示错误时启用按钮,但当检测到错误时,可以使用setTimeout函数在6000 is时间内禁用这些按钮。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24746103

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档