Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it L'avatar di nourdine
    Registrato dal
    Nov 2005
    Messaggi
    1,130

    chiusura che non si valorizza correttamente

    ciao

    ho la necessita di registrare un f come listener di un array di elementi ... solo che questa f dovrebbe essere definita dinamicamente. vi posto il codice che non funziona e vi spiego perche':

    codice:
    for(var i=0; i<ps.length; i++){
       ps[i].onclick = function(){
            return function(){
                 alert(i)
            }	
       }()
    }

    come vedete l'alert cambia a secondo dell'elemento e la funzione registrata sul listener e' una chiusura. un unico problema: gli elementi sui cui ce la registrazioen del listener (tag

    ) sono 4 nel mio dom e l'alert spara sempre 4. mi aspetterei uno 0 al click sul primo paragrafo, un 1 al click sul secondo .. e via dicendo. come mai la inner function ritornata dal wrapper non si valorizzano in accordo all'indece i del ciclo for??

    grazie

  2. #2
    Utente di HTML.it L'avatar di Xinod
    Registrato dal
    Sep 2000
    Messaggi
    13,649
    codice:
    for(var i=0; i<ps.length; i++){
       ps[i].onclick = (function(k){
            return function(){
                 alert(k)
            }	
       })(i)
    }
    ciao

  3. #3
    Utente di HTML.it L'avatar di nourdine
    Registrato dal
    Nov 2005
    Messaggi
    1,130
    ok grazie

    non capisco pero' perche la funzione ritornata non ha accesso diretto a i e bisogna passare al wrapper il parametro per renderlo disponibile alla inner.

    vabbe ci rifletto su

  4. #4
    Utente di HTML.it L'avatar di Xinod
    Registrato dal
    Sep 2000
    Messaggi
    13,649
    e' cosi'

    poi possono esistere anche altre vie,
    per esempio un expando dell' elemento e all' esecuzione riprendere il valore dall' expando
    codice:
    for(var i=0; i<ps.length; i++){
       ps[i].tuoExpando = i;
       ps[i].onclick = tuaFunzione;
    }
    ...
    function tuaFunzione(){
      alert(this.tuoExpando);
    }
    e' brutto perche' invadi il DOM ma comodo perche' puoi risparmiarti n funzioni anonime

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.