我正在try 用一个图像精灵构建一个加载指示器,我想出了这个函数

function setBgPosition() {
   var c = 0;
    var numbers = [0, -120, -240, -360, -480, -600, -720];
    function run() {
       Ext.get('common-spinner').setStyle('background-position', numbers[c++] + 'px 0px');
        if (c<numbers.length)
        {
            setTimeout(run, 200);
        }else
        {
            setBgPosition();
        }
    }
    setTimeout(run, 200);
}

所以输出是这样的

http://jsfiddle.net/TTkre/

我不得不使用setBgPosition();在else中保持循环运行,所以现在我的问题是,一旦我想要[load finished],如何停止这个循环?

推荐答案

setTimeout返回一个计时器句柄,您可以使用它来停止clearTimeout的超时.

例如:

function setBgPosition() {
    var c = 0,
        timer = 0;
    var numbers = [0, -120, -240, -360, -480, -600, -720];
    function run() {
        Ext.get('common-spinner').setStyle('background-position', numbers[c++] + 'px 0px');
        if (c >= numbers.length) {
            c = 0;
        }
        timer = setTimeout(run, 200);
    }
    timer = setTimeout(run, 200);

    return stop;

    function stop() {
        if (timer) {
            clearTimeout(timer);
            timer = 0;
        }
}

所以你可以把它当做:

var stop = setBgPosition();
// ...later, when you're ready to stop...
stop();

请注意,我并没有让setBgPosition再次调用自己,而是刚刚将c设置回0.否则,这是行不通的.还要注意,我使用0作为超时未挂起时的句柄值;0不是setTimeout的有效返回值,因此它是一个方便的标志.

这也是我认为setIntervalsetTimeout更好的地方之一.重复setInterval次.所以:

function setBgPosition() {
    var c = 0;
    var numbers = [0, -120, -240, -360, -480, -600, -720];
    function run() {
        Ext.get('common-spinner').setStyle('background-position', numbers[c++] + 'px 0px');
        if (c >= numbers.length) {
            c = 0;
        }
    }
    return setInterval(run, 200);
}

使用方式如下:

var timer = setBgPosition();
// ...later, when you're ready to stop...
clearInterval(timer);

尽管存在上述所有问题,我还是想找到一种方法,通过检测某个完成条件已被满足,使setBgPosition个停止事项itself.

Css相关问答推荐

如何提高数学输出的质量?

使用 Vuetify 的 sass 变量时出错

根据现有值计算CSS变量的新值

Firefox未正确设置SVG的父div的宽度

做一个像CodeSandbox的console那样的可拖拽的split panel

为什么这个绝对定位的 ::after 伪元素会崩溃,除非父级有过滤器?

子菜单的背景不占用所有空间

使用 Flex Box Tailwind CSS 的元素不相等

你可以在 CSS 中扩展实体(entity)吗?

  • 元素上的子弹来自哪里?
  • 创建 CSS 全局变量:样式表主题管理

    加载资源失败:服务器响应状态为 404(未找到)

    将文本放在 div 的底部

    CSSzoom 高度以匹配宽度 - 可能与外形尺寸

    Select 器.class.class和.class.class有什么区别?

    输入和文本字段中的背景 colored颜色

    在 CSS 中表示 100% 的 1/3 的最佳方式是什么?

    在无序列表中的项目之后添加管道分隔符,除非该项目是最后一行

    如何在页面上居中 twitter bootstrap 选项卡?

    如何在 CSS 中给出背景图像路径?