Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1

    Funzionamento setTimeout()

    Premetto che ho una pagina che richiama molte immagini ed il mio server, pensando ad un attacco malware, attiva la protezione bloccandola.
    Allora ho pensato di inserire un setTimeout per rallentare il flusso dello script ma non funziona.
    codice:
    function altri(){document.getElementById('dan').style.display='none'; document.getElementById('dun').style.display='block';
    j = 1;
    while(j<=8){
    wj = document.getElementsByClassName("n"+j); 
    for (i = 0; i < wj.length; i++){wj[i].style.display='inline-block'} 
    //setTimeout(so, 2000); //questo non funziona
    so(); //questo funziona
    
    } //chiude while()
    function so(){j=j+1};
    document.getElementById('dun').style.display='none'} //chiude altri()
    E' pazzesco ma non riesco a capire cosa non funziona!

  2. #2
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,367
    Quote Originariamente inviata da claudio dionisi Visualizza il messaggio
    Allora ho pensato di inserire un setTimeout per rallentare il flusso dello script ma non funziona.
    E' pazzesco ma non riesco a capire cosa non funziona!
    "Non funziona" è ciò che dicono gli utenti finali, non gli sviluppatori.

    Cosa vorresti ottenere da questo script? Cosa fa invece? Qual è l'effetto diverso dal risultato atteso?
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  3. #3
    Quote Originariamente inviata da alka Visualizza il messaggio
    "Non funziona" è ciò che dicono gli utenti finali, non gli sviluppatori.

    Cosa vorresti ottenere da questo script? Cosa fa invece? Qual è l'effetto diverso dal risultato atteso?
    Giusto così!
    Il fine dello script è quello di caricare un grosso numero di immagini un poco alla volta per non bloccare il server.
    La versione veloce carica tutte le immagini in un colpo solo e, quindi, non ottengo il risultato voluto.
    Invece lo script con l'istruzione setTimeout(so, 2000) non fa nulla, rimane bloccato, indipendentemente dal ritardo impostato, sino a quando non si chiude la pagina.

  4. #4
    E' inutile!
    Il ciclo While non può essere fermato o rallentato!

  5. #5
    Moderatore di CSS L'avatar di KillerWorm
    Registrato dal
    Apr 2004
    Messaggi
    5,721
    Ciao, a mio parere stai sbagliando approccio e, comunque sia, la logica utilizzata per quello script è sbagliata, come tu stesso hai potuto constatare.

    Prima di cimentarsi in tentativi raffazzonati e soluzioni ipotetiche, sarebbe utile capire meglio il contesto del problema così da valutare come sia meglio intervenire.

    Scrivi che il server blocca la pagina perché richiama molte immagini, ma:

    Cosa vedi nella pagina quando la apri col browser? Puoi postare uno screenshot?

    Sei sicuro che la pagina viene bloccata per le "molte immagini" e non semplicemente per qualcuna di esse che viene rilevata sospetta?

    Sei amministratore del server?
    Puoi verificare cosa sta avvenendo di preciso? C'è un log di ciò che è avvenuto?
    Puoi impostare tu le opzioni di protezione nel server?

    Sei sicuro che non sia il browser, piuttosto che il serve, a bloccare la pagina o le immagini?
    Hai provato con diversi browser? Quali sono i risultati?

    Cosa intendi per "richiama molte immagini"?
    Sono immagini inserite direttamente attraverso HTML, ad esempio semplici tag <img>?
    Oppure sono incluse via script?
    Le immagini sono concentrate tutte nell'area visibile della pagina oppure sono distribuite lungo la pagina e quindi vengono (o dovrebbero essere) visualizzate man mano che si scorre?
    Installa Forum HTML.it Toolset per una fruizione ottimale del Forum

  6. #6
    Le pagine in questione sono dei sommari con le miniature di tutti i video di un certo autore.
    A volte contengono moltissime miniature, oltre 200.
    La pagina � creata da uno script PHP, poi viene letta da uno script Javascript.
    Il mio server ha una protezione DDoS, se un certo utente effettua molte richieste in un tempo determinato lo blocca.
    Nella pagina un primo blocco di miniature, le pi� recenti, sono sempre visibili, le altre, con stile "display:none" devono essere richiamate con un bottone "ALTRI".
    Lo script Javascript deve trasformare lo stile "display:none" in "display:inline-block", in un tempo abbastanza lungo da non incappare nella protezione DDoS.
    La funzione "while" non pu� essere ne fermata ne cadenzata.
    Ecco allora come ho risolto, non la uso!!
    codice:
    <script type="text/javascript">
    function altri(){
    j=1;
    
    var att = setInterval(function(){wj = document.getElementsByClassName("n"+j);
    
    for (i = 0; i < wj.length; i++){wj[i].style.display='inline-block'}
    
    if(j==1){clearInterval(att)}
    
    j=j+1}, 8000)}
    
    </script>
    Quando viene invocata la funzione altri con il bottone "ALTRI"
    per prima cosa creo la variabile j globale, � molto importante!!!
    creo una variabile att() che � il cuore dello script che effettua la trasformazione dello stile;
    cadenzo questa funzione con l'istruzione setInterval;
    controllo il cadenzamento con una semplice istruzione for() che controlla il numero delle reiterazioni e, quando raggiunto il limite prefissato esce dal ciclo con clearInterval(att);
    clearInterval(att) mi permette inoltre di aggiungere alla fine del ciclo altre istruzioni, ininfluenti al ciclo stesso, ma utili alla pagina.
    Tutto qui!

  7. #7
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,367
    Quote Originariamente inviata da claudio dionisi Visualizza il messaggio
    Le pagine in questione sono dei sommari con le miniature di tutti i video di un certo autore.
    A volte contengono moltissime miniature, oltre 200.
    Esistono siti con molte più immagini e risorse che vengono caricate all'accesso.

    Quote Originariamente inviata da claudio dionisi Visualizza il messaggio
    Il mio server ha una protezione DDoS, se un certo utente effettua molte richieste in un tempo determinato lo blocca.
    Ma questa protezione deve essere tarata: è normale per un browser che carica una pagina Web e vede al suo interno riferimenti ad altre risorse esterne effettuare di conseguenza altre chiamate per poterle andare a scaricare. E' un meccanismo alla base del funzionamento del Web.

    Scaricare le immagini referenziate da una pagina Web non può essere considerato un "attacco" per DoS.

    Quote Originariamente inviata da claudio dionisi Visualizza il messaggio
    Nella pagina un primo blocco di miniature, le pi� recenti, sono sempre visibili, le altre, con stile "display:none" devono essere richiamate con un bottone "ALTRI". Lo script Javascript deve trasformare lo stile "display:none" in "display:inline-block", in un tempo abbastanza lungo da non incappare nella protezione DDoS.
    Questo approccio - oltre ad essere intricato da gestire - non è garantito che funzioni in tutti i browser: alcuni di questi, tipo Chrome, possono ingaggiare un comportamento di ottimizzazione che previene il caricamento di immagini quando l'elemento o il suo contenitore non sono visibili, ma non è uno standard e potrebbe funzionare diversamente su altri browser, oppure in versioni precedenti del browser stesso.

    Quote Originariamente inviata da claudio dionisi Visualizza il messaggio
    La funzione "while" non pu� essere ne fermata ne cadenzata.
    Ecco allora come ho risolto, non la uso!!
    A mio avviso, se proprio questo va gestito con uno script, sarebbe stato più opportuno (ma anche più semplice) gestire tutto in modo diverso: la pagina si presenta vuota, e solo tramite JavaScript si vanno all'occorrenza via via creando le immagini da visualizzare, scatenando quindi il download e la conseguente visualizzazione solo nel momento in cui JS crea l'elemento e lo inserisce nella pagina.

    Io comunque, in linea di principio, rivedrei la configurazione del server e mi preoccuperei di fare svariati test, su diversi browser e anche dispositivi, per verificare il comportamento della pagina.

    Segnalo che vi sono tanti framework (es. VueJS) che offrono strumenti per poter gestire nel modo corretto e con il minimo sforzo contesti di "progressive loading" all'interno delle pagine Web.

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  8. #8

  9. #9
    Le pagine che contengono questo script non sono figlie uniche ma appartengono ad una nutrita famiglia; o cominciato con il capostipite che è : https://www.mare2000.it/Corti/corti.php?id=, e l'ho fatta in PHP perchè era facile, con l'ID richiamarla; inoltre in PHP ho trovato alcune funzioni per gestire gli array di controllo:
    1) cancellare tutte le cache prima di leggere la pagina,
    2) rimpiazzare gli array con quelli nuovi
    3) capovolgere l'array,
    4) spezzettare l'array in bolcchi di 36,
    A questo punto tutti gli array di controlo erano in PHP ed è stato consequenziale fare anche queste pagine in PHP in modo che potevano leggere gli array in PHP.
    Solo una volta che la pagina era arrivata al browser veniva letta in maniera differenziata.
    Ho provato le pagine anche su Chrome e funzionano bene.
    Ciao a tutti.

  10. #10
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,367
    Quote Originariamente inviata da claudio dionisi Visualizza il messaggio
    A questo punto tutti gli array di controlo erano in PHP ed è stato consequenziale fare anche queste pagine in PHP in modo che potevano leggere gli array in PHP.
    Sarà una mia limitazione, ma non ho idea di cosa siano gli array "di controllo", così come non dovrebbe essere necessario nulla di particolare per "leggere" degli array, visto che sono strutture in memoria lato server che sono generalmente dichiarabili e accessibili all'interno di una pagina, senza nulla di particolare da fare.

    Quote Originariamente inviata da claudio dionisi Visualizza il messaggio
    Solo una volta che la pagina era arrivata al browser veniva letta in maniera differenziata.
    Il browser lavora sul client, in modalità totalmente asincrona, facendo delle chiamate al server Web, mentre lato server via PHP c'è uno script che produce la pagina da restituire in modalità top-down: non è una "lettura differenziata", ma il normale comportamento di entrambi gli attori coinvolti che deve essere un requisito fondamentale da conoscere in dettaglio per poter lavorare con il Web sapendo come funziona.

    Quote Originariamente inviata da claudio dionisi Visualizza il messaggio
    Ho provato le pagine anche su Chrome e funzionano bene.
    Sì, infatti Chrome è uno dei browser che attua questa tipologia di ottimizzazione: il problema sono gli altri, che potrebbero farlo o non farlo, in quanto non si tratta di uno standard ma solo di un "escamotage" (per quanto intelligente e voluto); inoltre, ragionare sulle tempistiche non conviene in un ambito dove queste dipendono anche dalla larghezza di banda.

    In conclusione, ci credo sul fatto che "funziona", ma escludo categoricamente che quello script si possa ritenere "funzionante bene", che sia "accessibile", che sia manutenibile in futuro (da sé stessi o da altri), che possa essere esteso senza problemi in caso di richieste di evoluzioni (che sia l'introduzione di una minima funzionalità in più) e che più in generale funzioni in tutti gli ambiti e condizioni possibili.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

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.