2012-03-21 4 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

+0

@maxedison правильно. Одной из других вещей, которые нам нужно знать, является код, содержащийся в методе '.remove()' и как он реагирует на предоставленную ему область (так как вы специально '.call()" в ней удаленный элемент [s]). – JAAulde

+0

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

ответ

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 (как сказал Майк G)

+0

Селекторы классов в целом? Или что медленно? – jgauffin

+0

Почему это медленно? Это из-за отсутствия запросаSelectorAll? –

+1

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

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-function и http://api.jquery.com/promise/. Я не уверен, что this ссылается на сделанный обратный вызов, поэтому я сделал ссылку уверенной с дополнительной переменной.

+0

Я не знаю обещания api, поэтому я посмотрю на него и посмотрю, что это такое. – user759235

+0

Это дело, чтобы решить вашу проблему :-) Хорошо, нет, [Отложенная] (http://api.jquery.com/category/deferred-object/) вещь - большая концепция, но она хороша для использования здесь. – Bergi

+0

Да, это хорошее использование обещания(): +1 – fcalderan

0

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

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

     $('.msg').fadeOut(200, function(){ 
      $(this).remove(); 
      if(typeof str.remove == 'function'){ 
       str.remove.call(this); 
       str.remove = false; 
      }   
     }); 
    } 
} 
Смежные вопросы