我一直在努力找出我在这里做错了什么。我只是尝试使用jQuery的.css()
函数,在用户单击按钮之后,但在遍历HighStock中的一个系列之前(执行几秒钟),并显示/隐藏一些行(其中32行!)。
我尝试过很多东西,但不管我尝试了什么,它只是将按钮冻结在“向下”的位置(不改变光标,但您仍然可以移动它),直到代码完成。
以下是我尝试过的(按顺序排列):
注意:我所有的尝试都会产生完全相同的结果(即不会产生错误,代码会被执行,但是在代码忙于执行时,我从来没有得到显示“进度”的游标)。
$("#onAllOverall").click(function () {
$("body").css("cursor", "progress");
for (var s = 0; s < series.length; s++) {
series[s].hide();
}
$("body").css("cursor", "default");
});
于是,我试着:
$("#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");
});
我甚至试过:
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");
});
我记得我试过其他的几件事,但我不能正确地记得它们是什么,但它们是基本的,没有帮助的。
我觉得有点傻,因为这里什么都没做。我做错了什么?
发布于 2014-03-27 16:00:14
您需要将事件循环“释放”给浏览器,这样它就可以在for循环期间呈现页面(包括光标更改)。
在浏览器中,最简单的方法是使用0 ms的setTimeout。(Nodejs有一个名为nextTick的函数,它实际上是您想要的,但是浏览器还没有实现它。)
$("#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循环的单个设置超时。每次操作后产生的结果将使页面在循环发生时响应更快,但也可能会使页面看起来很奇怪,因为每个元素都会一次消失一次。
使它在每一次行动之后都不屈服:
$("#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);
});
https://stackoverflow.com/questions/22692374
复制相似问题