l'errore è che con la riga (e la sua corrispondente W3C)
codice:
tempobj.attachEvent("onchange", function(){prova(tempobj)} );
stai assegnando il riferimento ad una funzione (anonima) che elabora il riferimento all'oggetto 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.
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>
spero di essermi spiegato bene.
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.