【问题标题】:How to make delay in calling a function in javascript?如何在javascript中调用函数时延迟?
【发布时间】:2009-09-25 12:49:20
【问题描述】:

我想在延迟一段时间后执行特定数量的语句。 例如:

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);
}

在这里,我想将当前滚动位置设置为特定的 div。但它给了我错误:x 未定义。让我告诉你,如果我使用下面的函数它可以正常工作,所以请不要告诉我 ele 是 null 并且 blah blah blah。

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

任何帮助表示赞赏。

【问题讨论】:

  • ele 为 null 可能不会导致 x 未定义,我认为 natrium 有该解决方案,但您应该检查 ele 是否为 null ;)我确定您刚刚简化了这里的代码而且您实际上已经在代码中这样做了;)

标签: javascript settimeout


【解决方案1】:

你可以给setTimeout一个函数,而不是一个字符串,这样你就可以访问这些变量:

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

【讨论】:

    【解决方案2】:

    试试

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

    这不是最佳做法。 改用这个:

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

    【讨论】:

    • 不要将 JS 代码作为字符串传递给 setTimeout 函数。请传递一个常规的 javascript 函数。
    • 工作就像一个魅力......谢谢哥们!
    • 事后撕掉 bdukes 答案的方法。
    • 至少我承认我原来的答案不是最好的。 bdukes 获得更多选票,所以不用担心。
    【解决方案3】:

    将函数包装在闭包中,然后将超时放入闭包中。

    【讨论】:

    • 已经尝试过了,但是如果函数需要参数怎么办?它给出了相同原因的当前错误 bcoz ..!!
    猜你喜欢
    • 1970-01-01
    • 2016-03-22
    • 1970-01-01
    • 1970-01-01
    • 2013-12-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-09
    • 2012-12-04
    相关资源
    最近更新 更多