Select2 disable/enable 具体选项
Select2 disable/enable specific option
我有一个类型为 select2 的列表。
<select id="list" class="form-control select2 select2-hidden-accessible" tabindex="-1" aria-hidden="true">
<optgroup label="Types">
<option value="None">None</option>
<option value="1">One</option>
<option value="2">Two</option>
</optgroup>
</select>
我想禁用 value=1 的选项
所以我喜欢这个
$("#list>optgroup>option[value='1']").prop('disabled',true);
Result:// <option value="1" disabled>One</option>
它工作正常;但如果我想重新启用禁用的选项,我尝试了以下代码,但仍然禁用了 select2 选项。
$("#list>optgroup>option[value='1']").prop('disabled',false);
$("#list>optgroup>option[value='1']").removeProp('disabled');
Result:// <option value="1">One</option>
but strange is disabled 属性 该选项被移除。但 select2 选项仍处于禁用状态。
不知道如何解决这个问题。需要帮助。
更新:如果我检查 select2 的 DOM,即使在删除禁用后它也会有这个 属性。
<li class="select2-results__option" id="select2-template-type-list-result-4qd3-merge" role="treeitem" aria-disabled="true">One</li>
如果我设置 aria-disabled="false" 它将启用。无法得到什么原因。
禁用试试这个:
$("#list>optgroup>option[value='1']").attr('disabled','disabled');
删除禁用试试这个:
$("#list>optgroup>option[value='1']").removeAttr('disabled');
实现此目的的最简单方法可能是在更改禁用属性后再次对元素调用 .select2(…)
。
因为 select2 用自定义 HTML 元素替换了 原来的 select 字段(并隐藏了原来的),显然没有“观察”原始 select 元素的选项在调用后不断更改其禁用状态,您必须在更改状态后再次调用它,以便它从原始元素的选项中读取当前属性值。
在某些情况下,您需要同时删除 prop(节点 属性)和 attr(文档 HTML 属性)。尽管 jQuery 倾向于那样对待它们,但它们实际上并不相同。
所以你需要做
$("#list>optgroup>option[value='1']").removeAttr('disabled').removeProp('disabled');
这样它就同时删除了节点 属性 和 dom 属性。
也就是说您可能需要更新这里没有人提到正确解决方案的 select2 实例。
$('#list').trigger('change.select2');
.trigger('change') 也可以工作,但如果将其他功能挂接到更改事件中,则会产生一些副作用。此外,您不能在已经挂钩的 on('change') 函数中使用它。
下面的代码行将禁用所有选项。
$('#list option').prop('disabled',true);
此行将仅启用值为 1 的选项。
$('#list option[value="1"]').prop('disabled',false);
$('#list').select2();
以上是更简化的答案。
$("#list").find(':selected').attr('disabled','disabled');
$("#list").trigger('change');
查看官方文档
https://select2.org/programmatic-control/retrieving-selections
如果您计划使用 select2 class 动态禁用和启用 select 选项,您可以参考以下内容。
我有两个 select 标签(ids xaxis 和 yaxis)具有相同的选项列表,我希望用户不要 select 这个 select 标签的相同选项。
function checkfieldvalue(value,select_id)
{
/* enable all options first */
$('#xaxis option').prop('disabled',false);
$('#yaxis option').prop('disabled',false);
if(select_id==0){
$('#xaxis option[value="'+value+'"]').prop('disabled',true);
}else{
$('#yaxis option[value="'+value+'"]').prop('disabled',true);
}
}
我有一个类型为 select2 的列表。
<select id="list" class="form-control select2 select2-hidden-accessible" tabindex="-1" aria-hidden="true">
<optgroup label="Types">
<option value="None">None</option>
<option value="1">One</option>
<option value="2">Two</option>
</optgroup>
</select>
我想禁用 value=1 的选项 所以我喜欢这个
$("#list>optgroup>option[value='1']").prop('disabled',true);
Result:// <option value="1" disabled>One</option>
它工作正常;但如果我想重新启用禁用的选项,我尝试了以下代码,但仍然禁用了 select2 选项。
$("#list>optgroup>option[value='1']").prop('disabled',false);
$("#list>optgroup>option[value='1']").removeProp('disabled');
Result:// <option value="1">One</option>
but strange is disabled 属性 该选项被移除。但 select2 选项仍处于禁用状态。
不知道如何解决这个问题。需要帮助。
更新:如果我检查 select2 的 DOM,即使在删除禁用后它也会有这个 属性。
<li class="select2-results__option" id="select2-template-type-list-result-4qd3-merge" role="treeitem" aria-disabled="true">One</li>
如果我设置 aria-disabled="false" 它将启用。无法得到什么原因。
禁用试试这个:
$("#list>optgroup>option[value='1']").attr('disabled','disabled');
删除禁用试试这个:
$("#list>optgroup>option[value='1']").removeAttr('disabled');
实现此目的的最简单方法可能是在更改禁用属性后再次对元素调用 .select2(…)
。
因为 select2 用自定义 HTML 元素替换了 原来的 select 字段(并隐藏了原来的),显然没有“观察”原始 select 元素的选项在调用后不断更改其禁用状态,您必须在更改状态后再次调用它,以便它从原始元素的选项中读取当前属性值。
在某些情况下,您需要同时删除 prop(节点 属性)和 attr(文档 HTML 属性)。尽管 jQuery 倾向于那样对待它们,但它们实际上并不相同。
所以你需要做
$("#list>optgroup>option[value='1']").removeAttr('disabled').removeProp('disabled');
这样它就同时删除了节点 属性 和 dom 属性。
也就是说您可能需要更新这里没有人提到正确解决方案的 select2 实例。
$('#list').trigger('change.select2');
.trigger('change') 也可以工作,但如果将其他功能挂接到更改事件中,则会产生一些副作用。此外,您不能在已经挂钩的 on('change') 函数中使用它。
下面的代码行将禁用所有选项。
$('#list option').prop('disabled',true);
此行将仅启用值为 1 的选项。
$('#list option[value="1"]').prop('disabled',false);
$('#list').select2();
以上是更简化的答案。
$("#list").find(':selected').attr('disabled','disabled');
$("#list").trigger('change');
查看官方文档
https://select2.org/programmatic-control/retrieving-selections
如果您计划使用 select2 class 动态禁用和启用 select 选项,您可以参考以下内容。
我有两个 select 标签(ids xaxis 和 yaxis)具有相同的选项列表,我希望用户不要 select 这个 select 标签的相同选项。
function checkfieldvalue(value,select_id)
{
/* enable all options first */
$('#xaxis option').prop('disabled',false);
$('#yaxis option').prop('disabled',false);
if(select_id==0){
$('#xaxis option[value="'+value+'"]').prop('disabled',true);
}else{
$('#yaxis option[value="'+value+'"]').prop('disabled',true);
}
}