for (var i = 0;i <document.forms.length; i++) {
var f = document.forms[i];
for (var j = 0; j < f.elements.length;j++) {
var e = f.elements[j];
e.onchange = function() { eval( f.onchange);};
Ich sags ungerne: f zeigt nach Ablauf der Schleife immer auf das letzte Formular.
Closures und Schleifen sind ein Fallstrick, den man am besten umgeht.
das this in dem Fall das Element ist.
Zum Thema »zuviel des Guten« habe ich natürlich etwas beizusteuern ;-)
<!DOCTYPE html>
<form id="formular1" onchange="alert(this.id)">
<input type="text" name="a">
<input type="text" name="b">
</form>
<form id="formular2" onchange="alert(this.id)">
<input type="text" name="a">
<input type="text" name="b">
</form>
<form id="formular3">
<input type="text" name="a">
<input type="text" name="b">
</form>
<form id="formular4">
<input type="text" name="a">
<input type="text" name="b">
</form>
<script type="text/javascript">
/* Es sollte auch möglich sein, die Handler-Funktion traditionell zu registrieren */
document.getElementById("formular3").onchange = function () {
alert(this.id);
};
/* Ich überlege mir noch was für attachEvent ;) */
/*@cc_on
window.onload = function () { // Oder wo und wie man die Funktion auch immer starten will
// Ein generischer Handler außerhalb der Schleifen.
// Hier könnte man natürlich noch Daten wie this und event übergeben.
var handler = function () { this.form.onchange(); };
for (var i = 0; i < document.forms.length; i++) {
var f = document.forms[i];
if (typeof f.onchange == "string") {
// Anstatt eval zu wiederholen, übersetzen wir den Code nur einmal.
// Der Kontext stimmt durch den Aufruf über this.form.onchange()
f.onchange = new Function(f.onchange);
}
if (typeof f.onchange == "function") {
for (var j = 0; j < f.elements.length; j++) {
f.elements[j].onchange = handler;
}
}
}
};
@*/
</script>
Mathias