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

    Ritardare il flow dello script

    Salve a tutti!

    Non so se è già capitato a qualcuno, ma mi trovo nella situazione in cui i metodi setTimeout o setInterval dell'oggetto window non soddisfano esattamente le mie esigenze. Vorrei ottenere un allungamento graduale di un'immagine di dimensione 1x1 agendo sulla sua proprietà "width", ma se uso il seguente codice (dove il parametro 'w' è la larghezza finale a cui voglio portare la mia immagine, e 'line' è l'id dell'immagine):

    for (var i=1;i<=w;++i) document.getElementById('line').width=i;

    ovviamente me lo esegue in una frazione di secondo!

    Le ho provate tutte usando setTimeout e setInterval, ma senza successo (in pratica, se ho capito bene, questi due metodi mettono i comandi in "coda" ma continuano ad eseguire le istruzioni seguenti, mentre a me servirebbe che lo script si arrestasse del tutto prima di incrementare 'i' e assegnarlo a document.getElementById('line').width).

    Ora ottengo il risultato desiderato così:

    var i=0;
    var t1;

    function line(w)
    {
    var imgpath="../images/whitedot.bmp";
    document.write("<img id=\"line\" src=\""+imgpath+"\" width=\"1\" height=\"1\" style=\"position: absolute; left: 25; top: 77; z-index: 1\">");
    t1=window.setInterval("allarga("+w+");",20);
    }

    function allarga(w)
    {
    if (i<=w)
    {
    ++i;
    document.getElementById('line').width=i;
    }
    else window.clearInterval(t1);
    }

    e, nel body, chiamo la funzione line() passandole un intero w così:

    <script language="javascript">
    line(157);
    </script>

    che crea questa linea e la allunga gradualmente.
    Ora, ne converrete che la soluzione che adopero attualmente è poco elegante, per via delle variabili globali i e t1 e considerando anche che vi ho esposto il problema "esemplificandolo" perché in realtà la mia funzione non si chiama "line" ma "rectangle", pensate che devo disegnare altri 3 lati nella stessa maniera!!! VVoVe:
    Ringrazio anticipatamente chi mi vorrà dare una mano!

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

  2. #2
    Moderatore di JavaScript L'avatar di br1
    Registrato dal
    Jul 1999
    Messaggi
    19,998
    Non mi risulta che esistano altri metodi... pero' puoi evitare l'uso di variabili globali ed ottimizzare il codice... esempio:

    codice:
    <script>
    function rettangolo(lun) {
    	i = document.getElementById("myImg");
    	if (i.width<lun||i.height<lun) {
    		if (i.width<lun) i.width++;
    		if (i.height<lun) i.height++;
    		setTimeout('rettangolo('+lun+')',10)
    	}
    }
    </script>
    </HEAD>
    <BODY onload="rettangolo(100)">
    [img][/img]
    </BODY>
    ciao
    Il guaio per i poveri computers e' che sono gli uomini a comandarli.

    Attenzione ai titoli delle discussioni: (ri)leggete il regolamento
    Consultate la discussione in rilievo: script / discussioni utili
    Usate la funzione di Ricerca del Forum

  3. #3
    Grazie br1, tempestivo e saggissimo come al solito!
    Mi hai dato degli spunti molto interessanti, ora provo e poi ri-posto!

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

  4. #4

    Ancora un problema

    Ciao br1, salve a tutti gli utenti!
    C'è ancora un problemino con il mio rettangolo: tutti i lati si caricano simultaneamente, mentre vorrei far sì che si caricasse prima il lato superiore, poi quello destro, poi quello inferiore e infine quello sinistro (in senso orario, per intenderci). Adesso funziona così: http://digilander.libero.it/andreaaloi/prova.htm. Ho provato anche a mettere una variabile globale 'done', inizialmente falsa, che si setta a 'true' quando la linea ha raggiunto la lunghezza desiderata, ma non riesco ad adoperarla adeguatamente (sembra quasi che lo script faccia raggiungere all'immagine 'whitedot.bmp' la larghezza desiderata PRIMA che la raggiunga 'visivamente', quindi setta 'done' a 'true' e prosegue con gli altri lati). Ho provato di tutto, come ad esempio:

    startAt(...);
    line(...);

    while (!done) {};

    Ho pensato: "va bene, che passi pure all'istruzione successiva!", si trova un bel ciclo infinito che termina quando line ha EFFETIVAMENTE finito. Risultato: Internet Explorer smette di rispondere e devo killarlo dal task manager.
    Altre soluzioni analoghe hanno dato risultati non meno scoraggianti.
    Qualcuno ha un'idea di come fare?
    Grazie a tutti.

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

  5. #5

    Errata corrige

    Mi ha formattato l'url sbagliato nel precedente post, ve lo ri-posto:
    http://digilander.libero.it/andreaaloi/prova.htm . Ciao a tutti!!!
    Don't know what I want, but I know how to get it...

  6. #6

    Ce l'ho fatta

    Ragazzi... è stata durissima, ma ecco il frutto dei miei sforzi: http://digilander.libero.it/andreaaloi/prove/prova3.htm!!! Spero che questo script entri nel novero degli script d'interesse comune, o almeno in quelli che sono costati ore e ore di smanioso e folle scervellamento.
    Un "grazie" a coloro che, comunque, si sono interessati al problema!
    Ciao a tutti!

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

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.