首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么我不能在jQuery中执行某些脚本之前将光标更改为“进度”?

为什么我不能在jQuery中执行某些脚本之前将光标更改为“进度”?
EN

Stack Overflow用户
提问于 2014-03-27 15:35:52
回答 1查看 635关注 0票数 2

我一直在努力找出我在这里做错了什么。我只是尝试使用jQuery的.css()函数,在用户单击按钮之后,但在遍历HighStock中的一个系列之前(执行几秒钟),并显示/隐藏一些行(其中32行!)。

我尝试过很多东西,但不管我尝试了什么,它只是将按钮冻结在“向下”的位置(不改变光标,但您仍然可以移动它),直到代码完成。

以下是我尝试过的(按顺序排列):

注意:我所有的尝试都会产生完全相同的结果(即不会产生错误,代码会被执行,但是在代码忙于执行时,我从来没有得到显示“进度”的游标)。

代码语言:javascript
运行
复制
$("#onAllOverall").click(function () {
    $("body").css("cursor", "progress");

    for (var s = 0; s < series.length; s++) {
        series[s].hide();
    }

    $("body").css("cursor", "default");
});

于是,我试着:

代码语言:javascript
运行
复制
$("#onAllOverall").click(function () {
    $("body").css("cursor", "progress");
}

$("#onAllOverall").click(function () {
    for (var s = 0; s < series.length; s++) {
        series[s].hide();
    }

    $("body").css("cursor", "default");
});

我甚至试过:

代码语言:javascript
运行
复制
function progressCursor() {
    $("body").css("cursor", "progress");
}

$("#onAllOverall").click(function () {

    $.when(progressCursor).done(function () { //also tried $.when.then(), but I admit I don't know much about these methods;
        for (var s = 0; s < series.length; s++) {
            series[s].show();
        }
    });

    $("body").css("cursor", "default");
});

我记得我试过其他的几件事,但我不能正确地记得它们是什么,但它们是基本的,没有帮助的。

我觉得有点傻,因为这里什么都没做。我做错了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-03-27 16:00:14

您需要将事件循环“释放”给浏览器,这样它就可以在for循环期间呈现页面(包括光标更改)。

在浏览器中,最简单的方法是使用0 ms的setTimeout。(Nodejs有一个名为nextTick的函数,它实际上是您想要的,但是浏览器还没有实现它。)

代码语言:javascript
运行
复制
$("#onAllOverall").click(function () {
    $("body").css("cursor", "progress");
    var s = 0;
    function next(){
        series[s].hide();
        s++;
        if(s < series.length){
            setTimeout(next, 0);
        } else {
            $("body").css("cursor", "default");
        }
    }
    if(series.length){
        next();
    }           
});

对于这些事情,https://github.com/caolan/async库是非常优秀的。

请注意,此实现在每个hide()事件之后产生。您可能会发现,它只适用于包装for循环的单个设置超时。每次操作后产生的结果将使页面在循环发生时响应更快,但也可能会使页面看起来很奇怪,因为每个元素都会一次消失一次。

使它在每一次行动之后都不屈服:

代码语言:javascript
运行
复制
$("#onAllOverall").click(function () {
    $("body").css("cursor", "progress");

    function action(){
       for (var s = 0; s < series.length; s++) {
          series[s].hide();
       }

       $("body").css("cursor", "default");
    }
    setTimeout(action, 0);       
});
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22692374

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档