jQuery函数替换膨胀代码

时间:2012-04-20 09:42:12

标签: jquery

我有以下代码来隐藏/显示div。首先,我隐藏它们然后显示一个相关的。

$('.cart').children().hide();                                                           

$('.product1').click(function() {
    $('.cart').children().hide();               
    $('.pro1').show();
});

$('.product2').click(function() {
    $('.cart').children().hide();               
    $('.pro2').show();
});

$('.product3').click(function() {
    $('.cart').children().hide();  
    $('.pro3').show();
});

有没有办法可以创建一个函数,该函数接受一个类被点击的输入并显示相关的div?

product1将控制pro1 product2将控制pro2

等等 - 最后的数字总是一致的。

干杯, 史蒂夫

5 个答案:

答案 0 :(得分:3)

如果您使用某个属性标记所有相关元素(例如'data-id'):

<a class="product" data-id="1">...</a>
<a class="product" data-id="2">...</a>
<a class="product" data-id="3">...</a>
...
<div class="cart">
   <div class="pro" data-id="1">...</div>
   <div class="pro" data-id="2">...</div>
   <div class="pro" data-id="3">...</div>
</div>    

然后这应该有效:

$('.product').click (function() {
   $('.cart').children().hide();
   $('.pro[data-id="' + $(this).attr('data-id') + '"]').show();
});

答案 1 :(得分:1)

var children = $('.cart').children(); 
children.hide().click(function() {
    /* assuming classes are in the form of product1... product<n> */
    var index = $(this).attr('class').replace(/^product/, '');

    children.hide();               
    $('.pro' + index).show();
});

答案 2 :(得分:1)

为您的三个HTML元素.product1.product2.product3添加另一个类,例如common-class,然后尝试:

$('.common-class').click(function() {
    $('.cart').children().hide();               
    $(this).show();
});

编辑:或者甚至更好,没有添加课程,这也应该有效:

$('.cart').children().each(function() {
    $(this).click(function() {
        $('.cart').children().hide();
        $(this).show();
    });
});

重新编辑:误解,请参阅F. Calderan的答案。

答案 3 :(得分:1)

不确定。如果您知道相关元素上有一个类(product1等),那么:

$('.cart').children().hide();                                                           
$('.product1, .product2, .product3').click(function() {
    var num = this.className.substring(7);
    $('.cart').children().hide();               
    $('.pro' + num).show();
}

如果他们也可能有其他课程(更可能的情况):

$('.cart').children().hide();                                                           
$('.product1, .product2, .product3').click(function() {
    var classes = this.className.split(' ');
    $.each(this.className.split(' '), function(index, cls) {
        var num;
        if (cls.substring(0, 7) === "product") {
            num = cls.substring(7);
            $('.cart').children().hide();               
            $('.pro' + num).show();
        }
    }
}

但我可能会考虑重构一下。可能是product类和data-num属性,其中包含产品编号:

<div class="product" data-num="1">Product 1</div>

...这使它变得更容易:

$('.cart').children().hide();                                                           
$('.product').click(function() {
    var num = $(this).attr('data-num');
    $('.cart').children().hide();               
    $('.pro' + num).show();
}

data-* prefix开头的属性对任何元素都有效。

答案 4 :(得分:1)

我不会这样做。所有productx都属于product类,因此应该都有类product,而产品ID /编号应该以另一种方式引用。

我会使用rel属性:

<div class="product" rel="1">Product 1</div>
<div class="product" rel="2">Product 2</div>
<div class="product" rel="3">Product 3</div>

现在你可以做到:

$('.product').click(function(){
  var rel = $(this).attr('rel');
  $('.cart').children().hide();
  $('.pro'+rel).show();
  // this is for show however
  // as above I probably wouldn't
  // use the class to reference
  // these elements. Classes can
  // be applied to many elements.
  // I would use id rather than
  // class. e.g. <div id="pro1">
});