HTML-Formulare werden für User-Eingabe-Daten und die Übertragung zum Server genutzt. Bei solchen Formularen werden oft (name='...'/value='...')-Paare verwendet, die der Server entgegen nimmt und verarbeitet.
Hier geht es um die Nutzung von Formularen und den Formularelementen. Von den Eingabeelementen wird das input-Tag besonders oft benötigt. Möglich sind (inclusiv HTML5) die input-types (siehe z.B. en.wikipedia: HTML Element HTML5 ):
button, checkbox, color, date, datetime, datetime-local, email, file, hidden, image, month, number, password, radio, range, reset, search, submit, tel, text, time, url, week
Ein stark vereinfachtes Formular sieht im HTML-Quelltext etwa so aus:
<form action="server-ziel-url-fuer-die-verarbeitung"> <input type="radio" name="RB_X" value="myVal 0" checked="checked" /> <input type="radio" name="RB_X" value="myVal 1" /> <input type="checkbox" name="CB_0" value="myVal 0" checked="checked" /> <input type="text" name="TXT0" value="... Text-Eingabe-Zeile ..." /> <input type="hidden" name="TXT1" value="... Text-Hinterlegen per Script ..." /> <textarea name="TY1"></textare> <input type="submit" value="Sende" /> submit ruft "onsubmit" vom form-tag auf und bei "return true" weiter mit "form-action" </form>
Das fieldset-Tag und das legend-Tag dienen der besseren Darstellung und Kennzeichnung von Formularen und Form-Elementen (ARIA).
Bei einer rein clientseitigen Formular-Nutzung (z.B. ECMAScript-Tools, Widgets) gibt es Vereinfachungen. Je nach ECMAScript-Programmierstil kann z.B. auf die name-Attribute verzichtet werden.
Bei einer rein clientseitigen Formular-Nutzung wird im form-Tag keine action-url benötigt und ein onsubmit im form-Tag sollte stets false zurück geben.
Hier ein Beispiel, das zeigt, wie mit this und dem name-Attribut eines Formelementes auf Werte zugegriffen werden kann. Die Funktion show_el_atts_von (el) gibt Attributwerte zu el aus.
<script> function show_el_atts_von (el) { var nodeName = '\n' + (el.nodeName || ''), s=""; s += nodeName+".type=" + el.type; s += nodeName+".name=" + el.name; s += nodeName+".value=" + el.value; s += nodeName+".checked=" + el.checked; window.alert(s); } </script>
Nachfolgend kann diese Funktion show_el_atts_von(el) getestet werden:
Formularzugriffe konnen (alternativ) auch mit DOM-Funktionen erfolgen, etwa
var ff = document.forms; var el = ff[0].elements[2]; // [2] weil auch fieldset ein Form-Element ist window.alert(el.value); teste //oder var form = document.getElementsByTagName('form'); var inp = form[0].getElementsByTagName('input'); window.alert(inp[1].value); teste
Zu DOM-Elementen gehören Änderungen infolge von Events. Wie kann sicher auf DOM-Element ( Nodes ) zugegriffen werden? Wie kann eine kritische, unübersichtliche Programmierung und Vermischung von DOM-Zugriffen mit den Verarbeitungen von Element-Werten mit ECMAScript minimiert werden?
In einer Seite sind die id - Bezeichner für DOM - Nodes eindeutig. Es bietet sich an, den Tag-id-Namen als eindeutigen key-Namen zu verwenden. Der Qelltext der beiden Funktionen get_alle_formwerte(), set_formwerte(obj) ist im Qelltext in dieser Seite. Etwa
<form action="#" onsubmit="return false;"> <input id="my_txt" type="text" value='input' /><br /> <input id="my_num" type="text" value='4711 init' /><br /> <input id="my_cb" type="checkbox" /> my Check Box<br /> <textarea id="my_ta" cols="40" rows="2">my Txtearea</textarea> </form> <script> function get_alle_formwerte() { var f = {}; f.my_num = parseInt(document.getElementById('my_num').value, 10); f.my_cb = document.getElementById('my_cb').checked || false; f.my_txt = document.getElementById('my_txt').value; f.my_ta = document.getElementById('my_ta').value; return f; } ... siehe Qelltext in dieser Seite </script>
Bitte testen:
get_alle_formwerte()
set_formwerte({my_cb:true,my_num:4712})
set_formwerte({ my_txt:"MEIN TEXT", my_ta:"MEINE TA"})
set_formwerte(form_werte_init)
Die (oft zahlreichen) Objekt-Attribute können mit einem geeigneten Debugger erkundet werden. Ist dies nicht möglich (Sehbehinderung, zu umständlich oder ähnliches), so kann ggf. die folgende Funktion myObj.show_el_atts() weiter helfen.
myObj.show_el_atts(['attnam','attnam',...]) zeigt die Werte zu den myObj-Attributnamen an. myObj.show_el_atts() zeigt zu myObj alle Attributnamen und die aktuellen Werte an.
Object.prototype.show_el_atts = function(props) { var el = this, nodeName = el.nodeName || '', p, i, br = "\n", s = "", build_str = function() { // innere Funktion if (el.hasOwnProperty(p)) { s += br + nodeName + "." + p + "=" + ((typeof el[p] === 'object') ? 'Element' : el[p]); } }; props = props || 'alle'; if (props==='alle') { for (p in el) { build_str(); } } else { // props ist ein Array: for (i = 0; i < props.length; i += 1) { p = props[i]; build_str(); } } return s; }
Hier ein Test:
Die folgende Funktion show_form_atts(nr) zeigt einen Überblick über ein/mehrere Formulare an. Beispiele:
show_form_atts(1) zeigt Elemente und wichtige Attribute von document.forms[1] an (entspricht document.getElementsByTagName('form')[1]) show_form_atts('FRAME1') zeigt Elemente und wichtige Attribute von document.forms['FRAME1'] an show_form_atts([0,'FRAME1']) zeigt Elemente und wichtige Attribute von document.forms[0] und document.forms['FRAME1'] an
Hier der ECMAScript-Quelltext:
function show_form_atts(nr) { var i, j, k, els, el, typ, s, nn, r=[], d=document, fs = d.forms; if(!fs){alert("error: kein form-tag");return null;} if (typeof nr === 'number' || typeof nr === 'string') { j = nr; nr = []; nr.push(j); } for (j = 0; j < nr.length; j += 1) {k=nr[j]; if(!d.forms[k]){alert("error: show_form_atts([nr "+k+" ???], '...')"); return null; } els = d.forms[k].elements; for (i = 0; i < els.length; i += 1) { el = els[i]; nn = el.nodeName.toLowerCase(); if (nn === 'textarea') { typ = nn; } else if (nn === 'input') { typ = el.type.toLowerCase(); } else { s=nn; } switch (typ) { case 'textarea': case 'hidden':case 'button': case 'text': s='value='+el.value; break; case 'radio': s='checked='+((el.checked)?true:false); break; case 'checkbox': s='checked='+ ((el.checked)?true:false); break; default: break; } r.push('\n.forms['+k+'].elements['+i+'] type="'+typ+'"\n |' + s); } } window.alert(r); }