Visualizzazione dei risultati da 1 a 3 su 3
  1. #1
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,116

    Assegnare eventi via DOM

    Guardate questa paginetta:
    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 window_onload() {
    	if (document.all || document.getElementById) 
    	{ 
    		for (var i = 0; i < document.form1.length;i++) 
    		{ 
    			var tempobj = document.form1.elements[i]; 
    			if(tempobj.attachEvent)
    				tempobj.attachEvent("onchange", function(){prova(tempobj)} );
    			else if(tempobj.addEventListener)
    				tempobj.addEventListener("change", function(){prova(tempobj)}, false);
    		} 
    	}
    	
    }
    function prova(v)
    {
    	alert(v.id );
    }
    
    //-->
    		</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>
    Dentro un form ho due select, SelectNome e SelectColori.
    Nell'evento load della pagina, faccio la scansione di tutti gli elementi del form ed assegno ad ognuno, per l'evento onchange, la funzione prova, passandole come parametro il controllo stesso.
    Adesso, quando cambio la selezione di un Select, ottengo come messaggio sempre SelectColori, cioè, ogni controllo, nell'evento change, passa l'ultimo controllo e non se stesso :master:

    Mi potreste aiutare a capire dove sbaglio?
    Pietro

  2. #2
    Utente di HTML.it
    Registrato dal
    Jan 2002
    Messaggi
    633
    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.
    Alcuni miei articoli in PRO.HTML.IT: JavaScript | DHTML | DOM
    Sviluppo : wedev | forum

  3. #3
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,116
    Allora, sono felicissimo della tua risposta e ti ringrazio prima di prendere il tuo scritto e metterlo nella libreria delle funzioni utili

    Ciao e grazie ancora
    Pietro

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.