Visualizzazione dei risultati da 1 a 4 su 4
  1. #1

    funzioni diverse su addEventListener

    Salve a tutti,
    sono ore che cerco inutilmente di far funzionare questo codice: il problema mi è chiaro, ma non trovo soluzione.

    codice:
    window.onload= function(){
       document.getElementById('nav').onmouseout=function(){
          moveToDiv(document.getElementById(cur));
       };
       
       var figli= document.getElementById('nav').childNodes;
       for(var i=0; i<figli.length; i++){
          if(figli[i].nodeType != "3"){
             figli[i].addEventListener("mouseover",function (){
                window.alert(figli[i]);
                moveToDiv(figli[i]);
             }, false);
          }
       }
       /*document.getElementById('lnav_home').onmouseover=function(){
          moveToDiv(document.getElementById('lnav_home'));
       };
       document.getElementById('lnav_azienda').onmouseover=function(){
          moveToDiv(document.getElementById('lnav_azienda'));
       };
       document.getElementById('lnav_servizi').onmouseover=function(){
          moveToDiv(document.getElementById('lnav_servizi'));
       };
       document.getElementById('lnav_contatti').onmouseover=function(){
          moveToDiv(document.getElementById('lnav_contatti'));
       };
       */
    };
    Quando questo codice viene eseguito l'alert ritorna sempre "undefined". Questo perchè cerca figli[i], ma i in quel momento è più grande della lunghezza dell'array figli. Quello che io stò cercando di ottenere invece è che ogni volta ogni "nodo" ricordi il valore che la variabile i aveva al momento in cui l'eventListener è stato aggiunto e chiami una funzione parametrizzata con quella precisa i, non con il valore che i assume alla fine. (in pratica vorrei dinamimicamente ottenere il codice tra i commenti /**/)
    Spero possiate aiutarmi.

    Grazie in anticipo
    L’uovo ha una forma perfetta benché sia fatto col culo. (Bruno Munari)

  2. #2
    Utente di HTML.it L'avatar di Xinod
    Registrato dal
    Sep 2000
    Messaggi
    13,649
    occhio che aggiungere un evento con addEventElistener non equivale a settarlo come fosse un gestore evento in linea

    a parte questo, quello che ti serve e' una closure, ti faccio un esempio per tenere in scope i, poi vedi tu cosa effettivamente ti interessa passare
    codice:
    figli[i].addEventListener("mouseover",(function(i){return function(){alert(i)}})(i), false);
    ciao

  3. #3
    Originariamente inviato da Xinod
    occhio che aggiungere un evento con addEventElistener non equivale a settarlo come fosse un gestore evento in linea
    Quale sarebbe la differenza?
    a parte questo, quello che ti serve e' una closure, ti faccio un esempio per tenere in scope i, poi vedi tu cosa effettivamente ti interessa passare
    codice:
    figli[i].addEventListener("mouseover",(function(i){return function(){alert(i)}})(i), false);
    E' geniale, non ci avrei mai pensato! Controllo subito se funziona! Grazie mille!
    EDIT: Funziona! Grazie ancora!

    Nel frattempo ho trovato un altra soluzione (molto semplice, non so come ho fatto a non pensarci prima):
    codice:
     
    cur.addEventListener("mouseover",function (){
                moveToDiv(this);
                }, false);
    L’uovo ha una forma perfetta benché sia fatto col culo. (Bruno Munari)

  4. #4
    Utente di HTML.it L'avatar di Xinod
    Registrato dal
    Sep 2000
    Messaggi
    13,649
    che molteplici richiami ad addEventListener/attachEvent non si sovrascrivono,
    un brutale elemento.onclick=... sovrascrive quanto eventualmente fosse settato in precedenza da eseguire al click

    ovviamente passare this ti semplifica la vita, fino a quando non usi attachEvent per renderlo IE compatibile e il this non e' piu' quello che ti aspetti

    sappi comunque che settando cosi' un gestore evento
    elemento.onclick=funzione
    in funzione this sara' sempre l' elemento

    ciao

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.