jQuery: как запустить функцию обратного вызова только один раз - PullRequest
0 голосов
/ 21 марта 2012

Я хочу запустить функцию обратного вызова только один раз, она должна запускаться, если она удаляет все элементы с определенным классом, но по какой-то причине функция обратного вызова запускает количество удаленных элементов, так что это не то, что я ищуfor.

Код (форма плагина)

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

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

Ответы [ 4 ]

2 голосов
/ 21 марта 2012

Самый простой способ - сбросить функцию:

    $('.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 и ниже) и не должен использоваться без тега.Причина в том, что они не поддерживают document.querySelectorAll (как сказал Майк Дж)

1 голос
/ 21 марта 2012

Это должно сделать задачу:

    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 в готовом обратном вызове, поэтому я убедился в ссылке с дополнительной переменной.

0 голосов
/ 21 марта 2012

Я использовал следующий фрагмент кода (как Гомми указал мне на простое ложное утверждение).

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

        $('.msg').fadeOut(200, function(){
            $(this).remove();
            if(typeof str.remove == 'function'){
                str.remove.call(this);
                str.remove = false;
            }           
        });
    } 
}   
0 голосов
/ 21 марта 2012

Я предлагаю альтернативный способ: поскольку вам может понадобиться использовать эту функцию позже, я предпочитаю не переопределять функцию, а вызывать ее только один раз

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