2014-02-19 26 views
0

困難的措辭問題抱歉傢伙!jQuery如果其他語句不重置原來的複選框狀態

看看這個小提琴,看看我想達到什麼,http://jsfiddle.net/SzQwh/ 但基本上,當用戶檢查複選框,他需要將他們等於45和其他複選框,然後將被禁用。

問題我遇到的情況是,如果您選擇一個30個信用複選框和一個15個信用複選框,然後選擇15個信用複選框,則其餘複選框仍然保持禁用狀態。

如果你玩弄小提琴,所有其他實例都可以很好地工作。

很抱歉,如果這是真的很明顯,但我只是不能什麼錯誤

var points = 30; 
var maxPoints = 45; 
var sum = 0; 

    $(':checkbox').click(function() { 
     sum = 0; 
     $(':checkbox:checked').each(function(idx, elm) { 
      sum += parseInt(elm.value, 10); 
     }); 
     $('#total_credits').html(sum); 

     if (sum >= maxPoints) { 
      $(':checkbox').not(':checked').attr('disabled', true); 
     } else if (sum >= points) { 
      $('.group2 :checkbox').not(':checked').attr('disabled', true); 
     } else { 
      $(':checkbox:disabled').attr('disabled', false); 
     }   
    }); 
+0

你嘗試過改變'.attr( '禁用',假)''來.removeAttr( '禁用')'? – Pavlo

+0

與此相同的問題 –

+0

檢查我的第二個答案:)這次我喜歡它,但在我看來,它無法做得更有效率:-D – Alberto

回答

0

最佳實現(只有2行邏輯):http://jsfiddle.net/SzQwh/11/

此外,如果jQuery版本> = 1.6,您應該使用prop而不是attr!

$(':checkbox').not(':checked').prop('disabled', sum >= maxPoints); 
$('.group2 :checkbox').not(':checked').prop('disabled', sum >= points); 

全碼:

jQuery(document).ready(function($) { 
    var points = 30; 
    var maxPoints = 45; 
    var sum = 0; 

    $(':checkbox').click(function() { 
     sum = 0; 
     $(':checkbox:checked').each(function(idx, elm) { 
      sum += parseInt(elm.value, 10); 
     }); 
     $('#total_credits').html(sum); 
     $(':checkbox').not(':checked').prop('disabled', sum >= maxPoints); 
     $('.group2 :checkbox').not(':checked').prop('disabled', sum >= points); 
    }); 
}); 
+0

@Digital_Matrix這是我喜歡的一段代碼:) – Alberto

+0

尼斯!感謝您的幫助Alberto! –

+0

很高興看到它! :) – Alberto

0
$(':checkbox').click(function() { 
     sum = 0; 
     $(':checkbox:checked').each(function(idx, elm) { 
      sum += parseInt(elm.value, 10); 
     }); 
     $('#total_credits').html(sum); 


     if (sum >= maxPoints) { 
      $(':checkbox').not(':checked').prop('disabled', true); 
     } else if (sum >= points) { 
      $('.group2 :checkbox').not(':checked').prop('disabled',  
                  true) 
      sum <= points 
       && $('.group1 :checkbox').not(':checked').prop('disabled',  
                   false) 
     } else { 
      $(':checkbox:disabled').prop('disabled', false); 
     } 

使用prop()設置檢查了複選框/禁用狀態應該做的事,而不是讓我周圍的頭attr()

1

Update Fiddle 更改此部分。 即。從表達式中刪除=。

else if (sum > points) 
+1

這是行不通的。如果你檢查兩個'15',你可以檢查一個'30'(然後總和= 60) –

+0

是的,但是正如Nathan所提到的,我現在可以選擇2 x 30學分 - 儘管 –

1

http://jsfiddle.net/SzQwh/5/

jQuery(document).ready(function($) { 

    var points = 30; 
    var maxPoints = 45; 
    var sum = 0; 

    $(':checkbox').click(function() { 
     sum = 0; 
     $(':checkbox:checked').each(function(idx, elm) { 
      sum += parseInt(elm.value, 10); 
     }); 
     $('#total_credits').html(sum); 


     if (sum >= points) { 
      $('.group2 :checkbox').not(':checked').attr('disabled', true); 
      if (sum >= maxPoints) { 
       $(':checkbox').not(':checked').attr('disabled', true); 

      } 
     else 
     { 
      $('.group1 :checkbox').attr('disabled', false); 
     }   
     } else 
     { 
      $(':checkbox').attr('disabled', false); 
     } 

    }); 
}); 
+0

你先生是明星,從未想過關於以這種方式分離出if和else的陳述,這是一種享受!非常感謝你 –

+0

我做得很快,我不喜歡它..但它的作品:)希望這可以幫助 – Alberto

1

我已修改邏輯,如下所示:

if (sum >= maxPoints) { 
     $(':checkbox').not(':checked').attr('disabled', true); 
    } else if (sum == points) { 
     $('.group2 :checkbox').not(':checked').attr('disabled', true); 
     $('.group1 :checkbox').not(':checked').attr('disabled', false); 
    } else { 
     $(':checkbox:disabled').attr('disabled', false); 
    } 

下面是一個工作demo

+0

這個作品完美太多了,謝謝iJay –