Miserlou / Glance-Bookmarklet

A Speed Reading Bookmarklet
https://gun.io/blog/openspritz-a-free-speed-reading-bookmarklet
MIT License
1.56k stars 247 forks source link

Pausing and changing speeds causes weird behaviour #102

Open Haemp opened 10 years ago

Haemp commented 10 years ago

Replicate

It it is flashing a lot faster than 400 and sometimes maybe even refreshing some words.

RossUK88 commented 10 years ago

I also had that with mine, also after the speed change I could not re-pause it.

I changed the stopSpritz function (Around line 177) to this:

function stopSpritz() {
        for(var i = 0; i < spritz_timers.length; i++) {
            //clearTimeout(spritz_timers[i]);
            clearTimeouts();
        }
        document.getElementById("spritz_toggle").textContent = "Play";
        running = false;
    }

Which seems to remove these bugs.

EDIT: Does not stop the flashing bug, but I have noticed that when you pause and press play again, the running variable gets reset to false and therefore starts a 2nd instance of the startSpritz function adding another timer in which is a few words behind/infront. Looking into a fix now

AndreasBriese commented 10 years ago

The strange behaviour can be stopped by using the allready existing clearTimeouts() all over the script instead of having the spritz_timers Array beside it.

function clearTimeouts() {
    var id = window.setTimeout(function () {}, 0);
    while (id--) {
        window.clearTimeout(id);
    }
}
function spritz(selection) {
    clearTimeouts();
    var wpm = parseInt(document.getElementById("spritz_selector").value, 10);
    if (wpm < 1) {
        return;
    }
    if (selection) {
        spritzify(selection);
    }
}
function spritzify(input) {
    // changed ms_per_word from float to (float) func
    var ms_per_word = function () {
        return (60000 / parseInt(document.getElementById("spritz_selector").value, 10));
    };
(...)
    // get rid of  spritz_timer-Array
(...)
    function startSpritz() {

        document.getElementById("spritz_toggle").style.display = "block";
        document.getElementById("spritz_toggle").textContent = "Pause";

        running = true;

        setInterval(function () {
            updateValues(currentWord);
            currentWord++;
            if (currentWord >= all_words.length) {
                currentWord = 0;
                stopSpritz();
            }
        }, ms_per_word());
    }

    function stopSpritz() {
        clearTimeouts();
        document.getElementById("spritz_toggle").textContent = "Play";
        running = false;
    }
document.getElementById("spritz_selector").addEventListener("change", function (e) {
    clearTimeouts();
    document.getElementById("spritz_toggle").textContent = "Play";
});