l'errore è che con la riga (e la sua corrispondente W3C)
stai assegnando il riferimento ad una funzione (anonima) che elabora il riferimento all'oggetto tempobj.codice:tempobj.attachEvent("onchange", function(){prova(tempobj)} );
Il valore di tempobj è valutato dalla funzione anonima run-time e siccome tu nel ciclo lo avevi modificato, tempobj conterrà il riferimento dell'ultimo oggetto puntato.
Quello che devi fare per ottenere il tuo risultato è quello di mantenere "vivo" il riferimento al singolo oggetto valutato nel ciclo e non ricoprirlo dall'ultimo elaborato.
Per far ciò, aggiungo al tuo codice la funzione createListener che riceve come parametro proprio un riferimento ad un oggetto. La funzione è utilizzata proprio per mantenere vivo il riferimento ad un oggetto.
Ogni volta che viene chiamata la funzione createListener il riferimento all'oggetto passato viene mantenuto nello scope della funzione e sarà poi riutilizzato dal vero e proprio gestore dell'evento.
spero di essermi spiegato bene.codice:<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html> <head> <title>a</title> <meta name="vs_defaultClientScript" content="JavaScript"> <meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5"> <meta name="GENERATOR" content="Microsoft Visual Studio .NET 7.1"> <meta name="ProgId" content="VisualStudio.HTML"> <meta name="Originator" content="Microsoft Visual Studio .NET 7.1"> <script id="clientEventHandlersJS" language="javascript"> <!-- function createListener( ths, funzione){ ths.metodo = function(event){ funzione.call( ths, event); }; } function prova(){ alert(this.id);} function window_onload() { if (document.all || document.getElementById) { for (var i = 0; i < document.form1.length;i++) { var tempobj; tempobj = document.form1.elements[i]; createListener( tempobj, prova) ; if(tempobj.attachEvent) tempobj.attachEvent("onchange", tempobj.metodo ); else if(tempobj.addEventListener) tempobj.addEventListener("change", tempobj.metodo, false); } } } </script> </head> <body MS_POSITIONING="FlowLayout" language="javascript" onload="return window_onload()"> <form id="form1" name="form1" language="javascript"> <SELECT size=4 ID="SelectNome" NAME="Select1"> <OPTION value="0">Stefano</OPTION> <OPTION value="1">Carlo</OPTION> <OPTION value="2">Nicola</OPTION> <OPTION value="3">Pietro</OPTION> </SELECT> <SELECT size=4 ID="SelectColori" NAME="Select1"> <OPTION value="0">Rosso</OPTION> <OPTION value="1">Verde</OPTION> <OPTION value="2">Azzurro</OPTION> <OPTION value="3">Giallo</OPTION> </SELECT> </form> </body> </html>
ciauz
PS: il nome createListener non è proprio azzeccato per questo codice, ma lo lasciato perchè è il nome originario della funzione che uso nella libreria che ho scritto per la gestione degli eventi.

Rispondi quotando