Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it L'avatar di marco_c
    Registrato dal
    Jun 2004
    Messaggi
    1,047

    Scrivere il valore della variabile, non il nome

    Sicuramente è una stupidaggine ma mi sta facendo impazzire.

    Ho una funzione F che viene chiamata N volte. Prima di questa funzione è dichiarata una variabile globale che viene incrementata ogni volta che si chiama la funzione F.

    Dentro la funzione F si crea dinamicamente una tabella html con dei pulsanti e dei link attraverso i metodi document.createElement. uno di questi elementi è un pulsante a cui associo un evento OnClick che richiama una funzione G. Questa funzione G ha come parametro la variabile globale NUMERO. Ecco la sintesi del codice:

    Codice PHP:
    function g(n) { ... }

    var 
    numero=1;

    function 
    f() 

    ... 
    var 
    link=document.createElement("A");
    link.setAttribute('href','javascript:void(0);');
    link.onclick = function() { g(numero); }
    link.appendChild(img);
    ...
    numero++;

    La funzione F crea correttamente gli N elementi, ogni volta incrementando la variabile NUMERO. Il problema è che quando clicco sull'elemento creato (cioè eseguo l'onclick e quindi eseguo la funzione G) il valore di NUMERO non è quello che aveva mentre veniva invocata la funzione, ma il valore corrente, cioè il valore più alto.

    Mi spiego:

    1) NUMERO = 1 -> eseguo F -> genero un onclick che richiama G(numero)
    2) NUMERO = 2 -> eseguo F -> genero un onclick che richiama G(numero)
    3) NUMERO = 3 -> eseguo F -> genero un onclick che richiama G(numero)

    io mi aspetto di trovarmi 3 eventi onclick così
    elemento 1: onclick="g(1);"
    elemento 2: onclick="g(2);"
    elemento 3: onclick="g(3);"

    invece mi trovo tre eventi così
    elemento 1: onclick="g(numero);"
    elemento 2: onclick="g(numero);"
    elemento 3: onclick="g(numero);"

    con il risultato che verrà istanziato sempre il valore attuale di NUMERO, cioè 3:
    elemento 1: onclick="g(numero);" -> invoca g(3)
    elemento 2: onclick="g(numero);" -> invoca g(3)
    elemento 3: onclick="g(numero);" -> invoca g(3)

    Quindi: come faccio nella funzione F a scrivere g(x) dove x è il valore attuale di NUMERO, invece che scrivere g(numero)?
    Gli uomini si dividono in due categorie: i geni e quelli che dicono di esserlo. Io sono un genio.

  2. #2
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,116
    :master: non so; prova a vedere se questo esempio si adatta al tuo quesito:

    codice:
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <title>Untitled Page</title>
    <script language="javascript" type="text/javascript">
    // <!CDATA[
    
    function g(n)
    {
        alert(n);
    }
    
    function Button1_onclick() 
    {
        var d = document.getElementById("div1");
        d.innerHTML = "";
        
        for(var i = 1; i <= 3; i++)
        {
            var link = document.createElement("a");
            link.setAttribute('href','#');
            link.appendChild( document.createTextNode("Testo " + i) );
            link.onclick = function() { g(i); return false;}
            d.appendChild(link);
            d.appendChild( document.createElement("
    ") );
            d.appendChild( document.createElement("
    ") );
        }
    }
    
    function Button2_onclick() 
    {
        var d = document.getElementById("div1");
        d.innerHTML = "";
        
        for(var i = 1; i <= 3; i++)
        {
            var link = document.createElement("a");
            link.setAttribute('href','#');
            link.appendChild( document.createTextNode("Testo " + i) );
            link.onclick = (function(s){return function(){g(s);return false};})(i);
            d.appendChild(link);
            d.appendChild( document.createElement("
    ") );
            d.appendChild( document.createElement("
    ") );
        }
    }
    
    function Button3_onclick() 
    {
        var d = document.getElementById("div1");
        d.innerHTML = "";
        
        for(var i = 1; i <= 3; i++)
        {
            var link = document.createElement("a");
            link.setAttribute('href','#');
            link.appendChild( document.createTextNode("Testo " + i) );
            link.setAttribute("i", i);
            link.onclick = function() { g(this.i); return false;}
            d.appendChild(link);
            d.appendChild( document.createElement("
    ") );
            d.appendChild( document.createElement("
    ") );
        }
    }
    // ]]>
    </script>
    </head>
    <body>
        <input id="Button1" type="button" value="button1" onclick="return Button1_onclick()" /> 
        <input id="Button2" type="button" value="button2" onclick="return Button2_onclick()" /> 
        <input id="Button3" type="button" value="button3" onclick="return Button3_onclick()" /> 
        <hr />
        <div id="div1"></div>
    
    </body>
    </html>
    Pietro

  3. #3
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,116
    http://forum.html.it/forum/showthrea...8#post11118638
    :quote: Questo link è una discussione molto interessante di andr3a : buona lettura.
    Pietro

  4. #4
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,116
    con IE7 funziona, ma con Firefox2 e Opera, no

    bisogna correggere:
    d.appendChild( document.createElement("
    ")
    con
    d.appendChild( document.createElement("br")


    link.setAttribute("i", i);
    con
    link.i = i;

    Pietro

  5. #5
    Utente di HTML.it L'avatar di marco_c
    Registrato dal
    Jun 2004
    Messaggi
    1,047
    Rispondo al tuo primo post (grazie per le risposte).

    Funziona, ma non è quello di cui ho bisogno. Non sapendo a priori quante volte verrà eseguita la funzione F (3 era un esempio) ho necessità di avere come contatore una variabile globale e non privata alla funzione, altrimenti una volta uscito dalla funzione perdo il valore di quante volte l'ho chiamata. Ed è proprio la presenza della variabile globale che fa nascere il problema.
    Gli uomini si dividono in due categorie: i geni e quelli che dicono di esserlo. Io sono un genio.

  6. #6
    forse e' un po' brutale, ma hai provato con qualcosa del genere?

    eval("link.onclick = function() { g("+numero+"); } ");

  7. #7
    Utente di HTML.it L'avatar di marco_c
    Registrato dal
    Jun 2004
    Messaggi
    1,047
    Originariamente inviato da marco_c
    Rispondo al tuo primo post (grazie per le risposte).

    Funziona, ma non è quello di cui ho bisogno. Non sapendo a priori quante volte verrà eseguita la funzione F (3 era un esempio) ho necessità di avere come contatore una variabile globale e non privata alla funzione, altrimenti una volta uscito dalla funzione perdo il valore di quante volte l'ho chiamata. Ed è proprio la presenza della variabile globale che fa nascere il problema.
    Credo di esserci riuscito. L'esempio di pietro09 era corretto, mi è bastato togliere il for interno e dichiarare i come variabile globale. La modifica determinante è l'uso di this.i al posto di i. this.i mi rimpiazza il valore di i in quel momento e non il valore di i finale. Grazie mille.
    Gli uomini si dividono in due categorie: i geni e quelli che dicono di esserlo. Io sono un genio.

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.