2

我有一个在文档加载时运行的函数,它将选择对象的内容复制到其他选择框(以节省网络带宽)。

该功能需要几秒钟才能完成,所以我想屏蔽主 div(让用户知道正在发生某些事情)。

不幸的是,直到函数完成后掩码才会显示:

    // I want the mask to show immediately here, but never gets shown
    $('#unassignedPunchResults').mask('Getting results');

    $('.employeeList').each(function (i) {
        // this is freezing the browser for a few seconds, the masking is not showing
        $('#employeeList option').clone().appendTo(this);  
    });

    $('#unassignedPunchResults').unmask();

如何在 mask() 调用后中断 javascript 以刷新该事件并继续,以便用户可以在较长的处理 (each()) 过程中看到掩码?

4

3 回答 3

3

将其余代码放在一个setTimeout(function() { ... }, 0)调用中。

于 2012-05-31T20:15:13.717 回答
1

我一直在思考这个问题。第一个解决方案是使用settimeout函数。

但是,它可能有点“脏”,因为您添加了任意延迟。更合适的逻辑是在$('.employeeList').each(function (i)...执行和渲染掩码函数之后执行该函数。

Jquery 允许我们使用类似then的延迟函数来做到这一点,该函数在满足延迟条件后执行。

所以尝试:

// I want the mask to show immediately here, but never gets shown
    $('#unassignedPunchResults').mask('Getting results').then(function(){

    $('.employeeList').each(function (i) {
        // this is freezing the browser for a few seconds, the masking is not showing
        $('#employeeList option').clone().appendTo(this);  
    });


});

一般来说,使用任意毫秒数的 settimeout 是一种适用于简单情况的解决方案,但如果您在复杂代码中有多个 settimeout,那么您可能会遇到同步问题。

于 2012-05-31T20:24:29.780 回答
1

或使用工作人员,但随后您需要丢弃 msie < 10 或将计算分解为运行时间少于 500 毫秒的段,并使用 setinterval 将负载分散超过 5 秒。google 为代码示例模拟 javascript 中的线程。

于 2012-05-31T20:38:46.443 回答