ECMAScript, das innerhalb von HTML und XHTML benutzt wird
Die Technik bezieht sich auf:
Dieses Beispiel wurde erfolgreich unter Windows XP mit IE 6 und Firefox 1.5.0.1 unter der Benutzung von sowohl JAWS 7 als auch WindowEyes 5.5 getestet. Beachten Sie, dass, wenn neue Inhalte auf einer Seite hinzugefügt werden, Screenreader unter Umständen nicht automatisch die neuen Inhalte sprechen. Setzen Sie den Fokus auf das neue Element um sicherzustellen, dass neue Inhalte gesprochen werden, oder stellen Sie sicher, dass es unterhalb der aktuellen Position hinzugefügt wird, so dass es angetroffen wird, wenn der Benutzer damit fortfährt, die Seite zu durchqueren.
Das Ziel dieser Technik ist zu zeigen, wie man Funktionen des Document Object Model (DOM) benutzt, um Inhalte auf einer Seite hinzuzufügen anstatt document.write
oder object.innerHTML
zu benutzen. Die document.write()
-Method funktioniert nicht mit XHTML, wenn sie mit dem korrekten MIME type (application/xhtml+xml) ausgeliefert wird und die innerHTML
-Eigenschaft ist nicht Teil der DOM-Spezifikation und sollte daher vermieden werden. Wenn die DOM-Funktionen benutzt werden, um Inhalte hinzuzufügen können Benutzeragenten auf das DOM zugreifen, um den Inhalt abzurufen. Die createElement()
-Funktion kann benutzt werden, um Elemente innerhalb des DOM zu erstellen. createTextNode()
wird benutzt, um Text, der Elementen zugeordnet ist, zu erstellen. Die appendChild()
-, removeChild()
-, insertBefore()
- und replaceChild()
-Funktionen werden benutzt, um Elemente und Knoten hinzuzufügen und zu entfernen. Andere DOM-Funktionen werden benutzt, um den erstellten Elementen Attribute zuzuweisen.
Anmerkung: Wenn Sie fokussierbare Elemente in das Dokument einfügen, fügen Sie keine tabindex
-Attribute hinzu, um explizit die Tab-Reihenfolge festzulegen, da dies zu Problemen führen kann, wenn fokussierbare Elemente in der Mitte eines Dokumentes eingefügt werden. Lassen Sie dem neuen Element die Standard-Tabreihenfolge zuweisen, indem Sie nicht explizit ein tabindex
-Attribut festlegen.
Dieses Beispiel zeigt die Benutzung von client-seitigem Scripting zur Validierung eines Formulars. Wenn Fehler gefunden werden, werden entsprechende Fehlermeldungen angezeigt. Das Beispiel benutzt die DOM-Funktionen, um Fehlermitteilungen, die aus einem Titel, einem kurzen Absatz, der erklärt, dass ein Fehler aufgetreten ist, und einer Liste mit Fehlern in einer geordneten Liste bestehen, hinzuzufügen. Der Inhalt des Titels wird als Link geschrieben, so dass er benutzt werden kann, um die Aufmerksamkeit des Benutzers auf den Fehler zu ziehen, indem die Fokus-Methode benutzt wird. Jeder Punkt in der Liste wird ebenfalls als Link geschrieben, der den Fokus auf das fehlerhafte Formularfeld setzt, wenn man dem Link folgt.
Der Einfachheit halber validiert das Beispiel nur zwei Textfelder, es kann aber leicht erweitert werden, um zu einem generischen Formular-Handler zu werden. Die client-seitige Validierung sollte nicht das einzige Mittel zur Validierung sein und sollte durch server-seitige Validierung unterstützt werden. Der Nutzen der client-seitigen Validierung liegt darin, dass Sie dem Benutzer eine unmittelbare Rückmeldung geben können und es ihm damit ersparen, darauf zu warten, dass die Fehler vom Server zurückkommen; außerdem hilft es dabei unnötigen Datenverkehr zum Server zu reduzieren.
Hier ist das Skript, das Event-Handler zu dem Formular hinzufügt. Wenn Scripting aktiviert ist, wird die validateNumbers()-Funktion aufgerufen, um die client-seitige Validierung durchzuführen bevor das Formular an den Server geschickt wird. Wenn Scripting nicht aktiviert ist, wird das Formular sofort an den Server geschickt, also sollte die Validierung auch auf dem Server implementiert sein.
Code-Beispiel:
window.onload = initialise;
function initialise()
{
// Ensure we're working with a relatively standards compliant user agent
if (!document.getElementById || !document.createElement || !document.createTextNode)
return;
// Add an event handler for the number form
var objForm = document.getElementById('numberform');
objForm.onsubmit= function(){return validateNumbers(this);};
}
Hier ist die Validierungs-Funktion. Beachten Sie die Benutzung der createElement()-, createTextNode()- und appendChild()-DOM-Funktionen, um die Fehlermeldungs-Elemente zu erstellen.
Code-Beispiel:
function validateNumbers(objForm)
{
// Test whether fields are valid
var bFirst = isNumber(document.getElementById('num1').value);
var bSecond = isNumber(document.getElementById('num2').value);
// If not valid, display errors
if (!bFirst || !bSecond)
{
var objExisting = document.getElementById('validationerrors');
var objNew = document.createElement('div');
var objTitle = document.createElement('h2');
var objParagraph = document.createElement('p');
var objList = document.createElement('ol');
var objAnchor = document.createElement('a');
var strID = 'firsterror';
var strError;
// The heading element will contain a link so that screen readers
// can use it to place focus - the destination for the link is
// the first error contained in a list
objAnchor.appendChild(document.createTextNode('Errors in Submission'));
objAnchor.setAttribute('href', '#firsterror');
objTitle.appendChild(objAnchor);
objParagraph.appendChild(document.createTextNode('Please review the following'));
objNew.setAttribute('id', 'validationerrors');
objNew.appendChild(objTitle);
objNew.appendChild(objParagraph);
// Add each error found to the list of errors
if (!bFirst)
{
strError = 'Please provide a numeric value for the first number';
objList.appendChild(addError(strError, '#num1', objForm, strID));
strID = '';
}
if (!bSecond)
{
strError = 'Please provide a numeric value for the second number';
objList.appendChild(addError(strError, '#num2', objForm, strID));
strID = '';
}
// Add the list to the error information
objNew.appendChild(objList);
// If there were existing errors, replace them with the new lot,
// otherwise add the new errors to the start of the form
if (objExisting)
objExisting.parentNode.replaceChild(objNew, objExisting);
else
{
var objPosition = objForm.firstChild;
objForm.insertBefore(objNew, objPosition);
}
// Place focus on the anchor in the heading to alert
// screen readers that the submission is in error
objAnchor.focus();
// Do not submit the form
objForm.submitAllowed = false;
return false;
}
return true;
}
// Function to validate a number
function isNumber(strValue)
{
return (!isNaN(strValue) && strValue.replace(/^\s+|\s+$/, '') !== '');
}
Unten sind die Helfer-Funktionen, um die Fehlermeldung zu erstellen und den Fokus auf das entsprechende Formularfeld zu setzen.
Code-Beispiel:
// Function to create a list item containing a link describing the error
// that points to the appropriate form field
function addError(strError, strFragment, objForm, strID)
{
var objAnchor = document.createElement('a');
var objListItem = document.createElement('li');
objAnchor.appendChild(document.createTextNode(strError));
objAnchor.setAttribute('href', strFragment);
objAnchor.onclick = function(event){return focusFormField(this, event, objForm);};
objAnchor.onkeypress = function(event){return focusFormField(this, event, objForm);};
// If strID has a value, this is the first error in the list
if (strID.length > 0)
objAnchor.setAttribute('id', strID);
objListItem.appendChild(objAnchor);
return objListItem;
}
// Function to place focus to the form field in error
function focusFormField(objAnchor, objEvent, objForm)
{
// Allow keyboard navigation over links
if (objEvent && objEvent.type == 'keypress')
if (objEvent.keyCode != 13 && objEvent.keyCode != 32)
return true;
// set focus to the form control
var strFormField = objAnchor.href.match(/[^#]\w*$/);
objForm[strFormField].focus();
return false;
}
Hier ist das HTML für das Beispielformular.
Code-Beispiel:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title>ECMAScript Form Validation</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<script type="text/javascript" src="validate.js"></script>
</head>
<body>
<h1>Form Validation</h1>
<form id="numberform" method="post" action="form.php">
<fieldset>
<legend>Numeric Fields</legend>
<p>
<label for="num1">Enter first number</label>
<input type="text" size="20" name="num1" id="num1">
</p>
<p>
<label for="num2">Enter second number</label>
<input type="text" size="20" name="num2" id="num2">
</p>
</fieldset>
<p>
<input type="submit" name="submit" value="Submit Form">
</p>
</form>
</body>
</html>
Dieses Beispiel beschränkt sich auf das client-seitige Scripting und sollte durch eine server-seitige Validierung unterstützt werden. Das Beispiel ist beschränkt auf die Erstellung von Fehlermeldungen, wenn client-seitiges Scripting zur Verfügung steht.
Hier ist ein Link zu einem funktionierenden Beispiel: Form Validation (Formular-Validierung)
Ressourcen sind nur zu Informationszwecken und keine offizielle Empfehlung.
HTML 4.01 The Document Object Model, More methods from Webreference.com
(derzeit keine aufgelistet)
Für Seiten, die neue Inhalte dynamisch erstellen:
Überprüfen Sie den Quellcode und prüfen Sie, ob der neue Inhalt nicht erstellt wurde, indem document.write(), innerHTML, outerHTML, innerText oder outerText benutzt wurde.
Test #1 ist wahr.
Wenn dies eine ausreichende Technik für ein Erfolgskriterium ist, dann bedeutet das Scheitern an diesem Testverfahren nicht zwangsläufig, dass das Erfolgskriterium nicht auf irgendeine andere Art und Weise erfüllt wurde, sondern nur, diese Technik nicht erfolgreich implementiert wurde und nicht benutzt werden kann, um die Konformität zu erklären.