2013-05-06 35 views
0

我有一塊JavaScript應該檢查或聯合國檢查所有我的複選框(命名相同)..工作正常時,有超過如果只有一個複選框存在,則一個複選框不起作用。 (我意識到在單個選項屏幕上單擊'全部選中'之間的實際區別是相同的,有人可能會爭辯說'全部選中'應該甚至不會出現在屏幕上,只有一個選項 - 但客戶端堅持一致屏幕...所以請不要把我失望,我已經指出的路線)javascript - 'checkAll'怪異的行爲,當只有一個複選框

腳本:

// check uncheck all check boxes 
var checkAll = function(checkname, exby) { 
    alert(checkname.length); // undefined when there is only one check box 
    for (i = 0; i < checkname.length; i++) { 
     checkname[i].checked = exby.checked ? true : false; 
    } 
} 

注 - 我添加了一個警報,以檢查長度,它是不確定的當只有一個複選框時,其他時間是否準確?

不工作的HTML ...

<form method="post" name="createInvoice" > 
    Check/Uncheck All <input name="chkAll" onclick="checkAll(document.createInvoice.PO, this);" type="checkbox" > 
    <input name="PO" value="7835" class="chkbox" type="checkbox" > 
</form> 

,它的HTML ...

<form method="post" name="createInvoice" > 
    Check/Uncheck All <input name="chkAll" onclick="checkAll(document.createInvoice.PO, this);" type="checkbox" > 
    <input name="PO" value="13506" class="chkbox" type="checkbox" > 
    <input name="PO" value="14046" class="chkbox" type="checkbox" > 
</form> 
+0

無恥的自我推廣(如果您已經使用,或不介意介紹,jQuery的):http://mjball.github.io/ jQuery-CheckAll/ – 2013-05-06 20:11:28

+0

你的複選框不應該有不同的名字嗎? – j08691 2013-05-06 20:11:58

+1

@ j08691儘管**通常是一個不錯的主意,可以將名稱分開,但他的複選框可用作多選,因此名稱相同也是有意義的。儘管如此,你仍然不能有重複的ID。 – 2013-05-06 20:19:15

回答

3

如果它僅僅是1,那麼它是重要元素,而不是一個數組。

if (!!checkname.length) { 
    for (i = 0; i < checkname.length; i++) { 
     checkname[i].checked = exby.checked ? true : false; 
    } 
} else { 
    checkname.checked = exby.checked ? true : false; 
} 
2

這是因爲它是如何實施的。

名稱可以在document.getElementsByName()方法中使用,該方法是一個表單和表單元素集合。當與表單或元素集合一起使用時,它可能會返回單個元素或集合。

See Document Ref

Demo

var checkAll = function(checkname, exby) { 
    if(!checkname.length) 
    { 
     checkname.checked = exby.checked ? true : false; 
     return; 
    } 
    alert(checkname.length); // undefined when there is only one check box 
    for (i = 0; i < checkname.length; i++) { 
     checkname[i].checked = exby.checked ? true : false; 
    } 
} 
+1

+1參考鏈接。我覺得人們正在跳過這些參考文獻,並在文檔通常更準確時使用SO。 – 2013-05-06 20:21:30

2

我相信,當你有一個複選框名爲 「PO」,然後document.createInvoice.PO將評估與該名稱的單一的DOM元素。當有不止一個,顯然它會給你一個DOM元素的列表,它具有一個length屬性。

所以當只有一個,你沒有得到一個長度。

你可以添加邏輯來處理這兩種情況下:

var checkAll = function(checkbox, exby) { 
    var checkboxes = checkbox.length ? checkbox : [checkbox]; 
    for (i = 0; i < checkboxes.length; i++) { 
     checkboxes[i].checked = exby.checked; 
    } 
}; 
+0

這是一個非常有用的代碼!謝謝 – 2015-07-08 12:49:55

相關問題