2013-07-19 30 views
0

我想創建一個使用單選按鈕和jQuery的過濾器。用單選按鈕和jquery多個類進行過濾

我有這樣的項目清單如下:

<ul class="all-options"> 
    <li class="1 a"> 
     <img src="path/to/image"/> 
     <h3>Price</h3> 
     <h2>$1000</h2> 
    </li> 
    <li class="1 b"> 
     <img src="path/to/image"/> 
     <h3>Price</h3> 
     <h2>$1500</h2> 
    </li> 
    <li class="2 a"> 
     <img src="path/to/image"/> 
     <h3>Price</h3> 
     <h2>$1200</h2> 
    </li> 
    <li class="2 b"> 
     <img src="path/to/image"/> 
     <h3>Price</h3> 
     <h2>$1300</h2> 
    </li> 
</ul> 

我想以一次只查看一個項目的基礎上,從以下單選按鈕用戶的選擇:

<label>Numbers</label><br/> 
    <input type="radio" name="number" value="1">1<br/> 
    <input type="radio" name="number" value="2">2<br/> 
<label>Letters</label><br/> 
    <input type="radio" name="letter" value="a">a<br/> 
    <input type="radio" name="letter" value="b">b 

所以,爲了顯示一個項目,我知道兩個類必須與單選按鈕的選擇相匹配。雖然我對jquery很新,所以我希望有人能指出我正確的方向。

回答

1

這可能不是最有效的方式,但它是在我腦海的第一件事,和它的工作原理:

假設你有id="apply"過濾器按鈕...

$("#apply").click(function (e) { 
    e.preventDefault(); 
    var number = $("[name='number']:checked").val(); 
    var letter = $("[name='letter']:checked").val(); 
    $("li").hide(); 
    $("li[class='" + number + " " + letter + "']").show(); 
}); 

Here is a working example


更好的版本

,就好像你li元素有任何其他類以上會失敗,下面是使用jQuery的filter方法的另一種方法:

$("#apply").click(function (e) { 
    e.preventDefault(); 
    var number = $("[name='number']:checked").val(); 
    var letter = $("[name='letter']:checked").val(); 
    $("li").hide(); 
    $("li").filter(function (index) { 
     return $(this).hasClass(number) && $(this).hasClass(letter); 
    }).show(); 
}); 

Here is a working example


你可以把這個邏輯對任何事件,如change爲單選按鈕...

$("input[type='radio']").change(function() { 
    var number = $("[name='number']:checked").val(); 
    var letter = $("[name='letter']:checked").val(); 
    //check if both radios have selected values before proceeding 
    if (!number || !letter) return; 
    $("li").hide(); 
    $("li").filter(function (index) { 
     return $(this).hasClass(number) && $(this).hasClass(letter); 
    }).show(); 
}); 

Here is a working example

當然,如果您的任何number s是0那麼他們將不會通過價值檢查,因爲它代表。

+0

是的,那是有效的。但是如果我希望過濾器在「更改」(當用戶進行或更改他們的選擇時)自動發生? – blicht454

+0

@ blicht454:我相信你自己可以做到這一點,但我已經更新,以包括這一點。我現在要離開了,所以不能再次作出迴應...確保你接受我的答案,如果它解決了你的問題! ;-) – musefan

+0

這就是我一直在尋找的。謝謝! – blicht454

0

我只是綁定musefan代碼事件偵聽器(更確切地說,是「變」事件),以具有動態DOM互動:

$(function() { 
    $('input[type="radio"]').on('change', function() { 
    var number = $("[name='number']:checked").val(); 
    var letter = $("[name='letter']:checked").val(); 
    $("li").hide(); 
    $("li").filter(function (index) { 
    return $(this).hasClass(number) && $(this).hasClass(letter); 
    }).show(); 
    }); 
}); 

這裏一個jsFiddle

+0

是的,這工作真的很好。如果我想要自動選擇每個類別(字母和數字)中的第一個單選按鈕怎麼辦?當然,過濾器會反映​​這些選擇。 – blicht454

+0

然後,您需要將過濾方法封裝在一個函數中,該函數在定義了一些默認值之後調用了第一次執行*和*的更改事件。 jsFiddle [here](http://jsfiddle.net/htCzD/1/)。 – skz