Ian
Ian

Reputation: 1910

Clearing setTimeout issues

I'm trying to set "mouseactive" to true less than a second after a key command, but I would like to cancel that action if the key is pressed within that time period. However I can't seem to figure out how to do this. This is what I have...

$(window).keydown(function(e) {
if (e.keyCode == 40) {
        e.preventDefault();
        mouseactive = false;
        clearTimeout(t);
        var t = setTimeout("mouseActive()",800);
} else if (e.keyCode == 38) {
        e.preventDefault();
        mouseactive = false;
        clearTimeout(t);
        var t = setTimeout("mouseActive()",800);
}
});

function mouseActive() {
mouseactive = true;
}

But this doesn't work, it doesn't set mouseactive back to true... can anyone tell me what I'm doing wrong here?

Upvotes: 0

Views: 816

Answers (3)

Selvakumar Arumugam
Selvakumar Arumugam

Reputation: 79830

Edit: Cleaned up redundant code.

More Edits: Make sure your var t is defined outside any closure including $(document).ready. See below,

var t = null;

$(document).ready(function () {
   //..below code except for var t = null
});

Declare var t outside the handler.

var t = null;
$(window).keydown(function(e) {
    e.preventDefault();

   if (e.keyCode == 40) {
        mouseactive = false;
   } else if (e.keyCode == 38) {
        mouseactive = false;
   }

   if (t != null) clearTimeout(t);
   t = setTimeout(mouseActive, 800);
});

function mouseActive() {
   mouseactive = true;
}

Upvotes: 2

gen_Eric
gen_Eric

Reputation: 227240

Your problem is that t is not in scope the 2nd time the function runs. You need to make t a global variable .

var t;

$(window).keydown(function(e) {
if (e.keyCode == 40) {
        e.preventDefault();
        mouseactive = false;
        clearTimeout(t);
        t = setTimeout(mouseActive,800);
} else if (e.keyCode == 38) {
        e.preventDefault();
        mouseactive = false;
        clearTimeout(t);
        t = setTimeout(mouseActive,800);
}
});

function mouseActive() {
mouseactive = true;
}

P.S. Don't pass strings to setTimeout, pass functions. It uses eval when you pass strings.

Upvotes: 2

Philipp
Philipp

Reputation: 1445

you are redeclaring "t" all the time, try this:

var t = null;  
$(window).keydown(function(e) {
    if (e.keyCode == 40) {
            e.preventDefault();
            mouseactive = false;
            if(t != null)
            {
               clearTimeout(t);
            }
            t = setTimeout("mouseActive()",800);
    } else if (e.keyCode == 38) {
            e.preventDefault();
            mouseactive = false;
            if(t != null)
            {
               clearTimeout(t);
            }
            t = setTimeout("mouseActive()",800);
    }
    });

    function mouseActive() {
    mouseactive = true;
    }

Upvotes: 1

Related Questions