每当您处理数千个项目时,DOM 操作都会很慢。循环遍历许多 DOM 元素并根据元素的特征来操作每个元素通常不是一个好主意,因为这涉及在每次迭代中对 DOM 方法的大量调用。如您所见,它真的很慢。
更好的方法是将数据与 DOM 分开。搜索 JS 字符串数组要快几个数量级。
这可能意味着将您的数据集加载为 JSON 对象。如果这不是一个选项,您可以遍历<li>
s 一次(在页面加载时),并将数据复制到一个数组中。
现在您的数据集不依赖于存在的 DOM 元素,您可以在每次用户键入时简单地替换<ul>
using的全部内容。.html()
(这比 JS DOM 操作要快得多,因为浏览器可以优化 DOM 更改,只需更改innerHTML
.)
var dataset = ['term 1', 'term 2', 'something else', ... ];
$('input').keyup(function() {
var i, o = '', q = $(this).val();
for (i = 0; i < dataset.length; i++) {
if (dataset[i].indexOf(q) >= 0) o+='<li>' + dataset[i] + '</li>';
}
$('ul').html(o);
});
如您所见,这是非常快的。
但是请注意,如果您将其增加到 10,000 个项目,则在前几次击键时性能开始受到影响。这与插入到 DOM 中的结果数量有关,而不是与正在搜索的原始项目数量有关。(随着您键入的内容越多,要显示的结果越少,性能也很好——即使它仍在搜索所有 10,000 个项目。)
为避免这种情况,我会考虑将显示的结果数量限制在一个合理的范围内。(1,000 似乎和任何一个一样好。)这是自动完成;没有人真正查看所有结果——他们将继续输入,直到结果集可供人类管理。