Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 16

Discussione: window.setTimeout

  1. #1

    window.setTimeout

    Ciao a tutti, ho una domanda:

    ho questa funzione che carica una canzone e (qui per es.) dopo 5 secondi carica la successiva...

    function caricaList(genere){
    var x=1;
    var brano="./musica/"+genere+"/SONG"+x;
    for (;x<=10;x++){
    carica(brano);
    x++;
    setTimeout("carica(brano)",5000);
    }
    }


    Il problema è che la prima carica funziona perfetta, la canzone parte, ma dopo 5 secondi non succede niente...ho provato anche con window.setTimeout ma niente e non credo il problema sia quello visto che l'oggetto window viene creato all'apertura della pagina...

    qualcuno ha un'idea?

    ps. Il for funziona alla perfezione...ho controllato con delle alert e la x viene incrementata come si deve...


    Grazie a tutti in anticipo

    Irene

  2. #2
    Frontend samurai L'avatar di fcaldera
    Registrato dal
    Feb 2003
    Messaggi
    12,924
    perchè dentro il ciclo for esegui la stessa funzione "carica()" due volte? :master:
    Vuoi aiutare la riforestazione responsabile?

    Iscriviti a Ecologi e inizia a rimuovere la tua impronta ecologica (30 alberi extra usando il referral)

  3. #3
    la prima carica ad es. SONG1

    poi x incrementa e la setTimeout fa dopo 5 secondi la carica ma di SONG2...

    già... però hai ragione... poi la terza canzone viene caricata subito dopo la seconda e questo non va bene... mmm

  4. #4
    Frontend samurai L'avatar di fcaldera
    Registrato dal
    Feb 2003
    Messaggi
    12,924
    c'è qualcosa che non mi torna... i brani che cerchi di caricare hanno una durata identica (e inferiore a 5 secondi) oppure hanno durate differenti?
    Vuoi aiutare la riforestazione responsabile?

    Iscriviti a Ecologi e inizia a rimuovere la tua impronta ecologica (30 alberi extra usando il referral)

  5. #5
    hanno durate differenti... infatti successivamente avrei creato un array di tempi da passare come parametro alla setTimeout a seconda della canzone caricata e della successiva... ho messo 5 secondi solo per vedere se effettivamente dopo 5 secondi mi caricava la seconda canzone, ma non funziona...

  6. #6
    Frontend samurai L'avatar di fcaldera
    Registrato dal
    Feb 2003
    Messaggi
    12,924
    posta il contenuto della funzione carica()
    Vuoi aiutare la riforestazione responsabile?

    Iscriviti a Ecologi e inizia a rimuovere la tua impronta ecologica (30 alberi extra usando il referral)

  7. #7
    ti posto anche qualcos'altro perchè altrimenti è incapibile...
    codice:
    <script>
    <!--
    var beginHTML =	
    	"<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" " +
        "\"http://www.w3.org/TR/html4/loose.dtd\"> " +
        "<html><head><title>brano<\/title></head><body>
    
    <embed src=\"";
    	
    var endHTML = 
    	".mid\" autostart=\"true\" width=\"0\" height=\"0\"> </p></body></html>";
    
    function carica(brano) {  
    	frames['schermo'].document.open();
    	frames['schermo'].document.writeln(beginHTML + brano + endHTML);
    	frames['schermo'].document.close();
    	}
    	
    function caricaList(genere){
    	var sfondo="../immagini/sfondo"+genere+".jpg";
    	document.getElementById("lista"+genere).style.display="block";
    	document.body.style.backgroundImage="url(sfondo)";
    	
    	var x=1;
    	var brano="./musica/"+genere+"/SONG"+x;
    	for (;x<=10;x++){
        carica(brano);
    	x++;
        window.setTimeout("carica(brano)",5000);
    		}
    	}
    -->
    </script>
    
    <--
    un po' di roba -->
    
    <iframe name="schermo" src="" width="1" height="0" frameborder="0"></iframe>
    spero sia più chiaro...

  8. #8
    Utente bannato
    Registrato dal
    Dec 2008
    Messaggi
    78

    ../

    &#160; &#160; &#160; var brano="./musica/"+genere+"/SONG"+x;

    vorrà ../ con due punti, davanti:

    &#160; &#160; &#160; var brano="../musica/"+genere+"/SONG"+x;

    ../ fa salire indietro di una Directory, per la localizzazione del file. Questo vuol dire che il Documento di riferimento (file .html) è archiviato a sua volta in una Cartella (diciamo: "master") che si trova assieme a "musica" entrambe contenute in una Cartella superiore; in altre parole, se apri il box di dialogo da File => Apri ti troverai le cartelle "master" "musica" "immagini" assieme, ma non già i singoli file, e non il file.html della pagina in questione: per accedere a questo, devi entrare nelle specifica cartella "master" che lo contiene (e allora non vedi più le altre due).
    Allora sì, ci vuole il ../
    Se invece assieme a "musica" e "immagini" c'è già il file.html sciolto, 'nudo e crudo', allora direttamente musica/sottocartella/filename.mid e immagini/filename.jpg sono i percorsi.
    Stai facendo un lavoro notevole e non credo che ti stia confondendo con questo; ma l'ho specificato per quant'altri.
    Si può anche fare ../../ per salire due Directories.


    Commenta (escludi) momentaneamente con // le prime tre righe della function che riguardano lista e background, che potrebbero anch'esse bloccare il percorso della funzione:

    &#160; &#160; &#160; // document.body.style.backgroundImage="url("+sfondo+")";
    va sicuramente così ricorretto, come abbiamo visto in altro thread.

    Poi ci vorrà anche "qualcosa" per riportare a display="none"; la lista correntemente aperta, nel momento che ne fai visualizzare un'altra.

    P.S.: mi sovviene da mie trascorse elaborazioni tipo questa tua, che setTimeout("", ) ha problemi a "tirarsi dentro" una variabile per la funzione che richiama; al posto del termine di servizio brano in
    setTimeout("carica(brano)",5000);
    vorrebbe il valore reale:
    setTimeout("carica('percorso/filename.mid')" ,5000);

  9. #9
    Utente bannato
    Registrato dal
    Dec 2008
    Messaggi
    78

    invio variabile tramite setTimeout() = PROBLEMI !

    Difatti, questo funziona, come postato sotto, senza Timer: le due funzioni si passano l'argomento l'un l'altra.

    caricaList(genere) riceve l'URL reale del brano .mp3 dal pulsante, lo veicola sul termine di servizio genere, invoca la carica() ancora dandole genere che poi sull'altra funzione viene preso come brano e regolarmente veicolato alla stringa di esecuzione che procede con successo.

    codice:
    function carica(brano) {
    	document.getElementById("schermo").innerHTML = beginHTML + brano + endHTML;
    	}
    
    function caricaList(genere){
            carica(genere);
    	}
    Ma se ci metti di mezzo il setTimeout questo trasferimento non avviene più !!!
    codice:
    function caricaList(genere){
            window.setTimeout("carica(genere)", 2000);
    	}
    window. o non window. che sia.

    codice:
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
    <head>
    <title>Play List</title>
    
    <script type="text/javascript">
    <!--
    var beginHTML = "
    
    <embed src=\"";
    
    var endHTML = "\" autostart=\"true\" width=\"180\" height=\"16\"> </p>scritto  .innerHTML";
    
    
    function carica(brano) {
    	                     alert("function carica(brano)   (se avviata) \n\nbrano =  "+brano);
    
    	document.getElementById("schermo").innerHTML = beginHTML + brano + endHTML;
    	}
    
    
    function caricaList(genere){
    
    	alert("genere =  "+genere);
    
            carica(genere);
    
    	alert("function caricaList(genere)   (se eseguita) \n\ngenere =  "+genere);
    	}
    
    -->
    </script>
    
    </head>
    <body bgcolor="#D0D090" text="#800000">
    
    <div align="center">
        
    
    
    
    
    
    <input type="button" value="test   function carica(brano)"
         onclick="carica('http://digidownload.libero.it/straystudio.mp3_01/Edelweiss-n01.mp3')">
    
    <input type="button" value="test   function caricaList(genere)"
         onclick="caricaList('http://digidownload.libero.it/straystudio.mp3_01/Edelweiss-n01.mp3')"> 
    
    
    
    <div name="schermo" id="schermo" style="width: 200px; height: 80px; border: 2px solid #800000;"></div>
    
    
    </div>
    
    </body>
    </html>
    P.S.: Puoi fare una ulteriore verifica mattendo un alert(' ') in testa ed in coda alla funzione carica(genere) che setTimeout sarebbe deputato a richiamare; vedi che il secondo alert('2') non parte, l'inghippo è proprio lì !
    codice:
    function caricaList(genere){
    
            window.setTimeout("alert('1'); carica(genere); alert('2');", 5000);
    
    	}
    E allora come mai l' alert(' ') messo in fondo alla function (prima dell'ultima }) partiva sempre, come se niente fosse bloccato ?!??
    Eh certo, c'è il ritardo del Timer, il problema "dormiente" insorge dopo: fa prima a scorrere regolarmente la function, che non setTimeout a prendere in considerazione il suo carico; anche se gli dessimo solo 1 di delay.

    Chi volesse può testare il procedimento con immagini invece che audio, se incontra problemi coi Players.

  10. #10
    Utente bannato
    Registrato dal
    Dec 2008
    Messaggi
    78
    ... e se da lì togli genere, con
    setTimeout("alert('1'); carica(); alert('2');", 5000);
    vedi che allora anche il 2° alert arriva.

    setTimeout può solo richiamare
    una &#160; function myFun() &#160; o una &#160; function myFun('filename') &#160; che trasmette un valore reale e completo
    (ma che non fa al nostro caso, però).
    Non può gestire variabili o "pezzi" di valore tra le ().


    Works-around vari che avevo tentato non aggirano il problema, tipo introdurre una variabile intermedia:

    function caricaList(genere){
    &#160; &#160; &#160; &#160; var quale = genere;
    &#160; &#160; &#160; &#160; window.setTimeout("carica(quale)", 5000);
    &#160; &#160; &#160; &#160; }

    circostanza che peraltro già si manifesta nel tuo layout, con &#160; var brano="./musica/"+genere+"/SONG"+x;

    Neppure è questione di segni &#160; + &#160; di concatenzione da inserire.

    setTimeout("carica(quale)", 2000); è fattibile invece se quale proviene da una variabile globale, quelle cioè che dichiari esternamente alle funzioni (e di solito all'inizio dello SCRIPT), e che quindi possono essere fruite da tutte le funzioni (sempreché dello stesso SCRIPT).
    Quindi il comportamento di &#160; setTimeout &#160; va così interpretato:
    - fa parte della function di appartenenza nel momento "dell'innesco" dell'orologeria;
    - ma nel momento del "lancio", il contenuto cui da' esecuzione va' considerato come una funzione esterna ed indipendente; la function di appartenenza sarà peraltro già "spirata".
    Quindi la &#160; function caricaList(genere) &#160; nell'accrescere &#160; x++; &#160; dovrà modificare &#160; brano &#160; come una global variable .

    Quanto sopra non ti darà invece limitazioni per quanto riguarda la gestione dell' Array coi tempi di durata che rimane fattibilissima (strada che anch'io avevo percorso, appoggiandomi però ad una terza function per altri motivi).

    setTimeout("carica()", speed );

    e

    setTimeout("carica()", duration[t] );


    rimangono entrambe percorribili.

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.