EDIT3:更多的人保持downvoting在此之前,請注意,這不是一個重複的問題。爲什麼複選框總是返回相同的值?
我的工作,需要一個完整的複選框的表一個網站,每一個都需要開/關切換。有時切換一個需要切換其他人,等等。
我沒有構建基本代碼,但由於它對所有邏輯進行的相當混亂,我決定做一些工作,比如收音機,所以我們只有一個基本功能來完成大部分邏輯工作。
我也有一個功能啓用/禁用一些複選框。這一切都很好,沒有問題。
但是現在有在玩另一件事是文本輸入。如果在其中選擇了某個值,則某些複選框會自動打開/關閉並鎖定。使用相同的基本功能來執行此操作。但是,當一個複選框獲取與此禁用,然後重新啓用,下面的函數只保留該複選框返回總是如此:
$('input[type="checkbox"]').change(function() {
// Make checkboxes with names work like radios (radios can't be toggled off)
if ($(this).attr("name")) {
// Save clicked toggle value
var selected_toggle = $(this).attr('value');
// disable all and then toggle clicked one on
if ($('input[value="'+selected_toggle+'"]').prop("checked")) {
console.log("This is checked");
$('input:checkbox[name='+$(this).attr('name')+']').each(function() {
toggle_checkbox($(this).attr('value'), 'disabled');
});
toggle_checkbox(selected_toggle, 'enabled', 'on');
}
// Enable them all back if unchecking
else {
console.log("This is unchecked");
$('input:checkbox[name='+$(this).attr('name')+']').each(function() {
toggle_checkbox($(this).attr('value'), 'enabled');
});
$(this).parent().toggleClass("on");
}
}
else {
// Toggle them on or off
$(this).parent().toggleClass("on");
}
});
最明顯的事情是說「鎖定時的東西是不同的/解鎖該複選框」,但它的所有相同的功能,同樣的方式,所有其他的切換得到禁止,這是從toggle_checkbox功能使用:
function toggle_checkbox(toggle, value, on, lock) {
// Disable the toggle completely
if (value == 'disabled') {
$('input[value="'+toggle+'"]').attr('disabled', 'disabled');
$('input[value="'+toggle+'"]').parents('li').addClass('disabled');
$('input[value="'+toggle+'"]').parent().removeClass('on');
$('input[value="'+toggle+'"]').prop('checked', false);
}
// Enable a toggle back
if (value == 'enabled') {
$('input[value="'+toggle+'"]').parents('li').removeClass('disabled');
// Turn it on
if (on == 'on') {
$('input[value="'+toggle+'"]').parent().addClass('on');
$('input[value="'+toggle+'"]').prop('checked', true);
}
// Lock it on or remove disabled
if (lock == 'lock') {
$('input[value="'+toggle+'"]').attr('disabled', 'disabled');
}
else {
$('input[value="'+toggle+'"]').removeAttr('disabled');
}
}
}
當我刪除上面的代碼名稱屬性複選框工作正常。然而,儘管所有其他複選框回報選中/取消正確,點擊特定非禁用一個的時候,它總是返回「這個被選中。」
我用的是:前(「選中」),改變託沒有區別。
編輯:正如評論中所說,使用prop或attr沒有什麼區別。這是鎖定的是被「卡住」的複選框代碼:
function set_hint_toggles(type, state) {
if (type == 'apples') { // Set when you select something with apples
toggle_checkbox('pears', 'disabled');
toggle_checkbox('apples', 'enabled', 'on', 'lock');
toggle_checkbox('oranges', 'disabled');
}
if (state == 'off') { // This is set when a reset button is pressed
var toggles_type = $('#hidden-input-with-value').val();
toggle_checkbox(toggles_type, 'enabled'); // This checkbox gets stuck, all others continue working
$('#text-input').removeAttr("disabled"); // Allows to type something again
}
}
EDIT2:試圖馬文的回答後,我得到了一個性能稍微不同的結果,可以幫助找出什麼是錯的:
此卡複選框有一個「檢查」和「禁用」狀態。當點擊復位按鈕時,禁用被刪除,但它仍然被選中(或應該)。當我在復位後用上面的代碼嘗試點擊複選框時,它就像重新檢查過一次,然後一直卡住檢查。
使用[0] .disabled = false,我可以繼續打開和關閉複選框,但沒有js被激活,並且每次點擊仍然會被選中。
Edit4:當嘗試使用
toggle_checkbox(toggles_type, 'disabled');
toggle_checkbox(toggles_type, 'enabled');
在,使複選框的代碼會被卡住(set_hint_toggles(關)上述功能),它只有被禁用。之後,這個複選框總是返回false而不是總是true。
當你設置屬性時,屬性也被設置,當你刪除屬性時,屬性不會被刪除,你必須將它設置爲false,這就是爲什麼你應該使用'prop' – adeneo
然而,爲什麼它只發生在一種情況下,而不是全部?有什麼不同? – Forty
@adeneo - 修好了!你可以把它作爲答案張貼,以便我可以標記解決?爲我學習正確的js還有很長的路要走。 – Forty