我正在使用jQuery的.hide()
和.show()
函数来显示加载消息,同时执行可能很长的同步webservice调用。
点击下面代码段中的按钮,我希望文字"一些数据"立即替换为"正在加载......"然后回到"其他一些数据" 5秒后。
正如您所看到的,事实并非如此:
function run_test() {
$('#test1').hide();
$('#test2').show();
long_synchronous_function_call()
$('#test2').hide();
$('#test1').show();
}
function long_synchronous_function_call() {
$('#test1').html('<p>Some other data</p>');
var date = new Date();
while ((new Date()) - date <= 5000) {}
}
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.4/jquery.min.js"></script>
<div id="test1">
<p>Some data</p>
</div>
<div id="test2" style="display:none">
<p>Loading...</p>
</div>
<button onclick="run_test()">Call a long synchronous function!</button>
&#13;
事实上,&#34;正在加载&#34;元素永远不会出现,而且&#34;其他一些数据&#34;如果没有我们假设的用户在漫长的等待期间得到任何反馈,我们就会被替换。
我可以做些什么来确保jQuery隐藏并显示我的元素现在,而不是一旦我的所有函数都执行完毕?
答案 0 :(得分:8)
在您的代码停止执行之前,屏幕不会被呈现。这几乎总是理想的行为,因为它阻止了DOM处于不一致状态。
假设您确实需要运行长同步任务,并且您可以修复它或将其推迟到webworker,那么解决方案是使用setTimeout
:< / p>
function run_test() {
$('#test1').hide();
$('#test2').show();
setTimeout(function(){
long_synchronous_function_call()
$('#test2').hide();
$('#test1').show();
},0);
}
function long_synchronous_function_call() {
$('#test1').html('<p>Some other data</p>');
var date = new Date();
while ((new Date()) - date <= 5000) {}
}
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.4/jquery.min.js"></script>
<div id="test1">
<p>Some data</p>
</div>
<div id="test2" style="display:none">
<p>Loading...</p>
</div>
<button onclick="run_test()">Call a long synchronous function!</button>
&#13;
只是为了确保我没有帮你隐藏错误:从不执行同步ajax调用。
当你在浏览器中真正进行合法且有些长时间的同步操作(例如计算或构建复杂的GUI)时, 有理由做我的建议。 / p>