Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/379.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript jQuery:如何让回调函数只运行一次_Javascript_Jquery_Function_Callback - Fatal编程技术网

Javascript jQuery:如何让回调函数只运行一次

Javascript jQuery:如何让回调函数只运行一次,javascript,jquery,function,callback,Javascript,Jquery,Function,Callback,我只想运行一次回调函数,如果它删除了某个类中的所有元素,它就应该运行一次,但是由于某种原因,回调函数的运行次数乘以删除的元素数,所以这不是我要寻找的 代码(形成插件) 最简单的方法是取消设置函数: $('.msg').fadeOut(200, function(){ $(this).remove(); if(typeof str.remove == 'function'){ str.remove.call(this);

我只想运行一次回调函数,如果它删除了某个类中的所有元素,它就应该运行一次,但是由于某种原因,回调函数的运行次数乘以删除的元素数,所以这不是我要寻找的

代码(形成插件)


最简单的方法是取消设置函数:

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

杰奥德可能是对的。 以下代码使用所有.msg元素调用回调:

    var $msgs = $('.msg').fadeOut(200, function(){
        $(this).remove();
        if(typeof str.remove == 'function'){
            str.remove.call($msgs);
            str.remove = false;
        }           
    }); 
请注意,
$('.msg')
速度很慢(特别是在IE 7及以下版本中),不应在没有标记的情况下使用。
原因是它们不支持(正如Mike G所说)

最简单的方法是取消设置函数:

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

杰奥德可能是对的。 以下代码使用所有.msg元素调用回调:

    var $msgs = $('.msg').fadeOut(200, function(){
        $(this).remove();
        if(typeof str.remove == 'function'){
            str.remove.call($msgs);
            str.remove = false;
        }           
    }); 
请注意,
$('.msg')
速度很慢(特别是在IE 7及以下版本中),不应在没有标记的情况下使用。
原因是他们不支持(正如Mike G所说)

我建议另一种方法:因为您以后可能需要再次使用该函数,所以我不希望重写该函数,而只调用它一次

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

我建议另一种方法:因为以后可能需要再次使用该函数,所以我不希望重写该函数,而只调用它一次

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

这将完成以下任务:

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

见和。我不确定这个在done回调中引用了什么,所以我用一个额外的变量来确定引用。

这应该可以完成以下任务:

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

见和。我不确定这个在done回调中引用了什么,所以我用一个额外的变量来确定引用。

我已经使用了下一段代码(正如戈米指出我的简单错误语句)


我已经使用了下一段代码(正如戈米将我的代码指向简单的错误语句)



我们需要看到更多的代码。不知道str指的是什么,除其他外。@maxedison是正确的。我们需要知道的另一件事是
.remove()
方法中包含的代码,以及它如何对给定的作用域作出反应(因为您特别地
.call()
将其置于已删除元素的作用域中)。我已经更新了代码,这是基本的插件部分。我已将回调放在范围sinds中,只有在删除元素时它才应该运行。回调可以包含用户使用的某种功能。我们需要查看更多代码。不知道str指的是什么,除其他外。@maxedison是正确的。我们需要知道的另一件事是
.remove()
方法中包含的代码,以及它如何对给定的作用域作出反应(因为您特别地
.call()
将其置于已删除元素的作用域中)。我已经更新了代码,这是基本的插件部分。我已将回调放在范围sinds中,只有在删除元素时它才应该运行。回调可以包含用户使用的某种功能。一般来说,类选择器?什么东西慢?为什么慢?这是因为缺少querySelectorAll吗?这可能会也可能不会像预期的那样起作用。由于OP在
this
的范围内专门调用
.remove()
(因为它存在于淡出回调中),因此它现在在第一个删除元素的范围内只运行一次。在不知道
.remove()
回调中的代码的情况下,我们不知道这是否有问题。为什么要删除str.remove()方法?也许以后需要?如果不是,它不会是一个单独的函数,对吗?一般来说,类选择器?什么东西慢?为什么慢?这是因为缺少querySelectorAll吗?这可能会也可能不会像预期的那样起作用。由于OP在
this
的范围内专门调用
.remove()
(因为它存在于淡出回调中),因此它现在在第一个删除元素的范围内只运行一次。在不知道
.remove()
回调中的代码的情况下,我们不知道这是否有问题。为什么要删除str.remove()方法?也许以后需要?如果不是,它不会是一个单独的函数,对吗?我不知道promise api,所以我会看看它是什么。它是用来解决您的问题的东西:-)好的,不,它是一个更大的概念,但在这里使用很好。我不知道promise api,所以我会看一看它,看看它是什么。它是用来解决你的问题的东西:-)好的,不,它是一个更大的概念,但在这里使用很好。