【发布时间】:2018-04-03 13:59:01
【问题描述】:
我使用的是 select2 版本 4,并且有一个包含大约 16,000 个项目的列表。可以预见的是,这很慢(有时需要超过 5 秒才能打开),所以我正在尝试找到一种方法来加快速度。
目前我的数据正在使用 ajax 请求作为数组检索,然后使用 for 循环/附加插入到 select2/dom 中。
$('#select').select2({
placeholder: "Select"
});
$.ajax("/Example/Data", {
type: 'GET'
})
.success(function (data, status, xhr) {
var option = '<option></option>';
for (var i = 0; i < data.length; i++) {
var curId = data[i].district_id;
var curDist = data[i].district_name;
var curState = data[i].state_short;
option += '<option value="' + curId + '">' + curDist + '('+ curState + ')' + ' - ' + curId + '</option>';
}
$('#select').append(option);
});
我一直在尝试找到一种方法来像现在一样使用 ajax 请求来简单地检索数据,然后使用本地进行分页/无限滚动,但一直无法这样做
我已经尝试过完全实现这一点:http://embed.plnkr.co/sUt9zi 但我无法让它工作(可能是因为它使用的是 select2 v3.4.5)所以如果我们可以让它或类似的东西与 v4 一起工作,那将是很棒。
【问题讨论】:
-
16k 对于现代系统来说真的不算多。没有理由花那么长时间。你应该看看你是否不能优化你的查询。
-
从您的示例看来,您仍在提取整个 16k 项数据集并尝试一次生成一个 dom 元素。这是一项密集的操作,您将需要处理较小的块。 select2 库在这里很好地记录了它们的分页:select2.org/data-sources/ajax#pagination
-
我刚刚意识到你没有使用 sql.... 好吧,你应该。即使使用无限 scoll,它也不会更快,因为您仍然一次加载整个内容。
-
@Occam'sRazor 我正在使用 sql(ajax 使用 sql 进行查询)但查询只是一个 select *,因此基本上返回整个表。如何优化
-
查询可能不是问题,这是将数千个项目附加到 DOM 的问题。 jsfiddle.net/xpvt214o/34248 这是一个仅附加 3000 个项目的小示例。 DOM 操作需要一些时间,将其更改为 16k 几乎会使浏览器崩溃。您将需要逐步研究分页/加载。
标签: javascript jquery select pagination jquery-select2