【问题标题】:jQuery Select2 - get style attribute from original option's selectjQuery Select2 - 从原始选项的选择中获取样式属性
【发布时间】:2020-05-05 09:49:20
【问题描述】:

这是我的 HTML 代码:

<select class="select2">
    <option value="1" style="background-color: #ff0000;">OPTION 1</option>
    <option value="2" style="background-color: #ffffff;">OPTION 2</option>
    ....
    <option value="144" style="background-color: #000000;">OPTION 144</option>
</select>

最后,我使用 select2 打印这个选择列表:

$('.select2')select2();

问题在于样式属性 - 当我在每个选项中设置此属性时,jQuery 脚本不会为 &lt;li&gt; 列表复制此属性。

我知道,我可以将每个 background-color 设置为 &lt;style&gt;&lt;/style&gt; 标记,但我有更多选项(~150)并且我在我的网站上管理这个属性(背景颜色)作为实时(当用户更改一些选项时,然后我更改背景颜色),所以我需要原始选项列表中的实时复制样式属性的解决方案,当我重置选择列表(使用$('.select2').select2())时,背景颜色也将被重置。

我该怎么做?

@UPDATE

我就是这样解决问题的:

function formatState(data, container)
    {
        if (data.element)
        {
            $(container).css('background-color', '#'+$(data.element).attr('data-style'));
        }
        return data.text;
    }

$('.select2').select2({templateResult: formatState});

然后我替换选项 HTML 代码:

<option value="1" style="background-color: #ff0000;">OPTION 1</option>

为此:

<option value="1" data-style="ff0000">OPTION 1</option>

【问题讨论】:

    标签: jquery jquery-select2


    【解决方案1】:

    首先,作为一个选项,您可以定义类并像下面的 jquery 示例一样使用它,将.data('style') 替换为.data('class'),将style=" 替换为class="。然后你可以写这个 HTML

    <!-- ... -->
    <option value="1" data-class="option-white">OPTION 1</option>
    <!-- ... -->
    

    解决方案

    否则,您可以使用 templateResult 选项来模板化下拉菜单 - 您是 find the docs here。 根据您分享的示例,我会这样解决:

    $(document).ready(function() {
    
      function formatState(state) {
        if (!state.id) {
          return state.text;
        }
    
        return $(
          '<div style="' + $(state.element).data('style') + '"> ' + state.text + '</div>'
        );
      };
    
      $('.select2').select2({
        templateResult: formatState
      });
      
    });
    .select2-results__option { padding: 0 !important; }
    .select2-results__option div { padding: 6px; }
    <link href="https://cdn.jsdelivr.net/npm/select2@4.0.13/dist/css/select2.min.css" rel="stylesheet" />
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/select2@4.0.13/dist/js/select2.min.js"></script>
    
    <select class="select2">
        <option value="1" data-style="background-color: #ff0000;">OPTION 1</option>
        <option value="2" data-style="background-color: #ffffff;">OPTION 2</option>
        <!-- .... -->
        <option value="144" data-style="background-color: #000000;">OPTION 144</option>
    </select>

    【讨论】:

    • 感谢您的回复!您的解决方案很有帮助,但不完全是因为它有效并且选项文本具有我设置的背景 - 这很好。但问题在于完整选项的背景(不仅是文本,而且是所有选项) - 这里仍然是白色背景。我需要将所有地方的背景设置为每个选项的解决方案。有可能吗?
    • 我根据你的例子解决了我的问题 - templateResult 非常有帮助,这篇文章:stackoverflow.com/questions/33926375/… 我用解决方案编辑了我的第一篇文章。谢谢。
    • @PavloP 您的解决方案非常好。如果您想知道另一种解决方案,可以选择修改容器的CSS(请参阅我的编辑答案)。
    • 在我的例子中,我不能使用类,因为用户可以使用颜色选择器设置背景颜色,所以我不能创建具有 100.000 个颜色选项(或更多)的 CSS 类。
    猜你喜欢
    • 2013-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-19
    • 1970-01-01
    • 1970-01-01
    • 2016-04-06
    相关资源
    最近更新 更多