2012-04-19 5 views
2

Я прячусь несколько элементов, как это:Как скрыть несколько элементов, но только вызвать обработчик один раз?

$('#item1,#item2,#item3').hide('slow',function() { 
    console.log('hidden'); 
}); 

Проблема заключается в том, что это входит в четыре раза. По причинам, не зависящим от меня, я не могу использовать общий класс для каждого элемента. Есть ли хороший jquery-ish способ сделать этот обработчик только огнем после того, как последний элемент скрыт? (или первым, так как они должны быть практически одновременными)

Кроме того, элементы будут скрыты и показаны много раз, поэтому все, что используется для ограничения вызова обработчика, должно быть сброшено впоследствии.

Я могу, очевидно, поместить в обработчик какое-то булево значение, но я надеялся на более чистое решение.

ответ

4

Вы можете использовать $.when() и deferred.done()

$.when($('#item1,#item2,#item3').hide('slow')).done(function() { 
    console.log('hidden'); 
}); 

Simple working example

+0

Отсутствует замыкающая скобка после' ('slow') ', но в противном случае это делает работу довольно аккуратно. – shanethehat

+0

@shanethehat я думаю, что он там сейчас ... добавил пример тоже ... спасибо :-) – ManseUK

+0

+1, вот как это сделать! –

3

насчет ...

$('#item1,#item2,#item3').hide('slow', function() { 
    if ($(this).is(':last')){ 
     // code 
    } 
}); 

EDIT: Это не работает, потому что $(this) контекст меняется внутри hide() обратного вызова. Попробуйте кэшировать селектор первый:

var $els = $('#item1,#item2,#item3'); 
$els.hide('slow', function(e) { 
    if ($(this).is($els.last())){ 
     alert('test'); 
    } 
}); 
+0

OOH, мне нравится внешний вид, что, позвольте мне дать ему попробовать ... – shanethehat

+1

[Это не появляется на работе] (http://jsfiddle.net/5EErG/) –

+0

Я заметил, вижу мое редактирование, которое должно работать. – elclanrs

0
var counter = 0; 
$('#item1,#item2,#item3').hide('slow',function() { 
    counter++; 
    if (counter == 3){ console.log('hidden'); } 
}); 
1

Вы можете использовать очереди (хотя @ManseUK's answer выглядит как правильный способ сделать это в настоящее время)

$({}) 
    .queue(function(next){ 
     $('#item1, #item2, #item3').hide('slow', next); 
    }) 
    .queue(function(){ 
     console.log('hidden'); 
    }); 

демо на http://jsfiddle.net/duzB8/

+0

+1 хорошая ... очередь - хороший вариант ... – ManseUK

Смежные вопросы