2

I want to execute a particular number of statements after some delay. For eg:

function findPosX(obj) {
    var curleft = 0;
    if (obj.offsetParent) {
        while (1) {
            curleft += obj.offsetLeft;
            if (!obj.offsetParent) {
                break;
            }
            obj = obj.offsetParent;
        }
    } else if (obj.x) {
        curleft += obj.x;
    }
    return curleft;
}

function findPosY(obj) {
    var curtop = 0;
    if (obj.offsetParent) {
        while (1) {
            curtop += obj.offsetTop;
            if (!obj.offsetParent) {
                break;
            }
            obj = obj.offsetParent;
        }
    } else if (obj.y) {
        curtop += obj.y;
    }
    return curtop;
}
function gotoDiv(index) {
    var ele = document.getElementById("Div" + index);
    var x = findPosX(ele);
    var y = findPosY(ele);
    setTimeout("window.scrollTo(x, y)", 5000);
}

Here I want to set the current scroll position to a prticular div. But it's giving me error: x is undefined. Let me tell u if I use the functions as below it works fine, so please don't tell me that ele is null and blah blah blah.

function gotoDiv(index) {
    var ele = document.getElementById("Div" + index);
    var x = findPosX(ele);
    var y = findPosY(ele);
    window.scrollTo(x, y);
}

Any help appreciated.

1
  • ele being null probably won't cause the x being undefined, I think natrium has that solution, but you should check ele for null though ;) i'm sure you've just simplified the code here and you're actually doing it in your code already ;) Commented Sep 25, 2009 at 12:57

3 Answers 3

14

You can give setTimeout a function, rather than a string, which will let you access those variables:

setTimeout(function() { window.scrollTo(x, y); }, 5000);      
Sign up to request clarification or add additional context in comments.

Comments

4

try

setTimeout("window.scrollTo(" + x + ", " + y + ")", 5000);

this is not best practice. Use this in stead:

setTimeout(function() { window.scrollTo(x, y); }, 5000);

3 Comments

Do not pass JS code as string to setTimeout function. Please pass a regular javascript function.
Way to rip bdukes' answer after the fact.
at least I admit my original answer was not the best one. bdukes is geting more votes so no worries.
1

Wrap the function in a closure and then put the timeout inside the closure.

1 Comment

already tried that but what if the function requires a paramter?? It's giving the current error bcoz of the same reason..!!

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.