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

时间:2012-04-19 10:13:01

标签: jquery hide

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

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

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

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

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

4 个答案:

答案 0 :(得分:4)

您可以使用$.when()deferred.done()

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

Simple working example

答案 1 :(得分:3)

怎么样......

$('#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');
    }
});

答案 2 :(得分:1)

您可以使用队列(虽然@ManseUK's answer看起来像现在正确的方式

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

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

答案 3 :(得分:0)

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