vpsfreecz / www.vpsfree.cz

Web
1 stars 12 forks source link

Dvojnásobná rychlost slidů ve firefoxu #8

Open tom-kuca opened 9 years ago

tom-kuca commented 9 years ago

Ve firefoxu (35.0.1) se občas slajdy přepínají příliš často - jako kdyby byla animace spuštěná dvakrát. Jednou se mi stalo, že interval byl cca 4s - 1s - 4s - 1s ..., podruhé rychlost přepínaní odpovídalo ~2,5s na slajd. Neděje se to vždy, nicméně po chvíli toho "nějak" dosáhnu. Nedaří se mi přijít na postup, jak to zreplikovat, mám pocit, že to souvisí s přepínáním tabů. V kódu nic špatného na první pohled nevidím. Děje se to je u mě?

ETNyx commented 9 years ago

Ahoj, zkus pro jistotu ctrl+f5 dneska když jsem tam kouknul tak mi to taky nějak blblo (sice jinak) a vynucení přenahrání všech zdrojů pomohlo

tom-kuca commented 9 years ago

Zkoušel jsem, ale povedlo se mi to i potom. Dnes jsem na to narazil i v chromiu. Přidal jsem logování času do show_slide(), zdá se, že se tam prolínají dva cykly:

22:56:35 
22:56:35 
22:56:40 
22:56:41
22:56:46
22:56:47
22:56:51
22:56:52
...

Edit: Pokud to nastane, přepínají se slajdy i když na ně najedu myší. clearTimeout se zavolá, ale zřejmě s nesprávným parametrem. Nevím, kdy přesně můžou eventy vyvolat přerušení, mám podezření na race condition.

ETNyx commented 9 years ago

No tak v tom případě my mělo stačit před každám volaním settimeout případný předchozí časovač vyresetovat

clearTimeout(animate_timeout);

nějak takhle, těch volání tam je settimeout je tam víc,...

function show_slide(i, settimer) {

    var navigation_dots = $("section.page2 div.dots");
    var anchors = navigation_dots.find("li a");
    var active = navigation_dots.find("li a:eq("+i+")");

    if (history.pushState)
        history.replaceState(null, null, "#slide-" + hashtags[i]);

    $("div.ab").fadeOut({easing:'linear'});
    $("div.ab:eq("+i+")").fadeIn({easing:'linear'});
    if($(window).width() < ANIMATE_MIN_WIDTH) { //pouze na mobilnich zarizeni kde slider neni aktivni
        $(".page2").height($("div.ab:eq("+i+")").outerHeight()); //uprvit veliost jednotlivych slideru
    }
    anchors.removeClass("yes").addClass("no");
    active.removeClass("no").addClass("yes");

    navigation_dots.data("active", i);

    if(settimer && auto_play) {
        clearTimeout(animate_timeout);
        animate_timeout = setTimeout(function() {
            var next = (navigation_dots.data("active") + 1) % anchors.length;
            show_slide(next, true);

            navigation_dots.data("active", next);
        }, ANIMATE_DURATION);
    }
}

můžeš to vyzkoušet?