重置select2值并显示占位符


212

如何设置由select2重置值的占位符。在我的示例中,如果单击了位置或成绩选择框,并且我的select2的值大于select2的值,则应重置并显示默认的占位符。该脚本正在重置值,但不会显示占位符

$("#locations, #grade ").change(function() {
   $('#e6').select2('data', {
     placeholder: "Studiengang wählen",
     id: null,
     text: ''
   });
});

$("#e6").select2({
   placeholder: "Studiengang wählen",
   width: 'resolve',
   id: function(e) {
     return e.subject;
   },
   minimumInputLength: 2,
   ajax: {
     url: "index.php?option=com_unis&task=search.locator&tmpl=component&<?php echo JSession::getFormToken() ?>=1",
     dataType: 'json',
     data: function(term, page) {
       return {
         q: term, // search term
         g: $('#grade option:selected').val(),
         o: $('#locations option:selected').val()
       };
     },
     results: function(data, page) {
       return {
         results: data
       };
     }
   },
   formatResult: subjectFormatResult,
   formatSelection: subjectFormatSelection,
   dropdownCssClass: "bigdrop",
   escapeMarkup: function(m) {
     return m;
   }
});

Answers:


238

您必须将select2定义为

$("#customers_select").select2({
    placeholder: "Select a customer",
    initSelection: function(element, callback) {                   
    }
});

重置select2

$("#customers_select").select2("val", "");

7
我尝试使用<select multiple>进行此操作,但出现错误:将Select2附加到<select>元素时,不允许对Select2使用选项'initSelection'。
Sorin Postelnicu 2014年

14
这对我不起作用。占位符仍不显示。
bcr 2015年

5
请参阅下面的@Lego Stormtroopr的答案,该答案反映了根据Select2 API的新方法。不建议使用上述方法。
大卫

14
从v4.0.3开始,它似乎.select2("val", "")不再可行。
adamj '16

30
$("#customers_select").val('').trigger('change') ;我用了它,它起作用了。
Akshay Kulkarni,

125

Select2更改了其API:

Select2:该select2("val")方法已被弃用,并将在以后的Select2版本中删除。使用$ element.val()代替。

现在最好的方法是:

$('#your_select_input').val('');

编辑:2016年12月评论建议以下是执行此操作的更新方法:

$('#your_select_input').val([]);

135
这将更新该值,但要使其正确显示,您将必须触发更改事件。$('#your_select_input').val('').trigger('change')
Saneem

5
这对我不起作用。占位符仍不显示。
bcr 2015年

3
这对我来说适用于change触发器添加,但也可以触发我们正在使用的验证库-现在,我必须使用不推荐使用的版本。
戴夫牛顿

6
使用select2 4.0.2。不能正常工作。它将重置选择并恢复占位符,但是当我选择一个新值(重置后)时,我还会看到选择了“空字符串”选项(即,其中仅包含“ x”的框)。
kounoupis

1
$('#your_select_input')。val('')。trigger('change')仅在提供占位符时有效。否则,空字符串选项将显示为所选选项。
2016年

115

在我的情况下,接受的答案不起作用。我正在尝试,它正在工作:

定义select2:

$("#customers_select").select2({
    placeholder: "Select a State",
    allowClear: true
});

要么

$("#customers_select").select2({
    placeholder: "Select a State"
});

重置:

$("#customers_select").val('').trigger('change')

要么

$("#customers_select").empty().trigger('change')

2
我发现,除非您定义了占位符,否则allowClear将不起作用
Dan Tappin

无论是$('#your_select_input').val('').trigger('change')$('#your_select_input').val('');没有工作在Firefox
亚历克斯艺术。

1
这对我有用,它会删除我正在使用v4.0.3的select2中的所有数据
ClearBoth

