Newsgroup: it.comp.lang.javascript
Titolo: Slideshow

Buon giorno a tutti,
 
sono alle prime armi con JScript e jQuery, quindi vi prego di essere
buoni e di non "mangiarmi" :-)
 
Sto cercando di realizzare una slideshow di immagini, con annessa
pulsantiera per le varie azioni (play, stop, avanti, indietro). Questo
il codice fin'ora:
http://pastebin.com/smgiRKhD
 
 
Immagino ci saranno errori qua e là, lo script per quel poco e ad
esclusione del problema che vado ad illustrarvi funziona, se avete
delle osservazioni sono ben accette.
 
Vi scrivo per quanto riportato nelle righe 78-83. L'obiettivo che
voglio raggiungere è:
1) stoppare l'animazione quando la finestra *passa in secondo piano*
(es.: cambio scheda se browser multischeda, cambio finestra in tutti i
casi);
2) riprendere l'animazione con situazione contraria.
Dovrei inoltre verificare che al momento dello stop l'animazione si
attiva e riprenderla poi solo se è stata così stoppata, onde evitare
che l'utente l'abbia stoppata manualmente e che venga ripresa in
automatico e quindi non richiesta, ma questo è un controllo che
implementerò dopo.
 
Per ora ho usato blur, ma come potete capire non è tanto una questione
di focus (es.: se clicco sull'icona di Skype nell'area delle
notifiche, oppure apro il menù del sistema, si perde il focus e
l'animazione viene interrotta... ma non è quello che voglio!), per non
parlare del focusin utilizzato per la ripresa, che porta decisamente a
un malfunzionamento della slideshow.
 
Suggerimenti?

 Suggerimenti?
 
È qualcosa che non puoi fare a livello di browser, temo. Puoi capire se
la finestra non è più attiva, ma non puoi capire se qualcosa l'ha coperta.
 

 pagina non è più visibile", ma non hai questo genere di granularità.
Allora amen, mi adeguerò ad utilizzare blur.
E per quanto riguarda la pretesa della riproduzione della slide? Se ho
capito bene, blur vale per entrambi gli eventi, e quindi dovrei
soltanto verificare il valore del flag. No?


 
Detto in modo spicciolo, sostituisci l'uso di `setTimeout` per le
animazioni con `mozRequestAnimationFrame` / `webkitzRequestAnimationFrame`.
 
In questo caso, la tua animazione verrà schedulata per il prossimo
evento di repaint. Il che significa che se la window corrente non riceve
nessun evento di repaint per essere ridisegnata su schermo (ad esempio,
cambi tab), la tua animazione rimarrà in "sospeso" e riprenderà
automaticamente appena la finestra riceverà un nuovo evento di repaint
(esempio, torni sulla tab).
 
Sfortunatamente, queste sono feature sperimentali, e solo browser che
hanno cicli di sviluppo molto veloci, attualmente Firefox e Chrome, le
implementano. Quindi sono del tutto inusabili a livello world wide.

 soltanto verificare il valore del flag. No?
 
Non sono sicuro a quale eventi ti riferisca. Comunque, in linea generale:
Con `onblur` sai quando la finestra può perdere il focus, con `onfocus`
sai quando lo recupera. Su `onblur` puoi mettere in pausa la slide, e
impostare una flag tipo `autoSuspend` a `true` se la slide non è già
stata bloccata, altrimenti non fai niente. Su `onfocus` verifichi che
`autoSuspend` sia `true`. Se lo è, allora la imposti a `false` e
riprendi l'animazione. Se non lo è, significa che l'animazione è stata
interrotta dall'utente, e allora non deve essere ripresa.

 [...]
Ti ringrazio, sei stato davvero gentile, preciso e pienamente
esaustivo. Mi è tutto chiaro, quindi mi darò da fare per sistemare
tutto secondo i tuoi suggerimenti e programmando una prossima
rispolverata di JS! :-) Purtroppo jQuery - come avevo già detto -
porta proprio a questo: programmare a tutti gli effetti in JS senza
conoscere JS. Indubbiamente è una libreria formidabili e
insostituibile (una volta provata), ma non credo che questa condizione
sia un bene...
 
Purtroppo questo lavoro nasce dalla necessità di riutilizzare lo
stesso codice per più lavori, diciamo per tutti i lavori. Quindi deve
funzionare universalmente e nei contesti più diversi. Ergo, credo che
mi limiterò al blur, pur dando un'occhiata (vado subito) alla tua
segnalazione.
 
Ancora grazie!

 Riga: 69
Per la riga 85, invece, nessun problema, anche se contratta.

 Ancora grazie!
 
Prego!