【问题标题】:How to pass <option> attributes to select2?如何将 <option> 属性传递给 select2?
【发布时间】:2016-02-28 19:48:40
【问题描述】:

我正在使用 Select2 4.0。我有一个选项列表,其中一些已“删除”,我想指出哪些是哪些。我的选择元素是这样的:

<style>.deleted { color: red; }</style>

<select name="itemid" id="item-list" tabindex="1">
    <option></option>
    <option value="1">Item 1</option>
    <option value="2" class="deleted">Item 2</option>
    <option value="3">Item 3</option>
</select>

它的初始化是这样的:

<script src="/static/js/select2.min.js"></script>
<script>
$(function() {
    $("#item-list").select2({
        placeholder: 'Select item'
    });
});
</script>

但是,在 select2 生成的 HTML 代码中,我看不到任何引用该类的方法。还尝试了选项上的data-deleted 属性,但没有成功。

我看到的唯一接近的是templateResult 选项,我可以在其中检查opt.element.className。但我看不到如何从那里访问 select2 选项。无论如何,该回调在每次搜索时都会运行,这根本不是我想要的。

还有其他方法可以设置 Select2 中特定选项的样式吗?

更新:如 cmets 中所述,有一个 find() 函数,但它只获取原始的 &lt;option&gt; 元素,而不是 select2 生成的 &lt;li&gt; 元素。这是我尝试过的:

var sel2 = $("#item-list").select2({
    placeholder: 'Select item'
});

sel2.find('.deleted').each(function() {
    $(this).css('color', 'red');
});

【问题讨论】:

  • @isherwood 你是什么意思,什么数据?
  • HTML 是在服务器端生成的,因此该页面与我在问题中的代码完全相同。
  • 在这种情况下,您似乎可以使用find() 获取属性:stackoverflow.com/questions/22261209/…
  • 我认为你可以使用find() 函数
  • 那只获取原始元素,看我的更新。

标签: jquery html-select jquery-select2


【解决方案1】:

从 Select2 4.0.1 (just released) 开始,您可以使用 templateResult 选项转移课程。第一个参数是要显示的数据对象,第二个参数是要显示的容器。

$("select").select2({
  templateResult: function (data, container) {
    if (data.element) {
      $(container).addClass($(data.element).attr("class"));
    }
    return data.text;
  }
});
.yellow { background-color: yellow; }
.blue { background-color: blue }
.green { background-color: green; }
<link href="//cdnjs.cloudflare.com/ajax/libs/select2/4.0.1/css/select2.css" rel="stylesheet"/>

<script src="//cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/select2/4.0.1/js/select2.js"></script>

<select class="select2">
  <option value="AL" class="yellow">Alabama</option>
  <option value="AK" class="blue">Alaska</option>
  <option value="AZ" class="green">Arizona</option>
</select>

【讨论】:

  • 知道它是以前的版本吗?
【解决方案2】:

如果您还想使用将类添加到所选项目,请从 templateSelection 调用相同的函数。

function select2CopyClasses(data, container) {
    if (data.element) {
        $(container).addClass($(data.element).attr("class"));
    }
    return data.text;
}

$("select").select2({
    templateResult: select2CopyClasses,
    templateSelection: select2CopyClasses
});

【讨论】:

  • 这就是我认为的完整答案
  • 是的,没错
【解决方案3】:

如果你想默认这样做,每个新的 select2 都会将类定义从选项复制到 select2-element。 加载select2.js后包含代码

$.fn.select2.defaults.set("templateResult", function(item, li) {
  if (item && item.element && item.element.className.length) {
    $(li).addClass(item.element.className);
  }
  return item.text;
}

【讨论】:

  • 请举例说明为什么这不起作用。它在某些客户项目上运行良好,那么您会遇到什么样的错误?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-12-03
  • 2023-04-02
  • 1970-01-01
  • 2013-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多