2009-05-28 4 views
1

Gibt es einen schnellen Weg oder eine Funktion, die mir wahr/falsch sagen würde, wenn alle Kontrollkästchen deaktiviert sind? Ohne Array durchzugehen? (Mit JS und HTML)Schnelle Möglichkeit zu validieren, wenn alle Checkboxen nicht ausgewählt sind?

Alle meine Kontrollkästchen haben den gleichen Namen ...

<form action="/cgi-bin/Lib.exe" method=POST name="checks" ID="Form2"> 
    <input type=checkbox name="us" value="Joe" ID="Checkbox1"> 
    <input type=checkbox name="us" value="Dan" ID="Checkbox2"> 
    <input type=checkbox name="us" value="Sal" ID="Checkbox3"> 
</form> 

Antwort

5

Sie haben durch sie Schleife. Sogar eine Bibliothek wie jQuery durchläuft sie, verberge sie einfach vor dir.

var form = document.getElementById('Form2'); 
var inputs = form.getElementsByTagName('input'); 
var is_checked = false; 
for(var x = 0; x < inputs.length; x++) { 
    if(inputs[x].type == 'checkbox' && inputs[x].name == 'us') { 
     is_checked = inputs[x].checked; 
     if(is_checked) break; 
    } 
} 
// is_checked will be boolean 'true' if any are checked at this point. 
+0

das wird nicht nur zurück, wenn die letzte Option ist überprüft? Z.B. Sal im Beispiel. – svinto

+0

Whoops! Korrekt. Fest. –

2

Zusammengefasst wird diese snipped true zurück, wenn alle nicht überprüft. Es wird ausgebucht, sobald eine überprüfte gefunden wurde.

var a = document.getElementsByName("us"); 
for(var i=0; i<a.length; i++) 
    if(a[i].checked) 
     return false; 
return true; 

(nicht getestet, aber vom Konzept her ist es gültig)

+0

getElementsByName ist in IE schrullige: http://www.quirksmode.org/dom/w3c_core.html –

+0

Danke für den Link - nicht das Diagramm zu sehen, bevor –

6

jQuery wäre eine Masse von unnötigen Bloat für eine Aufgabe dieser trivialen. Betrachten Sie es verwenden, wenn Sie es für andere Zwecke einsetzen, aber alles, was Sie brauchen, ist etwas Ähnliches:

function AreAnyCheckboxesChecked() { 
    var checkboxes = document.forms.Form2.elements.us; 
    for (var i = 0; i < checkboxes.length; i++) { 
    if (checkboxes[i].checked) { 
     return true; 
    } 
    } 
    return false; 
} 
0

Was meinst du mit

Ohne

durch Array zu gehen?

könnten Sie tun nur

function check() { 
    var anyChecked = false; 
    var form = document.getElementById('Form2'); 
    var checkboxes = form.getElementsByTagName('input'); 
    for(var i=0; i < checkboxes.length; i++) { 
      if (checkboxes[i].checked) { 
       anyChecked = true; 
       break; 
      } 
    } 
    alert("Checkboxes checked? " + anyChecked); 
} 

Working Demo

+0

getElementsByName ist skurril in IE und ein bisschen in Opera: http://www.quirksmode.org/dom/w3c_core.html, versuche ich es einfach zu vermeiden. –

+0

cheers - aktualisiert jetzt –

4

JavaScript:

var allischecked = (function(){ 
    var o = document.getElementById("Form2").getElementsByTagName("input"); 
    for(var i=0,l=o.length;i<l;i++){ 
    o[i].type === "checkbox" && o[i].name === "us" && o[i].checked || return false; 
    } 
    return true; 
})(); 

Mit jQuery:

var allischecked = ($("#Form2 input:checkbox:not(checked)").length === 0); 
+0

+1 für auch die JQuery-Version. Ja, wenn das alles ist, was du tun willst, ist JQuery Overkill. Aber wenn Sie andere Validierung, AJAX, etc. haben, ist ein One-Line-Test schwer zu schlagen. – GalacticCowboy

0

Wenn Sie eine große Menge von Kontrollkästchen t Wenn Sie nicht möchten, dass Sie den Test durchlaufen, ist es möglicherweise effizienter, diesen Ansatz zu verwenden.

var checked = 0; 

$("input[type=checkbox]").live("click", function() { 
    if($(this).attr("checked")) checked++; 
    else checked--; 
} 

Dann könnten Sie so testen.

if(checked === 0) { 
    doSomething(); 
}