JQuery元素显示/隐藏和控制流
JQuery Element Display / Hiding and Control Flow
在一个长时间运行的函数中,我正在使用JQuery显示进度条。我的计划是在调用函数之前简单地显示包含进度条的div,然后在函数完成后隐藏div。下面的代码示例演示了我试图实现的目标。
$(document).ready(function() {
$(document).click(function() {
$("#progress").show();
slowFunction();
$("#progress").hide();
});
});
function slowFunction() {
for (var i = 0; i < 50000; ++i) {
var t = Math.sin(i) + Math.cos(i);
console.log(t);
}
}
JSFiddle示例http://jsfiddle.net/MT25x/4/
问题是,即使函数在我的机器上运行大约需要10秒,div也根本没有显示。
然而,如果我只是尝试在函数之后显示div,它会很好地工作,在点击后大约10秒左右就会出现。有人能帮我澄清一下这个问题吗?
编辑:进一步的测试似乎表明,如果将隐藏调用全部删除,那么直到函数运行完毕,div才显示出来。这看起来很奇怪。
这是大多数浏览器的常见问题。当一个cpu密集型函数运行时,它会锁定主执行线程,而浏览器在函数执行完成之前不会重新绘制,因此div被隐藏和显示得非常快,因为show和hide都在排队。为了避免这种情况,可以使用setTimeout(...,0)
技巧,将函数排队以立即执行。这并不能保证跨浏览器工作,我只在ie、chrome和firefox上测试过。
$(document).ready(function() {
$(document).click(function() {
setTimeout(function(){$("#progress").show()},0); // queue this for immediate execution
setTimeout(function(){slowFunction()}, 2000); // delay the script a little giving the browser time to repaint
});
});
function slowFunction() {
for (var i = 0; i < 500; ++i) {
var t = Math.sin(i) + Math.cos(i);
}
$("#progress").hide();
}
这是一把小提琴。
在click函数中隐藏进度条的代码,并在slowfunction()结束时调用它
edit:您可能需要添加某种IF语句来确定何时调用.hide()-例如IF i==5000
相关文章:
- 比较两个值时出现JavaScript输出和控制流错误
- 类似Facebook的盒子-控制流中出现的内容
- 量角器 iOS 自动化:茉莉花规范超时.重置 Web 驱动程序控制流
- 控制流没有在jquery中的对话框中等待
- 使用NodeJS和Sequelize控制流
- javascript中的异步控制流
- 在控制台中隐藏AJAX控制器调用
- 如何将包含猫鼬函数的方法与控制流框架(例如异步或 Step)一起使用
- Node.js 中意外的 vm.runInThisContext 控制流
- 了解 Node.js 应用程序中的控制流
- KnockoutJS - 无容器控制流绑定初始值
- JavaScript's的控制流结构:浏览器特定的或JS固有的
- 承诺控制流 - 捕获与拒绝
- 检查不存在的变量时控制流模式
- 奇怪的JavaScript函数绑定.此控制流是否正确
- 有哪些在线Javascript工具可以逐步显示执行和流/控制流
- 我应该如何根据所选的无线电输入重新组织查询的控制流
- JQuery元素显示/隐藏和控制流
- 异步库是否有任何用于处理管道的控制流
- JavaScript回调和控制流