if (document.all && !window.opera) {
Das ist eine ziemlich schlechte Browsererkennung.
Conditional Compilation wäre angemessener.
/*@cc_on
...
@*/
Allerdings ist es schwierig, die Unterstützung von change beim Formularelement festzustellen, da kann man wohl nur negativ vorgehen und die Sache für die Browser nachbauen, von denen man weiß, dass sie gerade kein change beim Form feuern...
for (var f in document.forms) {
for (var e in f.elements) {
Knotenlisten (HTMLCollection in DOM 2 HTML bzw. HTML 5) sollte man nicht mit for..in durchlaufen, da bekommt man unter Umständen Member wie length, item und namedItem und weitere irrelevante zurück.
e.onchange = function(f) { return function() { f.onchange(); }}(f);
Das ist ganz clever, nur sollte die Funktion nicht für jedes Element neu erzeugt werden, sondern in der äußeren document.forms-Schleife.
Ggf. kannst Du sicherheitshalber mit try/catch arbeiten, um Fehler zu vermeiden
Nein, DAS sollte man so gut wie NIE tun. Exceptions vermeidet man, indem man vorausschauend programmiert.
falls Elemente in forms.elements rutschen, die kein onchange-Event vertragen können.
Jedes Elementobjekt verträgt, dass man irgendwelche Member anlegt. Das ist nicht das Problem.
Mathias