webForumDet fria alternativet

Checkbox[] validering

16 svar · 503 visningar · startad av Melea

MeleaMedlem sedan juli 20033 147 inlägg
#1

Morsning,

har lite problem att validera ett formulär där jag har >10 stycken checkbox som ser ut såhär:

<input type="checkbox" name="group[]" value="1" />
<input type="checkbox" name="group[]" value="1" />
<input type="checkbox" name="group[]" value="1" />
<input type="checkbox" name="group[]" value="1" />
<input type="checkbox" name="group[]" value="1" />
<input type="checkbox" name="group[]" value="1" />
<input type="checkbox" name="group[]" value="1" />
<input type="checkbox" name="group[]" value="1" />

Hur ska jag göra en koll som kollar att jag åtm. har fyllt i en(1) av dessa?

Tack på förhand!

Peter SMedlem sedan dec. 20025 483 inlägg
#2
var elms = document.forms["formulärnamn"].elements["group[]"],
    ch   = false;

for (var i = 0; i < elms.length; ++i){
  if (elms[i].checked){
    ch = true;
    break;
  }
}

if (!ch){
  alert("...");
  return false;
}
MeleaMedlem sedan juli 20033 147 inlägg
#3

Tack för det snabba svaret! :)

En fråga bara, ska det verkligen vara ett komma(,)-tecken efter elements["group[]"]?
Samma i for-loopen, ska det inte vara i++ istället för ++i? :)

Well, hur som helst, jag får inte till det. Såhär ser det ut

function validateUser() {

	var elms = document.getElementById('user').elements["group[]"],
	ch   = false;

	for (var i = 0; i < elms.length; ++i){
		if (elms[i].checked){
			ch = true;
			break;
		}
	}

	if (document.getElementById('user').username.value=="") {
		alert("Du måste fylla i ett användarnamn.");
		return false;
	} else if (document.getElementById('user').password.value=="") {
		alert("Du måste fylla i ett lösenord.");
		return false;
	} else if (!document.getElementById('user').email.value.isValidEmail()) {
		alert("Du måste fylla i korrekt en E-mail adress.");
		return false;
	} else if (!ch) {
		alert("Du måste fylla i minst en kår.");
		return false;
	} else {
		alert("Du skickas nu vidare...");
		return true;
	}
	
}

...

<form action="" method="post" id="user" onsubmit="return validateUser()">

Tack på förhand!

/r Uppdaterat lite

MeleaMedlem sedan juli 20033 147 inlägg
#4

Har nu pillat lite, och fick ihop det. :)
Ovanstående inlägg funkar.

Tack så mycket än en gång!

@ndersMedlem sedan juni 200032 969 inlägg
#5

En fråga bara, ska det verkligen vara ett komma(,)-tecken efter elements["group[]"]?

Peter snubblade nog en liten aning. Semikolon ska det vara, som vanligt.

MeleaMedlem sedan juli 20033 147 inlägg
#6

En följdfråga. Jag hittade en tråd här på wF för en stund sedan, där det stod hur man disablar alla checkboxar om man fyllt i fler än, typ, 5.
Men nu verkar denna tråd vara puts väck, hittar den ingenstans.
Så, hur gör man? :)

Tack på förhand.

Peter SMedlem sedan dec. 20025 483 inlägg
#7

@nders skrev:

En fråga bara, ska det verkligen vara ett komma(,)-tecken efter elements["group[]"]?

Peter snubblade nog en liten aning. Semikolon ska det vara, som vanligt.

Nej, det skall vara ett kommatecken där. Jag definierar två variabler samtidigt, men delar upp det hela i två rader :) Jämför:

var elms = document.forms["formulärnamn"].elements["group[]"],
    ch   = false;

<=>

var elms = ..., ch = ...;

<=>

int i = k, j = m;

++i != i++. Den första varianten räknar upp i utan att skapa en temporär variabel, vilket alltså ger en liten prestandaökning ;)

Melea skrev:

En följdfråga. Jag hittade en tråd här på wF för en stund sedan, där det stod hur man disablar alla checkboxar om man fyllt i fler än, typ, 5.

Om alla checkboxar disable:as, hur skall de då kunna enable:as igen?

MeleaMedlem sedan juli 20033 147 inlägg
#8

Peter S skrev:

Nej, det skall vara ett kommatecken där. Jag definierar två variabler samtidigt, men delar upp det hela i två rader :) Jämför:

