如何隐藏多个项目但只调用一次处理程序?

我隐藏了多个这样的项目:

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

问题是这个记录了四次。 由于我无法控制的原因,我不能在每个元素上使用公共类。 是否有一个很好的jquery-ish方法使这个处理程序只在最后一个项隐藏后触发? (或者第一个,因为它们应该是几乎同时的)

此外,元素将被隐藏并显示多次,因此用于限制处理程序调用的任何内容都必须在之后重置。

我显然可以在处理程序中添加某种布尔值,但我希望有一个更清晰的解决方案。

你可以使用$ .when()和deferred.done()

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

简单的工作示例

关于什么…

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

编辑:它不起作用,因为$(this)上下文在hide()回调中更改。 首先尝试缓存选择器:

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

你可以使用一个队列( 虽然@ManseUK的答案看起来像现在这样做的正确方法

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

http://jsfiddle.net/duzB8/上的演示

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