在一行中显示/隐藏元素?

时间:2013-06-20 14:41:48

标签: javascript jquery

我正在调用带有ID的函数。此ID应用于.show()与选择器匹配的元素和.hide()一切都没有。

function showAndHide(id){
    $('.container div').hide();
    $('.container div[data-id="'+id+'"]').show();
}

这有更聪明的方法吗?我想避免两次编写选择器的部分(.container div)并获得更明确的符号。

6 个答案:

答案 0 :(得分:7)

你可以使用chaining& filtering

$('.container div').hide().filter('[data-id="'+id+'"]').show();

第一个选择器选择.container中的所有子div,因此隐藏所有这些子div。 过滤器根据第二个选择器获取第一组的子集(类似于作用于子元素的.find())。因此,最终show()仅对过滤后的元素起作用。

答案 1 :(得分:2)

使用filter()更快替代方法是使用 not()

$('.container div').not('[data-id="'+ id +'"]').hide();

这样你就不必实际使用show(),因为你从未真正隐藏它(方法更少,速度更快,没有不必要的隐藏/显示)。

jsPerf here - 它在所有浏览器中都快得多,并且在filter()中的速度加倍IE8/9

答案 2 :(得分:0)

我认为这应该可以解决问题。

$('.container div, .container div[data-id="'+id+'"]').toggle();

答案 3 :(得分:0)

http://jsfiddle.net/XhjNs/

function showAndHide(id){
$('.container div').not('[data-id="'+id+'"]').hide();

}

答案 4 :(得分:0)

有很多“方法”来更新你的功能。

您应该使用console.profile();console.profileEnd();检查Test这是一个非常有用的Javascript方法(原生)。

@MorganTyle发布的解决方案在呼叫和整体表现方面似乎是最好的,所以你应该跟着他。

您可以找到有关分析Here

的文章

答案 5 :(得分:-2)

这样的事情可能就是你在寻找的东西:

function showAndHide(id){
    $('.container div').each(function () {
        var t = $(this);
        if(t.data("id") == id) {
            t.show();
        } 
        else { 
            t.hide();
        }
    }
}