var elms = document.forms["formulärnamn"].elements["group[]"],
    ch   = false;

<=>

var elms = ..., ch = ...;

<=>

int i = k, j = m;

++i != i++. Den första varianten räknar upp i utan att skapa en temporär variabel, vilket alltså ger en liten prestandaökning ;)

Ah, smart! Uppdaterar mitt inlägg så det står rätt. :)

Peter S skrev:

Om alla checkboxar disable:as, hur skall de då kunna enable:as igen?

Uh, jag menar att, om man fyller i 5 checkboxar så ska alla utom de 5 man fyllt i disablas, och om man sedan tar bort en, så man har 4 ifyllda, ska alla "enablas" igen.
Går detta att lösa? Eller är det enklare att få upp en liten alert(".."); som säger åt en att man inte kan kryssa i fler checkboxar?

Tack för hjälpen! :)

@ndersMedlem sedan juni 200032 969 inlägg
#9

Nej, det skall vara ett kommatecken där. Jag definierar två variabler samtidigt, men delar upp det hela i två rader

Ah, såklart!

Jag ber om ursäkt för min korkighet ovan. :)

Peter SMedlem sedan dec. 20025 483 inlägg
#10
<input type="checkbox" onclick="f(this)"...

var k = 5, n = 0;

function f(o){
  var elms = o.form.elements[o.name],
      len  = elms.length;

  o.checked ? ++n : --n;

  for (var i = 0; i < len; ++i){
    if (!elms[i].checked){
       elms[i].disabled = (n == k) ? !elms[i].disabled : false;
    }
  }
}

Om du vill kan du ju ge funktionen ett litet mer deskriptivt namn :)

MeleaMedlem sedan juli 20033 147 inlägg
#11

Ja, vad säger man.. Peter Peter Peter :f :bire

Tack!

MeleaMedlem sedan juli 20033 147 inlägg
#12

Ah, hittade en lite "bugg". Jag hämtar ju alla värden till checkboxarna från en databas.
Typ såhär:

if($rows_access[GroupID] == $rows_group[ID]) { echo 'checked="checked"'; }

Om vi säger att det redan är två stycken som ligger i databasen som är checkade, så ska det ju inte gå att fylla i fler. Men det gör det, jag kan alltså fylla i två checkboxar till.

Hur kommer jag förbi detta? :)

Peter SMedlem sedan dec. 20025 483 inlägg
#13
window.onload = function(){
  var elms = document.forms["formulärnamn"].elements["group[]"],
      len  = elms.length;

  while (len--){
    if (elms[len].checked){
      ++n;
    }
  }
}

:)

MeleaMedlem sedan juli 20033 147 inlägg
#14

Great, tack! :)

MeleaMedlem sedan juli 20033 147 inlägg
#15

Har pillat ett bra tag nu, men får inte ihop det.
Kan någon vänlig själ förklara hur jag kan göra en länk som återställer alla värden?
Det ska alltså återställas så att endast de som har "checked="checked" i koden, fortfarande är förbockade. :)

Peter SMedlem sedan dec. 20025 483 inlägg
#16
window.onload = function(){
  var elms = document.forms["formulärnamn"].elements["group[]"],
      len  = elms.length;

  while (len--){
    if (elms[len].checked){
      arr[n++] = elms[len];
    }
  }
}

var k = 5, n = 0, arr = [];

function f(o){
  var elms = o.form.elements[o.name],
      len  = elms.length;

  o.checked ? ++n : --n;

  for (var i = 0; i < len; ++i){
    if (!elms[i].checked){
       elms[i].disabled = (n == k) ? !elms[i].disabled : false;
    }
  }
}

function res(){
  var elms = document.forms["formulärnamn"].elements["group[]"],
      len  = elms.length;

  n = 0;

  for (var i = 0; i < len; ++i){
    elms[i].disabled = false;

    for (var j = 0; j < arr.length; ++j){
      if (elms[i] == arr[j]){
	elms[i].checked = true;
	f(elms[i]);
	break;
      } else {
	elms[i].checked = false;
      }
    }
  }
}

...

<a href="javascript:void(res())">Reset</a>
MeleaMedlem sedan juli 20033 147 inlägg
#17

Som vanliga (y) för dig Peter!
I ow you one!

261 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
132 ms — hämta statistik (db)
128 ms — hämta tråd, inlägg och bilagor (db)