You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Select2中optgroup分组下的子选项无法选中如何解决?

问题

我已成功创建带分组的Select2模板,但无法选中分组内的选项,确认下方编写的代码是否存在配置遗漏。

  • 效果预览:可查看对应演示动图了解故障表现

所用数据格式参考Select2官方数据格式规范

AJAX接口返回结果

{
  "status": true,
  "message": null,
  "data": [
    {
      "text": "Bank",
      "children": [
        {
          "id": "002",
          "icon": ".../payment/bri_1.png",
          "text": "BANK BRI"
        },
        {
          "id": "008",
          "icon": ".../payment/mandiri_1.png",
          "text": "BANK MANDIRI"
        },
        {
          "id": "009",
          "icon": ".../payment/bni_1.png",
          "text": "BANK BNI / SYARIAH"
        },
        {
          "id": "014",
          "icon": ".../payment/bca_1.png",
          "text": "BANK BCA"
        },
        {
          "id": "022",
          "icon": ".../payment/1280px-CIMB_Niaga_logo.svg.png",
          "text": "CIMB NIAGA / SYARIAH"
        },
        {
          "id": "016",
          "icon": ".../payment/Maybank-Logo.png",
          "text": "Maybank"
        },
        {
          "id": "013",
          "icon": ".../payment/images.png",
          "text": "PERMATA BANK"
        },
        {
          "id": "213",
          "icon": ".../payment/Jenius-logo.png",
          "text": "Jenius/BTPN"
        },
        {
          "id": "011",
          "icon": ".../payment/kissclipart-danamon-logo-png-clipart-bank-danamon-logo-a9b2b21755c37a3a.png",
          "text": "Danamon"
        },
        {
          "id": "012",
          "icon": ".../payment/images_1.png",
          "text": "Bank Neo Commerce/Bank Yudha Bakti"
        },
        {
          "id": "017",
          "icon": ".../payment/images-removebg-preview.png",
          "text": "Bank Syariah Indonesia"
        }
      ]
    },
    {
      "text": "eMoney",
      "children": [
        {
          "id": "900",
          "icon": ".../payment/ovo.png",
          "text": "OVO"
        },
        {
          "id": "901",
          "icon": ".../payment/gopay.png",
          "text": "GOPAY"
        },
        {
          "id": "903",
          "icon": ".../payment/dana_1.png",
          "text": "DANA"
        },
        {
          "id": "904",
          "icon": ".../payment/linkaja.png",
          "text": "LINK AJA"
        },
        {
          "id": "906",
          "icon": ".../payment/shopeepay-shopee.co.id_ratio-16x9.jpg",
          "text": "SHOPEE PAY"
        }
      ]
    }
  ]
}

实现代码

JavaScript 代码

$("#payment").select2({
  placeholder: 'Payment',
  width: 'resolve',
  minimumResultsForSearch: Infinity,
  templateResult: function formatState(state) {
    if (!state.id) return state.text;
    var $state = $(
      '<span><img src="' + state.icon + '" style="width:30px;"/> ' + state.text + '</span>'
    );
    return $state;
  },
  ajax: {
    url: base_url + 'user/api/payment',
    dataType: 'json',
    processResults: function(data) {
      return {
        results: $.map(data.data, function(item, key) {
          var children = [];
          for (var k in item.children) {
            var childItem = [];
            childItem.id = item.children[k].id;
            childItem.icon = item.children[k].icon;
            childItem.text = item.children[k].text;
            children.push(childItem);
          }
          return {
            text: item.text,
            children: children,
          }
        })
      };
    },
  }
});

HTML 代码

<script src="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.13/js/select2.min.js"></script>
<div class="form-group">
  <label for="" class="col-sm-2 control-label">Payment</label>
  <div class="col-sm-10">
    <select name="payment" id="payment" class="form-control">
    </select>
  </div>
</div>

故障原因

代码存在数据类型使用错误:处理分组下的子选项时,错误将单个子选项声明为数组类型。Select2仅识别对象格式的选项数据,数组上挂载的id、text等属性无法被组件读取,最终渲染出的子选项没有绑定对应数据,点击无法选中。

修复方案

将processResults回调内声明子项的代码从数组改为对象即可,修改后的对应代码段如下:

processResults: function(data) {
  return {
    results: $.map(data.data, function(item, key) {
      var children = [];
      for (var k in item.children) {
        // 原错误写法:var childItem = [];
        var childItem = {};
        childItem.id = item.children[k].id;
        childItem.icon = item.children[k].icon;
        childItem.text = item.children[k].text;
        children.push(childItem);
      }
      return {
        text: item.text,
        children: children
      }
    })
  };
}

修改后重新加载组件,分组内选项即可正常选中。

内容的提问来源于stack exchange,提问作者A human being

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 17:12:30