Raphael
Raphael

Reputation: 703

Add a timeout to "setInterval()"?

I have a setInterval function like below on a Divbox so if I leave a divbox, this setInterval is triggered:

setInterval("playthis()", 1000);

What I want it to do: If I leave the divbox and lets say within the next 2 second rehover it, the setInterval should not triggered.

Is this possible?

Upvotes: 9

Views: 16946

Answers (3)

Vilx-
Vilx-

Reputation: 106912

Yes. Just make some creative use of clearInterval().

In other words, no, such a feature doesn't come out-of-the-box, but you can build it yourself by calling clearInterval() if the mouse re-enters the divbox before the interval is triggered.

For example:

var divBox = document.getElementById('MyDivBox');
var TimeoutHandle = null;

divBox.onmouseover = function()
{
    if ( TimeoutHandle != null )
    {
        clearTimeout(TimeoutHandle);
    }
}

divBox.onmouseout = function()
{
    TimeoutHandle = setTimeout(function()
    {
        TimeoutHandle = null;
        setInterval(playthis, 1000);
    }, 2000);
}

Upvotes: 3

Nicola Peluchetti
Nicola Peluchetti

Reputation: 76880

First of all is a bad practice to have the code evalued in a setInterval so you should avid double quotes. Then you can clear the interval like this:

 var int = setInterval(playthis, 1000);
 clearInterval(int)

Upvotes: 1

Lightness Races in Orbit
Lightness Races in Orbit

Reputation: 385104

You can use cousins setTimeout and clearTimeout to set a function callback that invokes your setInterval only after 2 uninterrupted seconds:

var handle = null;

function yourDivboxLeaveHandler() {
   handle = setTimeout(startPlay, 2000);
}

function yourDivboxHoverHandler() {
   if (handle !== null) {
       clearTimeout(handle);
       handle = null;
   }
}

function startPlay() {
   setInterval(playthis, 1000); // use function references please, not eval
   handle = null;
}

You will want much better variable/function names than this though.

Upvotes: 6

Related Questions