基本上我有一个巨大的表,当用户向下滚动时会变得更大(自动预加载后续行)。在某些时候,浏览器变得迟钝,它开始挂起片刻,因为我点击或尝试滚动,它变得越来越慢,它获得的行越多。我想知道页面可以容纳的元素数量是否有任何限制?或者也许只是我的javascript泄漏到某处(虽然我只有一个事件处理程序,附加到表的tbody - 以及一个解析冒泡的mousedown事件的脚本)。
更新:在加载了数千行后,延迟变得明显。滚动本身的速度是非常可以忍受的,但是例如突出显示所点击的行(在tbody上的单个事件处理程序的帮助下)是痛苦的(它需要至少2-3秒并且延迟随行数增加)。我观察到所有浏览器的延迟。这不仅仅是我,而是几乎每个访问该页面的人,所以我猜它在某种程度上会影响到每个平台。
更新:我在这里提出了一个简单的例子:http://client.infinity-8.me/table.php?num=1000(你可以传递你想要的任何数字 num ),基本上它会渲染一个表格 num 行,并且有一个附加到父表的事件处理程序。我应该从中得出结论,由于子元素的数量,实际上没有明显的性能下降。所以它可能是其他地方的泄漏:(
答案 0 :(得分:6)
您应该关注的另一件事是表格大小调整。如果您的表格使用table-width:auto;
设置样式,则浏览器必须测量表格中的每个元素以确定其大小。这可能会非常缓慢。
相反,请使用table-width:fixed
选择固定宽度或至少为表格设置样式。
答案 1 :(得分:4)
如果你在每个表行上都有JS,那么旧计算机将无法处理。对于HTML本身,你不必担心。
你应该担心普通人不喜欢大桌子的事实,这就是为什么做分页。使用分页将其分开以获得更好的可用性或其他问题。
想想没有页面但只有一个大页面的书,你想阅读吗?即使你的眼睛(在我们的情况下是PC)也可以处理它。
答案 2 :(得分:4)
我认为标准没有定义限制。在每个浏览器实现中可能存在硬编码限制,但我认为这个限制很可能是数十亿个元素。另一个限制是可寻址内存的数量。
解决您的问题:除了在向下滚动时自动加载元素,您还可以自动卸载已从屏幕上滚动的元素。然后,即使滚动很多,你的程序仍然会保持快速。
您可能还想考虑其他界面,例如分页。
答案 3 :(得分:0)
我认为没有限制。 但是,HTML文件越长,您的计算机所需的资源就越多。但桌子必须非常大......
答案 4 :(得分:0)
该限制实际上取决于所使用的用户代理和客户端计算机。 HTML与XML一样,是一种树格式的数据。因此,越多的元素,客户端浏览器必须通过树进一步搜索以呈现页面。
我在向div添加超过100个表时遇到了问题(作为IE6的旧解决方法,无法动态创建表元素)。
答案 5 :(得分:0)
您使用的浏览器是什么?有些浏览器可以比其他浏览器更好地处理事情 - 例如,如果你使用IE浏览器,我不会感到惊讶,如果它是缓慢的 - 它不会处理javascript事件以及基于webkit的浏览器。
另一件事显然是你的电脑(RAM和CPU)。但说实话,大多数计算机应该没有问题,除非我们说10000多行...甚至那时......
你可以发布一些代码吗?
答案 6 :(得分:0)
鉴于存在大量浏览器和渲染引擎,并且都具有不同的性能特征,并且考虑到这些引擎在性能方面得到稳步提升,并且计算机硬件始终变得更快:没有固定的上限是什么浏览器可以处理。但是,特定版本的浏览器的特定硬件目前存在上限。
如果您没有更多地定义您的硬件和浏览器很难帮助您。此外,如果您不发布代码,没有人可以就您的Javascript的可能性能提出任何建议。即使它只是一个事件处理程序,如果它无限循环或者它为每个元素调用它,它可能会大大减慢渲染过程。
答案 7 :(得分:0)
没关系RAM或CPU使用率,文件预加载后的实际大小是多少?
如果你的表真的那么大,你可能会强迫你的用户下载数兆字节的数据 - 我发现有些机器在2-4MB数据后会挂起。
答案 8 :(得分:0)
取决于。例如,在加载所有内容之前,IE不会开始渲染表。因此,如果你有一个5,000行表,它需要在渲染任何数据之前加载所有5,000行数据,而其他浏览器一旦有部分数据就开始渲染,并随着表的增长调整一点(如果需要)。
一般来说,渲染会随着节点数量的增加而减慢,但节点的复杂性也会变慢......避免使用嵌套表,如果可能的话,尝试将大表分解成块...例如。每100行(如果可能)
答案 9 :(得分:0)
世界上没有理由在单个页面上发布整个庞大的数据集。如果要求是为用户提供所有数据,那么您应该将其导出到一个文件,该文件可以被一些比浏览器更好的软件读取。
相反,我建议您创建一个AJAX驱动的页面,让用户看到一部分数据,如果需要查看更多数据,您只需下载该部分数据集并替换当前数据集。页。这是分页。谷歌搜索就是一个很好的例子。
答案 10 :(得分:0)
如果有任何限制,则取决于浏览器。但问题是你没有限制,因为浏览器仍然显示页面。
大表一直是浏览器的问题。渲染大型表需要花费大量时间。 因此,将大表拆分为较小的表通常是个好主意。
此外,您可能希望指定列宽。没有它,浏览器必须先下载整个表,然后才能计算每列的宽度并渲染表。如果在HTML代码中指定宽度,则浏览器可以在仍在下载时显示该页面。 (注意:指定整个表的宽度是不够的,您需要指定每列的宽度。)
如果使用Javascript将一行添加到一个大表中,浏览器很可能必须再次呈现整个表。这就是它变得如此缓慢的原因。如果您有较小的表,则只需要再次渲染一个小表。更好的是,如果你一次只加载一个子表而不是一行。
但最有效的方法是将数据拆分为多个页面。用户可能也更喜欢这样。这就是为什么谷歌在每个页面上只显示如此多的结果。