optgroup select all

我们在做项目时,经常会用到select查询。如果select有很多个选项,我们为了方便查看,会用optgroup分组显示:

<select multiple="multiple" id="model">
  <optgroup label="A">
    <option value ="A1">A1</option>
    <option value ="A2">A2</option>
  </optgroup>
  <optgroup label="B">
    <option value ="B1">B1</option>
    <option value ="B2">B2</option>
  </optgroup>
</select>

但optgroup有些缺陷:不能点击,也不能点击父类全部选中子类。
针对optgroup的上述问题,我们进行了改造。
我们思路为父子都定义为option,用css控制父子的显示。

.optionGroup {
    font-weight: bold;
    font-style: italic;
}

.optionChild {
    padding-left:15px;
}

父类option的value="group"class="optionGroup"
子类option的name为父类option的text,这步是方便根据父类找到对应的子类,class="optionChild"
然后我们在select上加上onchange事件:onchange="selectChild();"
当select选中父选项时,由于父选项的value为group,我们通过var selectItemText = $('#model option:selected').text();获取父选项的text,然后到select查询option name为父类text的选项,然后设置为选中状态。
动态拼接select的代码如下:

function setOpt_model(opdata, model) {
  $("#yonghujixing").html('');
  var op = '<select multiple="multiple" size="5"  name="model"  id="model" onchange="selectChild();" class="col-xs-10 col-sm-10">';
  if (model == null || model == "" || model == ",-1,"){
    op += "<option value='All' selected=\"selected\">全部</option>";
  }
  else{
    op += "<option value='All'>全部</option>";
  }
  for (var index = 0; index < opdata.length; index ++) {
      var parentInfo = opdata[index];
      $.each(parentInfo,
      function(key) {
          var childArray = parentInfo[key];
          op += "<option value=\"group\" class=\"optionGroup\">" + key + "</option>";
          for (var childIndex = 0; childIndex < childArray.length; childIndex++) {
              var childObj = childArray[childIndex];
              if (model.indexOf("," + childObj.code + ",") >= 0) {
                op += "<option value=" + childObj.code + " name=" + key + " class=\"optionChild\" selected=\"selected\">" + childObj.name + "</option>";
              }
              else{
                op += "<option value=" + childObj.code + " name=" + key + " class=\"optionChild\">" + childObj.name + "</option>";
              }
          }
      });
  }
  op += "</select>";
  $("#yonghujixing").append(op);
}

select的onchange事件代码如下:

function selectChild(){
   var selectItemValue = $('#model option:selected').val();
   var selectItemText = $('#model option:selected').text();
   if(selectItemValue == "group"){
      var childArray = $("#model option[name='" + selectItemText + "']");
      for(var index = 0; index < childArray.length; index++){
         var selectValue = childArray[index].value;
         $("#model option[value='" + selectValue + "']").prop("selected", true);
      }
   }
}

这样我们便变相实现了optgroup的显示效果,同时可以实现选中父类,则全部选中对应子类的功能。
但这种实现还有一个缺陷,只能一次点击父类选中对应全部子类,后续选项仍需Ctrl+点击选中。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值