- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在使用 GWT 构建一个 HTML 应用程序,总体上性能是正确的。
有时,它会加载 DOM 中的许多对象,导致应用程序变慢。我使用 Chrome Developer Tools Profiler 来查看时间花在了哪里(在 Chrome 下,一旦应用程序被编译,即没有 GWT 开销)并且很明显方法 getAbsoluteLeft()/getBoundingClientRect() 消耗了主要的这段时间的一部分。
这是 Chrome 下使用的实现(com.google.gwt.dom.client.DOMImplStandardBase):
private static native ClientRect getBoundingClientRect(Element element) /*-{
return element.getBoundingClientRect && element.getBoundingClientRect();
}-*/;
@Override
public int getAbsoluteLeft(Element elem) {
ClientRect rect = getBoundingClientRect(elem);
return rect != null ? rect.getLeft()
+ elem.getOwnerDocument().getBody().getScrollLeft()
: getAbsoluteLeftUsingOffsets(elem);
}
这对我来说很有意义,因为 DOM 中的元素越多,计算绝对位置所需的时间就越多。 但这令人沮丧,因为有时您知道应用程序的一部分发生了变化,而这些方法仍然需要时间来计算绝对定位,这可能是因为它不必要地重新检查了一大堆 DOM 元素。我的问题不一定是 GWT 导向的,因为它是一个浏览器/javascript 相关的问题:
是否有任何已知的解决方案来改进大型 DOM 元素应用程序的 GWT getAbsoluteLeft/javascript getBoundingClientRect 问题?
我没有在互联网上找到任何线索,但我想到了这样的解决方案:
编辑:
使用 Chrome TimeLine 调试器,并在 DOM 中有很多元素时执行特定操作,我的性能一般:
Layout 通过 getBoundingClientRect 方法耗时 900ms。本页列表all the methods triggering layout in WebKit , 包括 getBoundingClientRect ...
因为我在 dom 中有很多元素不受我的操作影响,我假设 layout 在整个 DOM 中进行重新计算,而 paint 可以通过 css 属性/DOM 树以缩小其范围(例如,我可以通过 firebug 中的 MozAfterPaintEvent 看到它)。
除了分组和少调用触发布局的方法,有什么减少布局时间的线索吗?
一些相关文章:
最佳答案
我终于解决了我的问题:getBoundingClientRect 在应用程序中触发了一个完整的 layout 事件,这需要多次通过繁重的 CSS 规则。
事实上,布局时间与DOM中元素的数量并不成正比。您可以使用 light 样式绘制数十万个,布局只需 2ms。
在我的例子中,我有两个 CSS 选择器和一个匹配数十万个 DOM 元素的背景图片,这在布局期间消耗了大量时间。通过简单地删除这些 CSS 规则,我将布局时间从 900 毫秒减少到 2 毫秒。
关于javascript - 大型应用程序的回流/布局性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13234214/
不确定是否有解决此问题的方法。我想知道是否有一种方法可以检测浏览器何时实际更新用户界面。 假设我想在运行长时间运行的同步代码块之前向元素添加一个类,在同步函数运行之后,该类将被删除。 el.class
给定这段代码: $('#foo').css('height', '100px'); // or any other change to the DOM console.log('done!'); 当第
有没有办法全局 console.log() Reflux 中所有触发的 Action ?理想情况下同时打印它们的参数。 最佳答案 正如 Cory Danielson 所说,Reflux 使用 Even
出于某种原因,每次我在我的 React 组件中触发一个 Action 时,与该 Action 关联的存储方法都会触发两次。使用 Firefox 调试器,我注意到事件发射器似乎“发射”了两次 Actio
我正在处理一个包含用户可调整大小的列的网页,并且在调整列大小时遇到重排问题,这会导致元素在列变窄时被下推和不对齐。然而,谷歌文档似乎没有这个问题;您可以调整文档列表的大小,它会 chop 文本而不
好吧,我遇到了我认为是优化问题的问题。我写了一个简短的应用程序,它从两个字段中获取数据,逐个字符地将它们分开并将它们相互匹配,突出显示差异。问题似乎是因为函数循环并且不仅一次打印每个字符,而且一次一个
我在阅读两个 CSS 属性 display:none 和 visibility:hidden 之间的区别时遇到了 DOM reflow 术语。 声明是 display: none causes a D
页面呈现流程 在讨论页面重绘、回流之前。需要对页面的呈现流程有些了解,页面是怎么把html结合css等显示到浏览器上的,下面的流程图显示了浏览器对页面的呈现的处理流程。可能不同的浏览器略微会有些不
我经常读到在读取元素样式后更改样式是一种不好的做法,因为它会触发不必要的重排。考虑来自 here 的这段代码: 错误代码: elementA.className = "a-style"; var he
嗨,我有这个导航栏: text
有时我们必须强制浏览器重绘/回流以呈现某些状态。例如: window.onload = function () { setTimeout(function(){ document.getE
我是 JavaScript 和 D3 新手,我正在尝试修改 DOM 元素的某些属性,然后进行页面重排/刷新,以便我可以看到这些更新的更改。诀窍是,我需要这种情况自动发生,而不需要任何类型的 oncli
过去我在 javascript 方面做过很多工作,包括一些 DOM 操作。从那里我了解到回流/重绘在某些情况下可能是一个很大的性能问题,并且通常应该限制在最低限度。例如,当添加一组 div 时,您应该
我最近在我的项目中使用了回流,这是一个让我很困惑的问题。 作为回流模式,我在我的 React 组件中调用操作,并在我的回流存储中获取正在监听这些操作的远程数据。我的组件会监听存储中数据的变化。例如获取
tl;dr:每次我向其添加新图表时,GraphStore 的 UUID 都会发生变化。这让我假设每个图都在创建自己独特的 GraphStore。我希望他们都共享一个商店。 我有一个包含多个图形组件的
例如,如果我做类似的事情 requestAnimationFrame(function() { el.appendChild(otherEl) el.appendChild(anoth
是否可以在 RubyMine 3.2.4 中格式化或重新缩进 html?我尝试了 Code... Reformat Code 但它似乎对 HTML 没有任何作用。我需要插件吗? 最佳答案 它确实有效。
我想知道现代网络浏览器是否有一种可靠的方法来检测文档回流和/或重绘,或者是否有任何紧迫的兴趣可能将其放入 W3 规范。 我还想知道如何使用特定于 vendor 的技巧(例如,Mozilla 显然有一个
block 项的每个可视行的第一个元素是否有一个 CSS 选择器?也就是说,想象一下有 20 个 block 元素,它们跨多行流动以适应它们的父容器;我可以选择每行最左边的元素吗? 通过查看所有元素的
我正在构建一个 React+Reflux 应用程序,除其他外,它允许创建/删除/编辑类别。到目前为止,我能够显示所有类别并通过关联的存储和操作处理 React 组件内类别的创建/删除。这一切都很好,更
我是一名优秀的程序员,十分优秀!