鼠标离开事件

时间:2017-02-01 10:48:42

标签: javascript css browser reflow

有时我的小部件需要在鼠标离开事件中处理数百万个数据。这可能需要几秒钟,具体取决于要处理的记录。所以我决定在处理前显示等待弹出窗口。

问题是等待弹出窗口(div overlay)完全不可见。如果我在延迟10毫秒以上的setTimeout中进行处理,则叠加层可见并按预期工作。

叠加div

<div style="background: black; opacity: 0.6; position: absolute; z-index: 1000; pointer-events: none; width: 810px; height: 450px; left: 8px; top: 29px; display: none;"></div>

在鼠标离开事件中,

overlay.style.display = "block";
widget.processRecords(data); //this function may take seconds depending upon data
overlay.style.display = "none";

我知道绝对定位应该触发最小的回流。但它没有用。我想也许我的div元素有问题。但是运行上面的代码延迟10毫秒,我可以看到覆盖,直到小部件完成处理

延迟叠加

overlay.style.display = "block";
window.setTimeout(function(){
    this.processRecords(data); //this function may take seconds depending upon data
    overlay.style.display = "none";
}, 10);

添加延迟有效,但浪费了10毫秒的处理时间。有没有其他方法可以强制浏览器重排绝对定位的元素。我看到其他关于强制回流的堆栈溢出问题,但没有一个有一个可靠的答案。我还提到了以下链接来强制重排一个元素 https://gist.github.com/paulirish/5d52fb081b3570c81e3a但除了延迟之外,它们都没有任何影响。

浏览器:Chrome,版本:53

修改 我问这个问题是为了更多地了解浏览器中的重排以及如何控制它们。解决另一个问题有许多缺点。

1)数据处理应该不必要地等待10毫秒

2)如果它是一个简单的函数,我可以轻松地在setTimeout或setInterval中使用它。但我正在处理一个处理KB代码的小部件。它需要对延迟进行大量更改。

3)如果我需要更改20 div元素的样式,那么将浪费200毫秒

4)其他问题的解决方案在超时内使用超时等等进行处理。

我只是说其他问题的答案不适合这种情况。应该有其他方法或方法来使用JavaScript触发浏览器的重排,我正在寻找它。

0 个答案:

没有答案