Newsgroup: it.comp.lang.javascript
Titolo: Nodo dom che non fa quello che dovrebbe..

Il codice è molto semplice ed il problema e' sostanzialmente questo:
creo un nodo dom (DIV) con un attributo onclick ed una funziona
javascript associata all'onclick. Quando clicco sul DIV creato tramite
javascript il comando  non viene eseguito.
Se invece il nodo con l'istruzione sul onclick e' gia' presente
nell'html originale, allora la funzione associata (qualunque essa sia)
viene eseguita.
Il problema accade solo in IE (in firefox tutto corretto).
In cosa sbaglio?
ecco il codice (che ho minimizzato per rendere veloce il capire che
cosa fa il javascript):
--------------------------------
<html>
  <head></head>
  <body>
    <table id="calendario">
      <tbody><tr><td id="giorno0">
        <div id="impegno0" onclick=strong(0)>Questo funziona</div>
      </td></tr>
    </tbody></table>
    <script>
      function strong(num)
      {
        var click = document.getElementById('impegno'+num);
        click.style.color = 'red';
      }
      var destinazione = document.getElementById('giorno0');
      var div = document.createElement("div");
      div.setAttribute('id', 'impegno1');
      div.setAttribute('onclick', 'strong(1)' );
      var contenuto = 'questo non funziona';
      div.appendChild(document.createTextNode(contenuto));
      destinazione.appendChild(div);
    </script>
 
  </body>
</html>
grazie :)

 grazie :)
Bitte.
-- 
ZER0
~ .. six thousand and forty five days, two hours, thirty eight minutes, twelve seconds.
That is when the world ended.

ora provo queste soluzioni:
elem.setAttribute("onclick", new Function("alert('ok');"));
elem.setAttribute("onclick", function() { alert('ok'); });
elem.onclick = function() { ... };
ma non mi è chiaro dal thread che mi hai linkato quale sia la
soluzione (il motivo invece di questo comportamento è chiarissimo).

 soluzione 
Il fatto di *non* usare setAttribute per assegnazione di event-handler.
La procedura corretta è l'uso di addEventListener (per i browser che
supportano le API standard del w3c), attachEvent (per IE) oppure l'ultima
riga da te scritta.
-- 
ZER0
~ .. six thousand and forty five days, four hours, fifty two minutes, three seconds.


Solo l'ultima è corretta. 
perfetto, tutto chiarissimo. Grazie ancora

effetto collaterale (mentre scrivo penso ad una soluzione, ma ben venga
un aiuto):
ho una serie di oggetti (che prendo da un getElementsByTagName).
ad ogni oggetto voglio che sia associata una funzione sull'onclick, per
esempio:
CICLO PER i (da 0 a 10)
  oggetto[i].onClick = function() { alert(i); }
FINE CICLO
il problema è che alla fine del ciclo i=10 e quindi se clicco su ogni
oggetto, l'effetto è:
mi stampa in alert sempre il numero 10 (mentre io vorrei che per ogni
oggetto mi stampi il suo numero di ordinamento).
idee? grazie mille :)

 oggetto mi stampi il suo numero di ordinamento).
Non penso che il tuo scopo finale sia proprio questo, giusto? Non avrebbe
molto senso. Spiega esattamente cosa alla fine vorresti ottenere, e
troveremo la soluzione migliore al tuo caso.
Se invece il tuo scopo finale è proprio quello di fare l'alert di "i", si
può fare in un paio di modi, ma sono poi difficilmente "riciclabili" per
fare altro che non sia stampare il valore di ordinamento.. :) questo è il
motivo della domanda di cui sopra.
-- 
ZER0
~ .. six thousand and forty five days, eight hours, forty eight minutes, eight seconds.


 idee? grazie mille :)
dentro la function i non e' dichiarato, quindi se la variabile i non
esiste nello scope globale viene mostrato un alert con il valore
undefined. Se invece esiste, ti viene mostrato il suo valore che
_nulla_ha_a_che_vedere_ con quello del ciclo for al momento
dell'assegnazione.
Per fare quello che vorresti tu dovresti scrivere:
eval('oggetto[' + i + '].onclick = function() { alert(' + i + '); }');
-- 
Ho capito che tipo sei, sei uno di quelli che mandano i messaggini
con le k inframezzati da pletore di puntini di sospensione

@zero:
ecco cosa sto facendo:
http://www.sanbaldo.com/wordpress/?p=32
ne sto approfittando per fare degli sperimenti di iterazione con
javascript (sto imparando a risolvere i problemi - quindi non sparare a
zero su castronerie che potrei aver commesso).
i punti in cui ho problemi sono questi:
div.setAttribute('onclick', bla bla)..
spero che sia chiaro cosa voglio ottenere (quando clicco un DIV voglio
poterlo "selezionare")

questo "eval" funziona (non lo conoscevo ed è potentissimo)
sono felicissimo!!! :))
ora sono in debito con tutti voi :)



 poterlo "selezionare")
Come supponevo.
Il tuo approccio è sbagliato, benché comprensibile, in quanto dici di
essere agli inizi.
Prendo ad esempio la tua funzione "strong" e ti mostro come andrebbe fatta:
function strong(){
	with (this.style){
		if (color=='red'){
			color='black';
			fontWeight='normal';
		}else{
			color='red';
			fontWeight='bold';
		}
	}
}
E poi semplicemente:
elem.onclick=strong;
Ancora meglio, sarebbe che tu gestissi questo genere di cose tramite classi
CSS (separazione del comportamento dalla forma):
E quindi:
<style type="text/css">
	.strong{
		color:red;
		font-weight:bold;
	}
</style>
La funzione strong diventerebbe quindi, semplicemente:
function strong(){
	this.className=this.className=="strong"?"":"strong";
}
L'assegnazione rimane, ovviamente, la medesima.
I vantaggi di questo approccio sono abbastanza evidenti: evitando di
toccare il codice javascript, puoi modificare l'aspetto dell'elemento
selezionato agendo unicamente sul css.
-- 
ZER0
~ .. six thousand and forty five days, sixteen hours, fifty six minutes, eleven seconds.
That is when the world was ended.
on air ~ "  INCOMPLETE   Limp Bizkit-Behind blue eyes3e4fa6cc7b380482d108e1dbd04d98950042480000800000ac440000010f"

 questo "eval" funziona (non lo conoscevo ed è potentissimo)
Attento a non abusarne. A mio avviso l'eval su JS è un po' come il goto nei
vecchi linguaggi di programmazione, e come tale sottostà alle medesime
regole di utilizzo. Ovvero, bisogna tendere a non usarlo.
Anche se, come recita un "detto" informatico, "il goto è come il
vaffanculo: quando ce vo', ce vo' ".. stesso discorso per l'eval..
personalmente, in JS su web, c'è un unico caso in cui devo utilizzarlo.
E' in quell'unico caso che "ce vo'" veramente :)
-- 
ZER0
~ .. six thousand and forty five days, seventeen hours, three minutes, fifty seven seconds.


 vaffanculo: quando ce vo', ce vo' ".. stesso discorso per l'eval..
ROTFL ! Questa la riciclo
concordo pienamente
-- 
"E' l' ignoranza che crea l'intolleranza
 di gente cieca e senza coscienza"
									  S.S.S.