如何隐藏多个项目但只调用一次处理程序?
我隐藏了多个这样的项目:
$('#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'); });
var counter = 0; $('#item1,#item2,#item3').hide('slow',function() { counter++; if ( counter == 3 ){ console.log('hidden'); } });