8
$(“#customers_select”)。empty()。trigger('change')对我有用。:)
Munna Khan

1
'$(“#customers_select”)。empty()。trigger('change')'对我有用,谢谢!
塔希尔(Tahirhan)

52

唯一可以为我工作的是:

$('select2element').val(null).trigger("change")

我正在使用4.0.3版

参考

根据Select2文档


2
我也在使用v4.0.3,$('select2element').val("").trigger("change")并且工作也很好。
鲁比

请注意,您的<select>内还必须有一个空的<option>。如果您将Ajax与select2一起使用,则将有帮助-$('#selectFieldId')。prepend('<option selected =“ selected”> </ option>')
musicjerm

19

对于Select2版本4.0.9,这对我有效:

$( "#myselect2" ).val('').trigger('change');

1
这使我的select2下拉列表空白。为我工作。谢谢。
disha

18

Select2使用特定的CSS类,因此重置它的简单方法是:

$('.select2-container').select2('val', '');

而且,您的优势在于,如果您以相同的形式拥有多个Select2,则所有这些都将通过此单个命令被重置。



11

删除所选值

$('#employee_id').select2('val','');

清除选项值

$('#employee_id').html('');

1
fefe要求重新设置占位符文本。因此,仅此答案的第一部分有效。
nterms 2015年

2
是的,这就是为什么我突出显示答案标题的原因。
Shanka SMS

2
的第一个答案的确是从4.0开始不再适用。但是第二种选择救了我!当您要真正清除select2时,这就是解决方案。仅将.val('')设置为选择2是不够的。您还需要清除html。非常感谢!!!
wazza

8

我知道这是一个老问题,但这适用于select2版本4.0

 $('#select2-element').val('').trigger('change');

要么

$('#select2-element').val('').trigger('change.select2'); 

如果您有绑定的更改事件


优秀的解决方案。我必须添加.last()函数来定位新添加的select2框。$('#select2-element').last().val('').trigger('change.select2');
InsParbo

8

使用以下内容配置select2

    $('#selectelementid').select2({
        placeholder: "Please select an agent",
        allowClear: true // This is for clear get the clear button if wanted 
    });

并以编程方式清除选择输入

    $("#selectelementid").val("").trigger("change");
    $("#selectelementid").trigger("change");

7

这是正确的方法:

 $("#customers_select").val('').trigger('change');

我正在使用Select2的最新版本。


6

首先,您必须像这样定义select2:

$('#id').select2({
    placeholder: "Select groups...",
    allowClear: true,
    width: '100%',
})

要重置select2,只需使用以下代码块:

$("#id > option").removeAttr("selected");
$("#id").trigger("change");


5

我尝试了上述解决方案,但对我不起作用。

这是一种技巧,您无需触发更改。

$("select").select2('destroy').val("").select2();

要么

$("select").each(function () { //added a each loop here
        $(this).select2('destroy').val("").select2();
});

5

对于加载远程数据的用户,将在不触发ajax的情况下将select2重置为占位符。适用于v4.0.3:

$("#lstProducts").val("").trigger("change.select2");

为我工作,但我的触发只是“改变”
Gregory R. Sudderth

这是唯一使用Ajax数据从另一个Select2重置Select2的解决方案。
IlludiumPu36

5

因此,要重置表单,您中的有些人将具有重置按钮。在script标签内添加以下代码

$('.your_btn_class').click(function(){
    $('#select_field_id').val([]);
    $("#select_field_id").select2({
    placeholder: "this is a placeholder",
    });
});

或者只是在不保留占位符的情况下清空选择字段:

$('.your_btn_class').click(function(){
    $('#select_field_id').val([]);
 });

3

对于占位符

$("#stateID").select2({
    placeholder: "Select a State"
});

重设选择2

$('#stateID').val('');
$('#stateID').trigger('change');

希望这可以帮助



2

我也有这个问题,它源于val(null).trigger("change");抛出一个No select2/compat/inputData占位符被复位之前的错误。我通过捕获错误并直接设置占位符(以及宽度)来解决该问题。注意:如果您有多个,则需要抓住每个。

try{
    $("#sel_item_ID").select2().val(null).trigger("change");
}catch(err){
    console.debug(err)
}
try{
    $("#sel_location_ID").select2().val(null).trigger("change");
}catch(err){
    console.debug(err)
}
$('.select2-search__field')[0].placeholder='All Items';
$('.select2-search__field')[1].placeholder='All Locations';
$('.select2-search__field').width(173);

我正在运行Select2 4.0.3


听起来您有一个绑定到该change事件的侦听器。尝试触发change.select2-不会触发绑定的侦听器(请参阅github.com/select2/select2/issues/3620)。
Paul

2

从v.4.0.x起...

清除值,恢复占位符的使用...

.html('<option></option>');  // defaults to placeholder

如果为空,它将选择第一个选项而不是您想要的选项

.html(''); // defaults to whatever item is first

坦白说... Select2太难受了,令我惊讶的是它还没有被替换。


1

我已经尝试了上述解决方案,但都无法使用4x版本。

我要实现的是:清除所有选项,但不要触摸占位符。该代码对我有用。

selector.find('option:not(:first)').remove().trigger('change');

如果您使用selector.find('option:not(:first)')。html(''); 它应该工作。
wazza

1

使用select2版本3.2可以为我工作:

$('#select2').select2("data", "");

不需要实施 initSelection


1
到目前为止,这是我最简单的方法。其他方法对我不起作用。
chevybow

1

在这里尝试了前10个解决方案并失败后,我发现解决方案可以工作(请参见页面上的“ nilov评论于4月7日•已编辑”):

(function ($) {
   $.fn.refreshDataSelect2 = function (data) {
       this.select2('data', data);

       // Update options
       var $select = $(this[0]);
       var options = data.map(function(item) {
           return '<option value="' + item.id + '">' + item.text + '</option>';
       });
       $select.html(options.join('')).change();
   };
})(jQuery);

然后进行更改:

var data = [{ id: 1, text: 'some value' }];
$('.js-some-field').refreshDataSelect2(data);

(作者最初显示了var $select = $(this[1]);,而评论者将var $select = $(this[0]);其纠正了,我在上面显示了。)


1

使用此代码到您的js文件中

$('#id').val('1');
$('#id').trigger('change');

0

在使用此“ $("#customers_select").select2("val", ""); 尝试”设置将值清除之前,请将焦点集中在其他任何单击“重置”的控件上。

这将再次显示占位符。


0

DOM接口已经在跟踪初始状态...

因此,执行以下操作就足够了:

$("#reset").on("click", function () {
    $('#my_select option').prop('selected', function() {
        return this.defaultSelected;
    });
});

0

好吧,每当我做

$('myselectdropdown').select2('val', '').trigger('change');

在大约三到四个触发器之后,我开始出现某种程度的滞后。我想这里有内存泄漏。它不在我的代码中,因为如果我删除此行,则我的应用程序没有滞后。

由于我将allowClear选项设置为true,所以我选择了

$('.select2-selection__clear').trigger('mousedown');

后面可以跟$('myselectdropdown')。select2('close');。如果要关闭打开的建议下拉列表,请在select2 dom元素上触发事件触发器。


0

一种[非常]骇客的方法(我看到它适用于4.0.3版):

var selection = $("#DelegateId").data("select2").selection;
var evt = document.createEvent("UIEvents");
selection._handleClear(evt);
selection.trigger("toggle", {});
  • 必须将allowClear设置为true
  • 选择元素中必须存在一个空选项

0

我的解决方案是:

$el.off('select2:unselect')
$el.on('select2:unselect', function (event) {
    var $option = $('<option value="" selected></option>');
    var $selected = $(event.target);

    $selected.find('option:selected')
             .remove()
             .end()
             .append($option)
             .trigger('change');
    });

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.