2016-02-17 99 views
-1

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。

+0

當你設置屬性時,屬性也被設置,當你刪除屬性時,屬性不會被刪除,你必須將它設置爲false,這就是爲什麼你應該使用'prop' – adeneo

+0

然而,爲什麼它只發生在一種情況下,而不是全部?有什麼不同? – Forty

+0

@adeneo - 修好了!你可以把它作爲答案張貼,以便我可以標記解決?爲我學習正確的js還有很長的路要走。 – Forty

回答

0

這確實是一些錯誤的一個代碼塊我張貼。現在我使用的是改變選擇這種基於關Adeneo的建議,它的工作完美:

// Search checkbox toggles 
$('input[type="checkbox"]').change(function() { 

    // Make checkboxes with names work like radios (radios can't be toggled off) 
    if ($(this).attr("name")) { 

     if (this.checked) { 
      $('[name='+ this.name +']').each(function() { 
       toggle_disabled(this.value, 'disabled'); 
      }); 
      toggle_disabled(this.value, 'enabled', 'on'); 
     } 
     else { 
      $('[name='+ this.name +']').each(function() { 
       toggle_disabled(this.value, 'enabled'); 
      }); 
      $(this).parent().toggleClass("on"); 
     } 
    } 
    // Else if no name, just toggle on class 
    else { 
     $(this).parent().toggleClass("on"); 
    } 
}); 

我相信問題是用於測試的選擇,如果該複選框開始了。

我現在還在使用其他所有東西的道具,但是這並沒有改變任何東西,看起來好像根本不需要處理這個問題。其他建議也沒有做任何事情。

1

Theres litle tip,you can use to improve your code ..沒有一個jsfiddle或者一些例子,恐怕我無法幫到你。您應該嘗試使用DOM本地api設置禁用項目

$('input[value="'+toggle+'"]')[0].disabled //returns if the element is disabled 

$('input[value="'+toggle+'"]')[0].disabled = true //set element as disabled or not 

對於checked屬性的作品相同。

$('input[value="'+toggle+'"]')[0].checked //returns if the element is checked 

$('input[value="'+toggle+'"]')[0].checked = true //set element as checked or not 
+0

謝謝,我會試試這個。 – Forty

+0

這很好,謝謝。但該複選框仍然「卡住」。儘管它有一些新的東西,這解釋了它之前的一些行爲。卡住的複選框有一個「檢查」和「禁用」狀態。當我點擊重置按鈕時,禁用被刪除,但它仍然被檢查。當我用前面的代碼嘗試點擊它時,就好像它被檢查過一次,然後一直被卡住。現在使用[0] .disabled = false,我可以看到它刪除禁用**和**選中。然後,我可以繼續切換它,但沒有js被激活。 – Forty

+1

只需要注意它,jQuery版本將會是'$('input [value =''+ toggle +'「''')。eq(0).prop('checked',true)' – adeneo

相關問題