ie8中的javascript setInterval很慢

时间:2014-06-26 02:41:51

标签: javascript

1)chrome,firefox在IE8

中很好但很慢

2)浏览器放大/缩小,调整大小等后非常慢

3)为什么?内存泄漏?还是?

function moveX(object, coord){
    var v = (coord < 0) ? -1 : 1;

    var timer = setInterval(function(){
        var x = object.offsetLeft + v;
        v *= 2;

        if((v < 0 && x > coord) || (v > 0 && x < coord))
            object.style.left = x + "px";
        else{
            clearInterval(timer);
            object.style.left = coord + "px";
        }
    }, 25);
}

1 个答案:

答案 0 :(得分:2)

首先,如评论中所述,确保多个计时器不同时运行。接下来,不强制每次计算offsetLeft也可以提供相当快的速度。

function moveX(object, coord) {
    var v = coord < 0 ? -1 : 1;
    var x = object.offsetLeft;

    var timer = setInterval(function () {
        x += v;
        v *= 2;

        if ((v < 0 && x > coord) || (v > 0 && x < coord)) {
            object.style.left = x + "px";
        } else {
            clearInterval(timer);
            object.style.left = coord + "px";
        }
    }, 25);
}

此外,您的动作取决于计时器打勾需要多长时间;任何性能差异都可以通过专门使用时间来平滑(虽然你不能在IE 8中正确地执行此操作;没有单调计时器API):

function moveX(object, coord) {
    var v = coord < 0 ? -1 : 1;
    var startX = object.offsetLeft;
    var start = new Date().getTime();

    var timer = setInterval(function () {
        var t = new Date() - start;
        var x = startX + v * Math.pow(2, t / 25);

        if ((v < 0 && x > coord) || (v > 0 && x < coord)) {
            object.style.left = x + "px";
        } else {
            clearInterval(timer);
            object.style.left = coord + "px";
        }
    }, 25);
}

但这确实是以实际表现为代价的。