2012-04-20 54 views
1

我有以下代碼來隱藏/顯示divs.First所有我隱藏它們,然後我顯示相關的一個。jQuery函數取代臃腫的代碼

$('.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?

產品1將控制PRO1 產品2將控制PRO2

等等 - 在年底的數字將始終是一致的。

乾杯, 史蒂夫

+1

有可能是一個更好的方式來做到這一點重新安排的div的類和id的。但是,我很難找出沒有標記代碼的情況。 – Th0rndike 2012-04-20 09:46:35

回答

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(); 
}); 
+0

這確實假設'productN'是元素上唯一的類。 – 2012-04-20 10:06:23

+0

是的,不幸的是,我沒有其他的線索可以與:( – fcalderan 2012-04-20 10:08:01

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

RE-EDIT:誤解,請參閱F. Calderan答案。

+0

這就是我的意思,在我的意見。+1 – Th0rndike 2012-04-20 09:47:42

+0

但他不想顯示()'這個' – Thilo 2012-04-20 09:48:58

+0

韓,你是對的! – sp00m 2012-04-20 09:50:01

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任何元素的有效。

+0

'$(this) .attr('data-num')'應該被替換爲'$(this).data('num')' – sp00m 2012-04-20 10:03:02

+0

@ sp00m:不,它不應該。*可以是*,但這並不意味着它*應該*。就我個人而言,我不是整個方式的粉絲jQuery的'數據'函數混淆和混淆的東西。:-) – 2012-04-20 10:05:17

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"> 
}); 
+0

+1。但是用'rel =「。pro1」'使它更加靈活。 – Thilo 2012-04-20 09:52:11

+0

@Thilo會真的讓它更加靈活嗎?將產品ID放在'rel'屬性中將是最靈活的。如果OP想在未來引入AJAX查詢或類似的東西,那麼產品ID可能是最好的方法。 – 2012-04-20 09:53:51

+0

取決於他是否想將事件處理程序用於產品以外的事物。並且要拋出第三個選項,使用DOM id並執行'rel =「#pro1」'。 – Thilo 2012-04-20 09:54:59

3

如果選中了一些屬性的所有相關要素(說 '數據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(); 
}); 
+0

這也是一個很好的方法來做到這一點。 :)使用'data-something'意味着你可以擁有無​​限的屬性,而不是使用'rel'屬性。 – 2012-04-20 09:56:23

+0

'$(this).attr('data-id')'應該被替換爲'$(this).data('id')' – sp00m 2012-04-20 10:00:11