当拖动包含数千个子节点的Div元素时,提高浏览器性能
Improve Browser Performance When Dragging Div Element Containing Thousands of Child Nodes
这个问题与使用javascript创建复杂的用户界面有关,同时保持浏览器的高性能。
具体来说,当在屏幕上拖动包含数千个节点的元素时,如何使浏览器的FPS不会明显下降。
我使用javascript来生成基于一些事情的表单输入:首先,这个表单有几个级别,每个级别然后包含3个子级别,其中所有包含3个子级别。确切地说,有3个父级,每个父级有3个子级,这些子级有3个子级。这使得总共有27个容器,然后生成表单元素。
一旦为这27个容器中的每个容器生成了输入,主容器中就有超过2600个输入,这个容器是一个jquery对话框。
我希望我已经解释清楚了。我所拥有的是一个包含数千个输入的jQuery对话框,当你在屏幕上拖动这个对话框时,它非常起伏,不光滑。我认为这种缓慢是由于容器中有成千上万的DOM节点在移动。
我怎么能允许如此大量的元素被拖拽而不显著降低浏览器的FPS ?
一开始我打算称这个问题为"当拖拽包含数千个输入的jQuery对话框时如何提高浏览器FPS",但我将其重命名为更准确一点。
编辑:无论我使用jQuery dialog()来使主容器可拖动,还是我使用普通的javascript,性能都非常缓慢。
编辑2:(我到底在做什么)成千上万的输入永远不会像网页表单那样被填写。输入可能包含也可能不包含实时生成样式表的用户输入的值。可以说,我正在构建一个视觉元素构建器。使用充满输入的对话框,用户可以在元素数组上设置样式。基本上,我通过表单对许多元素提供了完整的CSS控制。的确,这有点疯狂,如果不是不可能的话…但就像爱因斯坦说的,"如果一开始,这个想法不是荒谬的,那么它就没有希望"……不管怎样,如果我能把它完成,它就会像以前从未建造过的东西一样。正如我在下面的评论中所指出的,实际上一次只有100个输入是可见的。编辑3:作为测试,我删除了所有输入的2/3,性能显著提高。既然所有的元素都不需要一次显示,只有当用户导航到表单的那个部分时才需要显示,那么是否有某种方法可以让DOM忽略它们,直到真正需要它们为止?用户看到的只是实际存在的输入的一小部分。
感谢每个回答我问题的人,我感谢你们的投入(尽管我已经收到了几千条……LOL)。
通过在当前视图之外的任何输入上设置display: none, DOM会忽略这些节点,并且可以毫无延迟地拖动表单。
所以解决方案真的很简单。在所有不需要显示的容器上设置display: none(因为你一次只能看到大约100个输入),并且DOM在拖拽主容器时重新绘制时忽略节点。
问题解决了
- 如何在不影响其他元素的情况下扩展DIV
- DIV怎么能像Javascript中的另一个元素一样工作呢
- 循环对象时更新页面上的DIV元素
- 在DIV中动态插入HTML并访问新元素
- 单击javascript按钮显示/隐藏Div元素
- 如何确定滚动DIV中的可见DOM元素
- 范围和列表元素在 DIV 中换行
- Javascript 在提交时禁用 Div 元素
- 在 AJAX 调用中发送 DIV 元素的 ID
- 在具有特定ID的DIV中使用JavaScript动态添加HTML元素
- 使用JavaScript函数添加多个DIV元素
- 如果在Div元素外部单击,请关闭该元素
- 使用jQuery将列表中的元素集封装在DIV中
- 如何使用CSS3/JavaScript缩放DIV元素及其子元素以适应父元素
- 如何将SVG元素和Div放入图像中,以便用户可以下载
- 将DIV元素绑定到溢出滚动条
- 如何切换DIV元素的可见性
- jQuery - 将元素拖入 DIV / 或可排序元素
- Div在浏览器的检查元素中很暗,无法检索内容
- JavaScript/jQuery:如何获得元素(DIV)旋转后的实际原始位置