Gunnar Bittersmann: Clientseitige Validierung von Checkboxen

Beitrag lesen

@@Gunnar Bittersmann

Nein. Du musst lediglich alle angehakten Checkboxen selektieren:

  • querySelectorAll(':checked') liefert eine NodeList
  • mit length schaust du, wieviele es sind.

Halt! Was Wichtiges fehlt noch: Nicht alle Browser unterstützen querySelectorAll() (alte IE < 8). Diese dürfen natürlich nicht daran gehindert werden, das Formular abzuschicken. (Dann findet keine clientseitige Validierung statt. Das ist OK; es gibt ja noch die serverseitige.)

Man darf also preventDefault() usw. nur dann ausführen, wenn der Browser querySelectorAll() versteht. Also abfragen, und die Eventbehandlung auch (feature detection):

function validate(e)
{
	if (this.querySelectorAll && this.submit && e && e.preventDefault)
	{
		e.preventDefault();

		if (this.querySelectorAll(':checked').length === 2)
		{
			this.submit(this);
		}
		else
		{
			alert("Nimm 2");
		}
	}
}

Damit in alten Browsern, die addEventListener() nicht kennen, kein Fehler geworfen wird, auch das vorher abfragen (und auch die Existenz des Elements):

if (document.forms.form01 && document.forms.form01.addEventListener)
{
	document.forms.form01.addEventListener('submit', validate, false);
}

Oder man geht den Cutting-the-mustard-Weg (change) und schließt alte Browser generell von der Ausführung des Scripts aus:

if ('classList' in document.createElement('div') && 'querySelector' in document && 'addEventListener' in window && Array.prototype.forEach)
{
	if (document.forms.form01)
	{
		document.forms.form01.addEventListener('submit', validate, false);
	}

	function validate(e)
	{
		e.preventDefault();

		if (this.querySelectorAll(':checked').length === 2)
		{
			this.submit(this);
		}
		else
		{
			alert("Nimm 2");
		}
	}
}

LLAP

--
„Talente finden Lösungen, Genies entdecken Probleme.“ (Hans Krailsheimer)