我想只运行一次回调函数,如果它删除了某个类的所有元素,它应该运行,但由于某种原因,回调函数运行次数被删除的元素数量,所以这不是我正在寻找的对
代码(形成一个插件)
$.plugin= {
clear: function(str){
$('.msg').fadeOut(200, function(){
$(this).remove();
if(typeof str.remove == 'function'){
str.remove.call(this);
}
});
}
}
答案 0 :(得分:2)
最简单的方法是取消设置功能:
$('.msg').fadeOut(200, function(){
$(this).remove();
if(typeof str.remove == 'function'){
str.remove.call(this);
str.remove = false;
}
});
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(正如Mike G所说)
答案 1 :(得分: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-function和http://api.jquery.com/promise/。我不确定this
在完成的回调中引用了什么,所以我使用另一个变量确定了引用。
答案 2 :(得分: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);
}
}
});
答案 3 :(得分:0)
我使用了下一段代码(正如Ghommey指出我的简单错误陈述)。
$.plugin= {
clear: function(str){
$('.msg').fadeOut(200, function(){
$(this).remove();
if(typeof str.remove == 'function'){
str.remove.call(this);
str.remove = false;
}
});
}
}