2016-04-08 275 views
3

我有6個輸入複選框,如果複選框被選中超過3,最後一個被取消選中。爲了更好的理解,請參考我以前的question。哪個解決了。未捕獲TypeError:無法讀取未定義的屬性'prop'

現在,我有另一個問題,現在3複選框已被Math.random檢查。點擊任何未選中的複選框。我在控制檯中出錯。下面

Uncaught TypeError: Cannot read property 'prop' of undefined

Fiddle Demo

代碼:

var random_checked = $("input[type=checkbox]").get().sort(function(){ 
    return Math.round(Math.random())-0.6; //so we get the right +/- combo 
}).slice(0,3); 
$(random_checked).prop('checked', true); 



var checked = []; 
$('input[type=checkbox]').change(function(e) { 
    var num_checked = $("input[type=checkbox]:checked").length; 
    if (num_checked > 3) { 
     checked[checked.length - 1].prop('checked', false); 
     checked.pop(); 
    } 
    if($.inArray($(this), checked) < 0){ 
     checked.push($(this)); 
    } 
}); 
+1

'檢查[checked.length - 1]'是未定義 –

+0

爲了擺脫對檢查陣列的長度差錯檢驗的:如果(num_checked> 3 && checked.length> 0){---- HTTPS: //jsfiddle.net/usx8Lkc5/15/ – Zaki

+0

它被定義。如果我只是刪除'match.random'或默認選擇,那麼它的工作原理。請參閱https://jsfiddle.net/usx8Lkc5/14/。 – locateganesh

回答

3

你可以試試下面的代碼

var checked = $('input[type=checkbox]:checked').map(function(){ 
return $(this); 
}).get(); // First change 
$('input[type=checkbox]').change(function(e) { 
    var num_checked = $("input[type=checkbox]:checked").length; 
    if (num_checked > 3) { 
     $(checked.pop()).prop('checked', false);// Second change 
    } 
    if($.inArray($(this), checked) < 0){ 
     checked.push($(this)); 
    } 
}); 

DEMO FIDDLE

所做的更改

►存儲使用

var checked = $('input[type=checkbox]:checked').map(function(){ 
return $(this); 
}).get(); 

$(checked.pop())►用於選擇最後插入的元件當前檢查元件的陣列。

爲什麼你的代碼不工作?

根據您的代碼var checked = [];將在初始階段爲空。因此checked[checked.length - 1]將變得未定義。

+1

這真的很酷..謝謝男人不僅解決問題,而且還解釋我的錯誤背後的原因.. – locateganesh

+0

總是很高興在這裏':)' –

1

您應該在檢查列表中推送初始項目。

$(random_checked).each(function(){ 
    console.log($(this)); 
    checked.push($(this)); 
}); 

https://jsfiddle.net/usx8Lkc5/18/

1

這一個工作的,只是簡單地增加lastChecked = random_checked [2];這樣你的lastChecked就定義了。

var random_checked = $("input[type=checkbox]").get().sort(function(){ 
var test = Math.round(Math.random())-0.6; 
return test; //so we get the right +/- combo 
}).slice(0,3); 

$(random_checked).prop('checked', true); 
    lastChecked = random_checked[2]; 
var $checks = $('input:checkbox').click(function(e) { 
    var numChecked = $checks.filter(':checked').length; 
    if (numChecked > 2) { 
     alert("sorry, you have already selected 3 checkboxes!"); 
     lastChecked.checked = false; 
    } 
    lastChecked = this; 
}); 
相關問題