javascript per verificare se l'elemento sia visibile e impostare "setInterval" di conseguenza

LE2. Qualche altra idea su come risolvere questo problema?

Ho questo codice e non riesco a capire perché non funziona correttamente:

$(function autorun() { if ($("#contactForm").is(":visible")){ setInterval( "refreshAjax();", 150000000000 ); } else { setInterval( "refreshAjax();", 15000 ); } setTimeout("autorun();", 2000) }); 

 <body onLoad="autorun()"> 

Al momento continua a rinfrescare la pagina each 2 secondi, anche se il "contactForm" è visibile.

La mia logica è: se il "ContactForm" è visibile, ritardare l'aggiornamento o fermarlo, continuare a controllarlo, ma al tempo stesso aggiornare la pagina in conformità con l'altra dichiarazione.

LE.

 $(function() { refreshAjax = function(){$("#flex1").flexReload(); } }); 

LE2. Soluzione finale fornita qui da @Nick Craver

 $(function () { var ajaxTimeout; function autorun() { if ($("#contactForm").is(":visible")){ if(ajaxTimeout) { clearInterval(ajaxTimeout); ajaxTimeout = false; } } else if(!ajaxTimeout) { ajaxTimeout = setInterval(refreshAjax, 15000); } } setInterval(autorun, 2000); }); 

Grazie, Cristian.

Attualmente stai creando molti timer di intervalli che non sono buoni. Non so se questo risolve il tuo problema, perché a parte questo, il tuo codice sembra ok.

Provaci:

 var ajaxTimeout; function autorun() { if ($("#contactForm").is(":visible")){ if(ajaxTimeout) { clearInterval(ajaxTimeout); ajaxTimeout = false; } } else if(!ajaxTimeout) { ajaxTimeout = setInterval(refreshAjax, 15000); } } $(function() { setInterval(autorun, 2000) }); 

Ricorda che il tempo è in millisecondi.

Aggiornamento: @tec ha un'altra soluzione interessante. Quindi dipende da ciò che si vuole realizzare con il tuo codice.

Sembra che tu non abbia ancora capito completamente come funziona setTimeout / setInterval. La prima cosa da sapere è che questi methods funzionano sempre in modo asincrono. Il codice Javascript non si ferma mai e si attende o qualcosa. In primo luogo il tuo metodo (e lo stack di chiamata) finisce; dopo che vengono eseguite le chiamate di metodo ritardato. Raccommand di leggere una buona spiegazione di "threading" in javascript come: http://ejohn.org/blog/how-javascript-timers-work/

Quindi nel tuo codice autorun () viene chiamato each due secondi. Ogni due secondi il valore viene valutato. Se il module di contatto è visibile, non succede niente, come suppongo che non aspetti 15 Mio secondi. Se non è visibile, inizia a call refreshAjax () in un'intervallo di 15 secondi. Ma ricorda: questo avviene each due secondi. quindi dopo 15 secondi viene chiamata la prima volta che refreshAjax (). Dopo 17 secondi e dopo 19,21 e così via. Dopo 30 secondi inizia a chiamarsi due volte each due secondi.

Una soluzione semplice sarebbe questa:

 $(function autorun() { if ($("#contactForm").is(":visible")){ // It's visible, so don't do anything. // But check again in two seconds if it is still visible. setTimeout( "autorun();", 2000 ); } else { // it's not visible, yay! // Let's refresh and check again in 15 seconds setTimeout( "autorun();", 15000 ); refreshAjax(); // note that refreshAjax is called instantly, _not_ after 15 seconds } });