使用 Javascript 优化一个巨大的无序列表
Optimizing a huge Unordered List with Javascript
我目前在我的网站上有一个搜索框,用于搜索图像并返回结果,如列表元素所示:
<ul>
<li rel="1"><img src="imgurl" /></li>
<li rel="2"><img src="imgurl" /></li>
<li rel="3"><img src="imgurl" /></li>
<li rel="4"><img src="imgurl" /></li>
</ul>
然后,每个图像都有一个与之关联的单击事件,该事件只是在单击的图像的父 li 中添加一个叠加层。
有时我的搜索结果会包含 300+ 个结果,这在桌面上不是什么大问题,但在移动设备上会导致巨大的延迟,例如,当有人点击图像添加叠加层时,可能需要 4-5 秒才能出现叠加层。
现在我想到了解决这个问题的方法如下:
将所有 li 元素添加到数组中(作为字符串而不是 DOM 元素(
摧毁原来的li元素。
计算屏幕的大小以及一次可以显示多少图像
添加用于在列表中滚动的滑块 ui 元素
根据滑块的位置以及我们可以容纳多少元素 屏幕从数组中提取我们实际可以看到的元素并销毁其余元素
循环返回的数组结果,并将所有结果添加到单个字符串中。 然后将包含我们可以看到的所有结果的字符串附加到 UL 中。
我的问题是这真的会给我带来性能提升吗?正如我所相信的那样,我最初的问题是 dom 中的元素太多了。
这也是一件很常见的事情,或者有更好的方法吗?
谢谢
移动设备上的缓慢性能似乎是由于DOM中的大量项目。我已经尝试了各种方法来加速 jsfiddle 上的代码(例如减少 jQuery DOM 请求的数量(,但它仍然很慢 http://jsfiddle.net/5LfMt/15/
我已经对你最初的问题中的建议做了一个变体:http://www.strudel.org.uk/test/stack.html 它非常粗糙,没有任何错误检查,但表明基本思想有效并且更快。它可能还应该有助于页面渲染时间,因为浏览器最初不必渲染所有 500 张图像。
我假设你所有的图像都有相同的已知高度。我创建了一个文件名数组,然后确定哪些是可见的。列表的顶部填充会更新,以确保我们停留在文档中的正确位置。我附加了一个滚动侦听器,它更新列表 - 删除列表项,然后添加可见项。从 DOM 中删除它们的一个结果是覆盖层也被删除了,所以我创建了一个数组来记录覆盖层的状态。
- 我可以使用javascript在本地创建和保存一个巨大的文件吗
- 通过jQuery发布一个巨大的html表单
- AngularJS,过滤器:如何将一个巨大的对象(JSON)变成一个数组
- Browserify生成一个*巨大的*输出文件
- 使用 Javascript 优化一个巨大的无序列表
- 用Javascript框架重构一个巨大的表单
- 如何在一个巨大的多维数组中找到每列的最大长度
- 正在限制文本区域中的字数..但当我输入最大字数时,输入的文本突然变成了一个巨大的字符串
- 在JavaScript中循环遍历一个巨大的数组
- 如何通过javascript或jquery读取一个巨大的文本文件
- 用一个巨大的字符串“”转换数组;数字”;,用逗号分隔成一个数字数组(而不是字符串)
- Box2d创造了一个巨大的身体——把它分开
- 将javascript命名空间添加到一个巨大的项目中
- 有没有比insertAdjacentHTML()和一个巨大的HTML字符串更好的方法将HTML插入DOM中
- 充满事件处理程序的巨大文件!如何在AJAX web应用程序中组织一个大型jQuery文件
- 完整的日历形式Arshaw不适合,它有一个巨大的高度
- 对一个巨大的数组进行并行或同步迭代会更快吗?
- 处理一个巨大的状态对象
- 如何使用 php 有效地将一个巨大的 JavaScript 字符串存储到文件中
- 使用数组值缩短一个巨大的列表