2014-11-21 58 views
0

我正在創建過濾系統,最近我開始使用單選框而不是按鈕。我現在遇到的問題是,當用戶點擊一個按鈕時,我刷新了所有的按鈕狀態,但是他們實際點擊的按鈕沒有激活。如果我點擊另一個按鈕,它會變得活躍。根據值設置複選框的活動狀態

整個事情,究竟它是如何在我的實際網站上行爲不端,是here

JS和jQuery設置活躍按鈕和過濾器:

var filters = { 
    'period_months': [], 
    'period_years': [{filter_value: 2013, filter_display: "2013"}], 
    'period_quarters': [{filter_value: 1, filter_display: "Q1"}] 
}; 
draw(); 
$(".filter_toggle").click(function(e) { 
    var key = $(this).children('input').data('filterKey'); 
    var value = $(this).children('input').data('filterValue'); 
    var display = $(this).children('input').data('filterDisplay'); 
    if (key === "period_months") { 
     filters['period_years'] = []; 
     filters['period_quarters'] = []; 
    } else if ((key === "period_years") || (key === "period_quarters")) { 
     filters['period_months'] = []; 
    } 
    toggle(key,value,display); 
}); 
function toggle(filter_key,filter_value,filter_display) { 
    var filter_exists = false; 
    for (var i in filters[filter_key]) { 
     if (filters[filter_key][i]['filter_value'] == filter_value) { 
      filter_exists = true; 
      filters[filter_key].splice(i,1); 
      break; 
     } 
    } 
    var filter_in = { filter_value: filter_value, filter_display: filter_display }; 
    if (!filter_exists) { 
     filters[filter_key] = []; 
     filters[filter_key].push(filter_in); 
    } 
    draw(); 
} 
function draw() { 
    $('input').prop("checked",false).parent(".btn").removeClass("active").attr("aria-pressed",false); 

    for (i in filters) {  
     for (k in filters[i]) { 
      $("*[data-filter-key="+i+"][data-filter-value="+filters[i][k]['filter_value']+"]") 
      .prop("checked",true) 
      .parent(".btn") 
      .addClass("active") 
      .attr("aria-pressed",true); 
     } 
    } 
} 

在period_ *過濾器的情況下,一年有四分之一可以一起去。如果您設定月份或範圍,則其他時間段均未設置。

所有上述工作正常,當我設置頁面加載狀態,但不是當我點擊一個新的過濾器。其餘代碼處於小提琴中,包括點擊事件等。

+0

整個系統顯得複雜得多,它需要的。你稱他們爲「收音機」,但實際上使用複選框。爲什麼不使用無線電,因爲組中的按鈕互相依賴 – charlietfl 2014-11-21 23:38:39

+0

切換到收音機而不是複選框,bootstrap負責切換按鈕類,而無需您自己的代碼的一行代碼http://jsfiddle.net/bhr1upo5/您會只需要聽取更改事件並取消選中不匹配 – charlietfl 2014-11-21 23:45:31

+0

我不使用單選按鈕,因爲我需要用戶通過單擊選定的按鈕來取消選中選擇。如果我沒有弄錯,那不是單選按鈕行爲。我也無法在它們上使用.button(「切換」),所以我最終決定使用互斥的複選框。我可能不會吻這個代碼,但現在我所關心的是工作解決方案。 – vcanales 2014-11-24 15:40:47

回答

1

如果我理解正確的話,這可能是解決

UPDATE:

function clearMonths() { 
    $('#period_months .filter_toggle').removeClass('active'); 
    $('#period_months input').prop("checked", false) 
} 

function clearYears() { 
    $('#period_years .filter_toggle').removeClass('active'); 
    $('#period_years input').prop("checked", false) 
} 

function clearQuarters() { 
    $('#period_quarters .filter_toggle').removeClass('active'); 
    $('#period_quarters input').prop("checked", false) 
} 

$(".btn-group").click(function (e) { 

    if ($(this).attr('id') == 'period_months') { 
     clearYears() 
     clearQuarters() 
     clearMonths() 
    } 

    if ($(this).attr('id') == 'period_years') { 
     clearMonths(); 
     clearYears(); 
    } 

    if ($(this).attr('id') == 'period_quarters') { 
     clearMonths(); 
     clearQuarters() 
    } 

    $(this).find('label:active input').prop("checked", true); 


}); 

http://jsfiddle.net/25v4m6ue/5/

+0

嗯,由於某些原因,複選框不會在第二次點擊時被取消選中。 – vcanales 2014-11-24 15:52:13

+0

答案已更新 – dm4web 2014-11-24 16:43:31

+0

我認爲標記和js不兼容,因爲您使用的是attr('id'),但btn-group中的元素沒有id。小提琴是否真的爲你工作?這可能是我的一個問題,但似乎並不像現在這樣回答問題。 – vcanales 2014-11-24 16:59:03