当前位置: 首页 > 知识库问答 >
问题:

选择选项中有大量数据时,选择2非常慢

沈飞翼
2023-03-14

我正在使用select 2插件进行多项选择。当我在select 2框中单击时,速度非常慢。显示选项列表或使输入框可用于键入需要时间。可能是因为数据量大。

这是代码

    <select multiple class="chosen-multi-select" name="related_cities[]">
      <?php if(!empty($all_locations)){
        foreach($all_locations as $l):
        ?>
      <option value="<?php echo $l->id;?>"  <?php if(in_array($l->id,$related_selected)){ echo "selected"; } ?> ><?php echo $l->location;?></option>
      <?php endforeach; } ?>
    </select>

这里$l变量有10000多个结果。如何解决此问题。

共有1个答案

爱唯
2023-03-14

我最近遇到了同样的问题,并通过编写一个自定义适配器成功地解决了这个问题。

这是我的select2 v4x解决方案

$.fn.select2.amd.define(
    "select2/data/customArray",
    [
        'select2/data/array',
        'select2/utils'
    ],
    function(ArrayAdapter, Utils) {
        function CustomArrayAdapter ($element, options) {
            var data = options.get("data");
            var pageLength = options.get("pageLength");

            this._data = data ? Array.from(data) : this._items($element);
            this._pageLength = pageLength || 25;

            CustomArrayAdapter.__super__.constructor.call(this, $element, options);
        };

        Utils.Extend(CustomArrayAdapter, ArrayAdapter);

        CustomArrayAdapter.prototype.query = function (params, callback) {
            var pageLength = this._pageLength;
            var page = params.page || 1;
            var term = params.term;
            var pagedData = [];
            var data = this._data;

            if (!!term) {
                data = data.filter(function (elemData) {
                    return (elemData.text.toLowerCase().indexOf(term.toLowerCase()) > -1)
                });
            }

            pagedData = data.slice(
                (page - 1) * pageLength,
                page * pageLength
            );

            callback({
                results: pagedData,
                pagination: {
                    more: data.length >= (page * pageLength)
                }
            });
        };

        CustomArrayAdapter.prototype._items = function($element) {
            var data = [];
            var self = this;

            var $options = $element.children();

            $options.each(function () {
                if (
                    this.tagName.toLowerCase() !== 'option' &&
                    this.tagName.toLowerCase() !== 'optgroup'
                ) {
                    return;
                }

                var $option = $(this);
                var option = self.item($option);

                data.push(option);
            });

            return data;
        }

        return CustomArrayAdapter;
    }
);

现在,这一个处理分页和搜索简单用例。但是,分页不能简单地工作,因为select2应该正确处理结果。

如果我们使用ajax数据,默认适配器会处理它,在我们的情况下,我们需要自己处理它。

因此,您将使用以下选项初始化您的select2。

$('select[name="related_cities[]"]').select2({
    pageLength: 15,
    dataAdapter: $.fn.select2.amd.require('select2/data/customArray'),
    resultsAdapter: $.fn.select2.amd.require(
        [
            'select2/utils',
            'select2/results',
            'select2/dropdown/infiniteScroll'
        ],
        function(Utils, ResultsList, InfiniteScroll) {
            var CustomResultsList = ResultsList;

            CustomResultsList = Utils.Decorate(
                 CustomResultsList,
                 InfiniteScroll
            );

            // If you want additional support functionalities
            // you would decorate this with the corresponding decorators.
            // please refer to the advanced section of select2 documentation

            return CustomResultsList;
        }
    )
});
 类似资料:
  • 我希望,如果我选择“mammals”,动物选择选项只显示值为1的选项data-animal_class。 我知道如何获得哺乳动物值,但我不知道如何使用过滤器 这是我的代码:

  • 问题内容: 我已经建立了这个小提琴作为我在做什么的一个例子。 我正在尝试做的事情在Firefox中可以正常工作。打开选择选项时,字体大小为 14px 。 但是,在Google Chrome浏览器中查看它会选择继承的font-size为 34px 。 理想情况下,我希望将选择选项设置为字体大小 14px 。 这可能吗? 如果需要,我愿意在jQuery中进行任何相关的修复。 谢谢 代码如下… 我的 C

  • 问题内容: 我在表中有三列:id,街道名称,计数。对于某些ID,不只是一个街道名称。Count告诉将每条街道分配给ID的频率。我怎样才能只获得编号最高的ID和街道名称。 表格示例: 结果应该是这样的: 提前致谢! 问题答案: 您没有指定正在使用的数据库,但是应该可以使用以下数据库: 请参阅带有演示的SQL Fiddle 。注意,您将必须使用MySQL的反引号或数据库使用的任何字符来转义保留字来转义

  • 问题内容: 我想设置一个先前选择的要在页面加载时显示的选项。我用以下代码尝试了它: 与 但这是行不通的。有任何想法吗? 问题答案: 这绝对应该工作。确保已将代码放入:

  • 我想调用一个函数时,选择的任何选项。类似于这样: 但不知何故不起作用。有人能帮忙吗。 请注意 我不想捕获更改事件,如果我选择已经选择选项,则不会触发更改事件

  • 问题内容: 我正在尝试从以下查询中获取行数。我只得到行计数为1,但有35条记录。您能否让我知道如何从内部查询中获取计数? 谢谢 问题答案: 您缺少FROM,需要为子查询指定别名。