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

    Chiamare una funzione che è contenuta in un'altra

    Buonasera a tutti.
    Vorrei sapere se è possibile chiamare una funzione contenuta all'interno di un'altra.
    Ho il seguente codice:

    codice:
    <html>
    <head>
    <script language="javascript">
    
    function wait(ms)
    {
    var ts=0;
    
    function cycle()
    {
    if (ts<ms) {++ts;document.getElementById('timebox2').value=ts;}
    else {window.clearInterval('t0');alert("ho finito!");}
    }
    
    var t0=window.setInterval("cycle();",1);
    }
    
    </script>
    </head>
    
    <body>
    <input id="timebox" type="text" style="text-align:right;">
    <input type="button" onclick="wait(parseInt(document.getElementById('timebox').value));" value="Start timer">
    
    
    
    
    <input id="timebox2" type="text">
    </body>
    
    </html>
    dove la funzione cycle(), più interna a wait(), usa le variabili ms (millisecondi, passati come argomento) e ts (timer start, impostato a zero) della funzione wait(). Ora, il problema è che con il window.setInterval("cycle();",1) mi viene restituito l'errore "previsto oggetto" probabilmente perché cycle() dovrebbe trovarsi, per essere eseguita da window.setInterval(), allo stesso "livello" di wait(), e non al suo interno!
    Se l'unica soluzione è scorpare le 2 funzioni, mi arrenderò, ma se c'è un modo per chiamare la funzione cycle() della funzione wait() mi piacerebbe mantenere questa struttura.
    Ho già provato in moltissimi modi, fra cui il disperato tentativo window.setInterval("wait.cycle()",1) (come se cycle fosse un metodo di wait, ma capisco di starmi veramente arrampicando sugli specchi! ).
    Qualche idea?
    Grazie a tutti anticipatamente!

    Andrea
    Don't know what I want, but I know how to get it...

  2. #2
    non puoi dichiarare una funzione dentro un'altra....mi spieghi la necessità di farlo?

  3. #3
    non puoi dichiarare una funzione dentro un'altra....
    Beh, per potere posso, ho trovato numerosi link in internet che parlano di funzioni javascript annidate, anche su più livelli!


    mi spieghi la necessità di farlo?
    È presto detto: la funzione cycle() utilizza delle variabili locali a wait(), ossia ms e ts; per "tirare fuori" la funzione cycle() da wait() dovrei dichiararle globali o passarle come argomenti con una schifezza del tipo:
    window.setInterval("cycle("+ms+","+ts+");",1);

    Il motivo per cui lo chiedo, comunque, va ben al di là di scopi puramente estetici, ma è una domanda del tipo "si può? / non si può? / se sì, come?".

    Grazie a chiunque vorrà darmi un'indicazione.


    Andrea
    Don't know what I want, but I know how to get it...

  4. #4
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,116
    prova così, ma non ho capito molto :master:

    codice:
    function Button1_onclick() 
    {
        wait(100);
    
    }
    
    
    function wait(ms)
    {
        var ts = 0;
        this.cycle = function()
        {
            if (ts < ms) 
            {
                document.getElementById('timebox2').value = ++ts;
            }
            else 
            {
                window.clearInterval(t0);
                alert("ho finito!");
            }
        }
    
        var t0  =   window.setInterval(function(){this.cycle();},1);
    }
    Pietro

  5. #5
    ops...hai ragione....mi ero confuso col php....eheheh

  6. #6

    Grande!

    Grande Pietro, hai capito eccome!!!
    Funziona perfettamente, ancora grazie mille!

    Andrea
    P.S. Mi spieghi perché su tutte le dispense online di javascript che ho trovato, il comando window.setInterval() vuole come primo argomento una stringa di istruzioni (o funzioni) da eseguire, e tu invece hai scritto window.setInterval(function(){this.cycle();},1); ??? Funzionava lo stesso scrivere window.setInterval("this.cycle();",1); ??? E scrivere, senza le virgolette, semplicemente window.setInterval(this.cycle(),1); ???
    Don't know what I want, but I know how to get it...

  7. #7
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,116
    basta prendere un qualunque manuale per vedere che setInterval ha due forme:


    1) window.setInterval(codice, intervallo)

    2) window.setIntervallo(funzione, intervallo, args...)

    codice = una stringa di codice javascript da eseguire periodicamente

    funzione = una funzione javascript da eseguire periodicamente.

    args... = qualsiasi numero di valori arbitrari da passare come argomenti a ogni chiamata di funzione.

    Pietro

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.