首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用jQuery动态添加optgroup

使用jQuery动态添加optgroup
EN

Stack Overflow用户
提问于 2012-09-24 16:53:44
回答 4查看 28.3K关注 0票数 11
代码语言:javascript
复制
<select id="myElement" multiple="multiple">
  <option value="1">Category Type</option>
  <option value="158">itemOne</option>
  <option value="157">itemTwo</option>
  <option value="7">My Type</option>
  <option value="20">itemThree</option>
  <option value="21">itemFour</option>
  <option value="22">itemFive</option>
  <option value="8">Category Yet Another</option>
  <option value="31">itemCheese</option>
  <option value="32">itemBrain</option>
</select>

我需要动态转换它,以便" Category“选项(任何不以”item“开头的选项)是一个optgroup,包装它后面的任何内容,直到下一个Category选项,所以上面的结果将如下所示:

代码语言:javascript
复制
<select id="myElement" multiple="multiple">
  <optGroup label="Category Type">
    <option value="158">One</option>
    <option value="157">Two</option>
  </optGroup>
  <optGroup label="My Type">
    <option value="20">Three</option>
    <option value="21">Four</option>
    <option value="22">Five</option>
  </optGroup>
  <optGroup label="Category Yet Another">
    <option value="31">Cheese</option>
    <option value="32">Brain</option>
  </optGroup>
</select>

如何使用jQuery遍历并更改值以获得所需的效果?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-09-24 17:09:42

您必须遍历option元素,并根据其内容对其进行分组。使用jQuery比只使用纯DOM容易得多:

http://jsfiddle.net/kpykoahe/2/

代码语言:javascript
复制
$(document).ready(() => {
    const $cont = $('select');
    $('option').each((idx, el) => {
        const $el = $(el);
        if ($el.text().startsWith('item')) {
            $cont.find('optgroup').last().append($el);
            $el.text($el.text().substr(4));
        } else {
            $('<optgroup/>').attr('label', $el.text()).appendTo($cont);
            $el.remove();
        }
    });
});
票数 20
EN

Stack Overflow用户

发布于 2012-09-24 17:20:17

您可以使用filter()来匹配将成为组的<option>元素。然后,您可以迭代它们并在相同的元素集合上调用nextUntil()以匹配后续选项(因为nextUntil()将在遇到集合中的一个成员时停止,即下一个应该成为一个组的选项)。

在那里,您可以在这些<option>元素上使用wrapAll()来创建它们的<optgroup>元素,然后在刚刚成为一个组的<option>元素上调用remove()。类似于:

代码语言:javascript
复制
var $groups = $("#myElement option").filter(function() {
    return $(this).text().indexOf("item") != 0;
});
$groups.each(function() {
    var $this = $(this);
    $this.nextUntil($groups).wrapAll($("<optgroup>", {
        label: $this.text()
    })).end().remove();
});

您可以在this fiddle中查看结果。

票数 6
EN

Stack Overflow用户

发布于 2012-09-24 17:37:21

我的实现:

代码语言:javascript
复制
$(function(){
    var target = $('#target'),
        optGroup;

    function strStartsWith(str, prefix) {
        return str.indexOf(prefix) === 0;
    }

    $('#myElement').find('option').each(function(){
        var elm = $(this).clone();
        if(strStartsWith(elm.text(), 'item'))
        {
            elm.text(elm.text().substr(4));
            if(optGroup) optGroup.append(elm);
        }
        else
        {
            optGroup = $('<optgroup>').attr('label', elm.text());
            target.append(optGroup);
        }
    });
});

演示:http://jsfiddle.net/HUHRz/1/

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12561680

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档