2012-03-21 108 views
0

我想运行一次回调函数,它应该运行,如果它删除所有具有某个类的元素,但由于某种原因,回调函数运行时间乘以元素数量这是删除,所以这不是我正在寻找。jQuery:如何让一个回调函数只运行一次

代码(形成一个插件)

 $.plugin= { 
     clear: function(str){ 

      $('.msg').fadeOut(200, function(){ 
       $(this).remove(); 
       if(typeof str.remove == 'function'){ 
        str.remove.call(this); 
       }   
      }); 
     } 
    } 
+0

我们需要看到更多的代码。除了别的以外,不知道'str'是指什么。 – maxedison 2012-03-21 12:19:34

+0

@ maxedison是正确的。我们需要知道的其中一件事是'.remove()'方法中包含的代码,以及它如何对给定的范围作出反应(因为你明确指出'.call()'在范围删除了元素[s])。 – JAAulde 2012-03-21 12:24:19

+0

我已经更新了代码,这是基本的插件部分。我已经将回调放在范围内,只有当元素被移除时它才应该运行。回叫可以包含某种用户使用的功能。 – user759235 2012-03-21 12:29:05

回答

2

最简单的方法是取消设置功能:

$('.msg').fadeOut(200, function(){ 
     $(this).remove(); 
     if(typeof str.remove == 'function'){ 
      str.remove.call(this); 
      str.remove = false; 
     }   
    }); 

JAAulde可能是正确的。 下面的代码调用回调与所有的.msg元素:

var $msgs = $('.msg').fadeOut(200, function(){ 
     $(this).remove(); 
     if(typeof str.remove == 'function'){ 
      str.remove.call($msgs); 
      str.remove = false; 
     }   
    }); 

注意$('.msg')慢(特别是在IE 7及以下)和没有标记不应当被使用。 的原因是,他们不支持document.querySelectorAll(麦克庚说)

+0

类选择器一般?或者什么是慢? – jgauffin 2012-03-21 12:21:26

+0

为什么它慢?是否因为缺少querySelectorAll? – 2012-03-21 12:21:55

+1

http://www.artzstudio.com/2009/04/jquery-performance-rules/#use-tags-before-classes – jantimon 2012-03-21 12:22:12

0

我建议另一种方法:因为您可能需要再次使用该功能后,我不想重写功能,但称这只是一次

var l = $('.msg').length; 
$('.msg').fadeOut(200, function(){ 
    $(this).remove(); 
    if((--l === 0) && typeof str.remove == 'function'){ 
     str.remove.call(this); 
    }   
}); 

,如果你要一次执行两个功能只写

var l = $('.msg').length; 
$('.msg').fadeOut(200, function(){ 
    if (--l === 0) { 
     $(this).remove(); 
     if(typeof str.remove == 'function'){ 
      str.remove.call(this); 
     } 
    }   
}); 
1

这应该做的任务:

var msgs = $('.msg').fadeOut(200); 
    msgs.promise().done(function(){ 
     msgs.remove(); 
     if(typeof str.remove == 'function'){ 
      str.remove.call(this); 
     }   
    }); 

请参阅http://api.jquery.com/fadeOut/#callback-functionhttp://api.jquery.com/promise/。我不确定this在完成的回调中指的是什么,所以我确定了一个额外的变量。

+0

我不知道promise的API,所以我会看看它,看看它是什么。 – user759235 2012-03-21 13:45:36

+0

这是解决你的问题所做的事情:-)好的,不,[Deferred](http://api.jquery.com/category/deferred-object/)是一个更好的概念,但在这里使用很好。 – Bergi 2012-03-21 15:49:38

+0

是的,它很好地使用了promise():+1 – fcalderan 2012-03-21 17:21:28

0

我已经使用了下一段代码(正如Ghommey指出我的简单虚假陈述)。

$.plugin= { 
    clear: function(str){ 

     $('.msg').fadeOut(200, function(){ 
      $(this).remove(); 
      if(typeof str.remove == 'function'){ 
       str.remove.call(this); 
       str.remove = false; 
      }   
     }); 
    } 
}