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

    Argomenti con setInterval

    Ciao...
    Sto lavorando con il setInterval, ho avuto qualche problema, ma grazie a voi li ho risolti, mi manca solo l'ultimo (spero)...
    Ho queste due pagine, che differiscono solo nel metodo che uso per chiamare la funzione prova2:
    codice:
       ...
    <script>
    function prova(ogg) {
    	alert(ogg.x);
    	prova2(ogg);
    }
    function prova2(ogg) {
    	alert(ogg.x);
    }
    </script>
    </head>
    <body>
    Test
       ...
    codice:
       ...
    <script>
    function prova(ogg) {
    	alert(ogg.x);
    	setInterval("prova2('"+ogg+"')",1500);
    }
    function prova2(ogg) {
    	alert(ogg.x);
    }
    </script>
    </head>
    <body>
    Test con setInterval
       ...
    Queste due pagine dovrebbero in teoria fare la stessa identica cosa, con l'unica differenza che la seconda dovrebbe continuare a richiamare la funzione prova2 all'infinito, ogni 1,5 secondi...
    Però non avviene ciò:
    I due alert del primo script coincidono, e sono:
    [list=1][*]-25[*]-25[/list=1]Mentre i due del secondo non coincidono, sono:
    [list=1][*]-25[*]undefined (questo alert viene richiamato ogni 1,5 e mantiene sempre lo stesso valore)[/list=1]Sembra quindi che passando l'argomento ogg, usando il setInterval, esso perda qualcosa...
    Perchè, e come rimedio a ciò?
    Grazie!

  2. #2
    Utente di HTML.it
    Registrato dal
    Sep 2001
    Messaggi
    21,188
    Nel primo caso ogg e` un oggetto, che viene correttamente letto da prova1 e passato come oggetto a prova2.

    Nel secondo caso, la chiamata a prova2 viene costruita mediante stringe, per cui non viene passato l'oggetto, ma il suo nome, che furoi dal contesto della funzione prova1 non ha senso.

    Puoi salvarti l'oggetto in una variabile globale, che viene poi vista da tutte le funzioni:

    <script>
    var salvaogg;
    function prova(ogg) {
    alert(ogg.x);
    salvaogg = ogg;
    prova2();
    }
    function prova2() {
    var ogg = salvaogg;
    alert(ogg.x);
    }
    </script>

    Nota che in prova2() c'e` un passaggio inutile, se non ai fini didattici

    Ciao
    Michele
    Nuova politica di maggiore severita` sui titoli delle discussioni: (ri)leggete il regolamento
    No domande tecniche in messaggi privati

  3. #3
    Utente di HTML.it L'avatar di floyd
    Registrato dal
    Apr 2001
    Messaggi
    3,837
    prova così
    <script>
    var o;
    function prova(ogg) {
    alert(ogg.x);
    o = ogg;
    setInterval("prova2(o)",1500);
    }
    function prova2(ogg) {
    alert(ogg.x);
    }

  4. #4
    Scusate non ho spiegato tutto...
    Quello script è solo un esempio, il più corto possibile, per simulare ciò che non mi funziona in uno script molto più esteso e complicato...
    Nell'altro script, ho diversi oggetti, che cliccandoci sopra richiedono la funzione in questo modo:

    Primo ogg
    Secondo ogg
    Terzo ogg

    La funzione che uso nell'altro script esegue dei passaggi un pò più complicati, e "ogg" contiene il "this" dell'oggetto che sto usando, se io però nella funzione "prova" assegno "ogg" ad un'altra variabile (ad esempio pippo = ogg), pippo sarebbe sempre la stessa, quindi non potrei più sapere quale oggetto sto utilizzando...
    Nel caso che vi ho mostrato, "ogg" non è una vera e propria variabile, dato che devo passargliela, ed è riconosciuta solo nell'esecuzione corrente della funzione...
    Non so se avete capito bene...
    Grazie comunque.

  5. #5
    Utente di HTML.it
    Registrato dal
    Sep 2001
    Messaggi
    21,188
    Mi sa che avevamo capito tutti e due.

    Il fatto e` che non puoi montare una stringa e sperare che tale stringa abbai il riferimento all'oggetto.

    La soluzione di floyd dovrebbe funzionare: in tal caso tu passi alla prova2() il riferimento all'oggetto, nella soluzione mia, ti salvi il riferimento in una variabile globale, ed anche questa dovrebbe funzionare.

    In ambedue i casi la funzione prova2() che viene chiamata ogni 1500 ms agisce sempre sullo stesso oggetto.
    Per cambiare oggetto, nel mio caso basta che modifichi la variabile globale (anche con un qualsiasi evento), nel caso di floyd devi fermare e far ripartire il setInterval().

    Ciao
    Michele
    Nuova politica di maggiore severita` sui titoli delle discussioni: (ri)leggete il regolamento
    No domande tecniche in messaggi privati

  6. #6
    Grazie mille
    Ce l'ho finalmente fatta (ci sono un altro paio di errori, ma penso di poterli risolvere da me )...
    Grazie ancora... 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 © 2024 vBulletin Solutions, Inc. All rights reserved.