Đặt lại giá trị select2 và hiển thị giữ chỗ


212

Làm cách nào để đặt trình giữ chỗ trên giá trị được đặt lại bằng select2. Trong ví dụ của tôi Nếu các vị trí hoặc hộp chọn lớp được nhấp và select2 của tôi có giá trị hơn giá trị của select2 sẽ đặt lại và hiển thị trình giữ chỗ mặc định. Kịch bản này đang đặt lại giá trị nhưng sẽ không hiển thị trình giữ chỗ

$("#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;
   }
});

Câu trả lời:


238

Bạn phải xác định select2 là

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

Để đặt lại select2

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

7
Tôi đã thử điều này với <select multi>, nhưng tôi gặp lỗi: Tùy chọn 'initSelection' không được phép cho Select2 khi được gắn vào phần tử <select>.
Sorin Postelnicu

14
Điều này không làm việc cho tôi. Trình giữ chỗ vẫn không hiển thị.
bcr

5
Xem câu trả lời của @Lego Stormtroopr bên dưới, phản ánh phương pháp mới theo API của Select2. Phương pháp trên không được chấp nhận.
David

14
Kể từ phiên bản 4.0, nó dường như không .select2("val", "")còn hoạt động nữa.
adamj

30
$("#customers_select").val('').trigger('change') ;Tôi đã sử dụng nó và nó đã làm việc.
Akshay Kulkarni

125

Select2 đã thay đổi API của họ:

Chọn 2: select2("val")Phương thức đã không được chấp nhận và sẽ bị xóa trong các phiên bản Chọn2 sau. Sử dụng $ Element.val () thay thế.

Cách tốt nhất để làm điều này bây giờ là:

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

Chỉnh sửa: Tháng 12 năm 2016 Nhận xét cho thấy bên dưới là cách cập nhật để thực hiện việc này:

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

135
Điều này cập nhật giá trị, nhưng để nó hiển thị chính xác, bạn sẽ phải kích hoạt một sự kiện thay đổi. $('#your_select_input').val('').trigger('change')
Saneem

5
Điều này không làm việc cho tôi. Trình giữ chỗ vẫn không hiển thị.
bcr

3
Điều này hoạt động với tôi với changebổ sung kích hoạt, nhưng cũng kích hoạt thư viện xác nhận mà chúng tôi đang sử dụng - hiện tại tôi sẽ phải sử dụng phiên bản không dùng nữa.
Dave Newton

6
Điều này không hoạt động chính xác, sử dụng select2 4.0.2. Nó sẽ đặt lại lựa chọn và khôi phục trình giữ chỗ, nhưng khi tôi chọn một giá trị mới (đặt lại bài đăng), tôi cũng thấy đã chọn tùy chọn "chuỗi rỗng" (nghĩa là một hộp chỉ có "x" trong đó).
kounoupis

1
$ ('# your_select_input'). val (''). kích hoạt ('thay đổi') chỉ hoạt động khi giữ chỗ được cung cấp. tùy chọn chuỗi trống khác sẽ được hiển thị dưới dạng tùy chọn đã chọn.
amol

115

Câu trả lời được chấp nhận không hoạt động trong trường hợp của tôi. Tôi đang thử cái này và nó đang hoạt động:

Xác định select2:

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

hoặc là

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

Để thiết lập lại:

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

hoặc là

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

2
Tôi thấy rằng trừ khi bạn có trình giữ chỗ được xác định thì allowClear không hoạt động
Dan Tappin

Không $('#your_select_input').val('').trigger('change')phải cũng $('#your_select_input').val('');không hoạt động trong Firefox
Alex Art.

1
cái này hoạt động với tôi, nó xóa tất cả dữ liệu khỏi select2 Tôi đang sử dụng v4.0.3
ClearBoth

8
$ ("# Users_select"). blank (). trigger ('change') hoạt động với tôi. :)
Munna Khan

1
'$ ("# Users_select"). blank (). trigger (' thay đổi ')' đã làm việc cho tôi, cảm ơn!
Tahirhan

52

Điều duy nhất có thể làm việc cho tôi là:

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

Tôi đang sử dụng phiên bản 4.0.3

Tài liệu tham khảo

Theo Tài liệu Chọn2


2
Tôi cũng đang sử dụng v4.0.3 và $('select2element').val("").trigger("change")cũng hoạt động tốt.
Roubi

Xin lưu ý rằng bạn cũng phải có <tùy chọn> trống bên trong <select> của mình. Nếu bạn đang sử dụng ajax với select2, điều này sẽ giúp - $ ('# selectFieldId'). Trả trước ('<tùy chọn đã chọn = "đã chọn"> </ tùy chọn>')
musicjerm

19

Với Select2 phiên bản 4.0.9, điều này hoạt động với tôi:

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

1
Điều này làm cho drop2 select2 của tôi trống. Đã làm cho tôi. Cảm ơn.
Disha

18

Select2 sử dụng một lớp CSS cụ thể, vì vậy một cách dễ dàng để đặt lại nó là:

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

Và bạn có lợi thế nếu bạn có nhiều Select2 ở cùng một hình thức, tất cả chúng sẽ được đặt lại bằng lệnh đơn này.


15

Dùng cái này :

$('.select').val([]).trigger('change');

Đối với tôi, đã làm việc với $ ('. Select2'). Val ([]). Kích hoạt ('thay đổi');
Marcelo Agimóvel

11

ĐỂ XÓA giá trị đã chọn

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

ĐỂ XÓA GIÁ TRỊ TÙY CHỌN

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

1
fefe đang yêu cầu thiết lập lại văn bản giữ chỗ. Vì vậy, chỉ có phần đầu tiên của câu trả lời này là hợp lệ.
vào

2
Vâng, đó là lý do tại sao tôi làm nổi bật tiêu đề câu trả lời.
Shanka SMS

2
Câu trả lời đầu tiên thực sự không áp dụng nữa từ> 4.0. Nhưng lựa chọn thứ hai đã cứu tôi! Đây là giải pháp khi bạn muốn thực sự xóa select2. Chỉ cần đặt .val ('') để chọn 2 là không đủ. Bạn cũng cần phải xóa html. Cảm ơn rất nhiều!!!
wazza

8

Tôi biết đây là một câu hỏi cũ, nhưng nó hoạt động cho phiên bản select2 4.0

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

hoặc là

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

nếu bạn có sự kiện thay đổi ràng buộc với nó


Giải pháp tuyệt vời. Tôi đã phải thêm hàm .last () để nhắm mục tiêu vào hộp select2 mới được thêm vào. $('#select2-element').last().val('').trigger('change.select2');
InsParbo

8

Sử dụng theo sau để cấu hình select2

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

Và để xóa lựa chọn đầu vào theo chương trình

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

7

Đây là cách chính xác:

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

Tôi đang sử dụng bản phát hành mới nhất của Select2.


6

Trước tiên, bạn phải xác định select2 như thế này:

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

Để đặt lại select2, đơn giản là bạn có thể sử dụng khối mã sau:

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

6

Bạn có thể xóa lựa chọn bằng cách

$('#object').empty();

Nhưng nó sẽ không biến bạn trở lại chỗ giữ chỗ của bạn.

Vì vậy, nó là một giải pháp một nửa


5

Tôi đã thử các giải pháp trên nhưng nó không hiệu quả với tôi.

Đây là loại hack, nơi bạn không phải kích hoạt thay đổi.

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

hoặc là

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

5

Đối với người dùng đang tải dữ liệu từ xa, điều này sẽ đặt lại select2 thành trình giữ chỗ mà không bắn ra ajax. Hoạt động với v4.0.3:

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

Làm việc cho tôi nhưng kích hoạt của tôi chỉ là "thay đổi"
Gregory R. Sudderth

Đây là giải pháp duy nhất giúp tôi thiết lập lại Chọn 2 từ một Chọn 2 khác bằng dữ liệu Ajax.
IloidiumPu36

5

Vì vậy, để thiết lập lại hình thức, một số bạn sẽ có nút đặt lại. Thêm mã sau vào thẻ script

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

Hoặc chỉ để trống trường chọn mà không giữ một trình giữ chỗ:

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

3

Đối với người giữ chỗ

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

Để thiết lập lại chọn 2

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

Hi vọng điêu nay co ich


2

Theo cách được đề nghị làm điều đó. Tìm thấy trong tài liệu https://select2.github.io/options.html#my-first-option-is-being-displayed-instead-of-my-placeholder (đây có vẻ là một vấn đề khá phổ biến):

Khi điều này xảy ra, điều đó thường có nghĩa là bạn không có khoảng trống <option></option>làm tùy chọn đầu tiên trong <select>.

như trong:

<select>
   <option></option>
   <option value="foo">your option 1</option>
   <option value="bar">your option 2</option>
   <option value="etc">...</option>
</select>

2

Tôi cũng gặp vấn đề này và nó bắt nguồn từ val(null).trigger("change");việc ném No select2/compat/inputDatalỗi trước khi giữ chỗ được đặt lại. Tôi đã giải quyết nó bằng cách bắt lỗi và đặt trình giữ chỗ trực tiếp (cùng với chiều rộng). Lưu ý: Nếu bạn có nhiều hơn một, bạn sẽ cần phải bắt từng người.

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);

Tôi đang chạy Chọn2 4.0.3


Có vẻ như bạn có một người nghe bị ràng buộc với changesự kiện này. Hãy thử kích hoạt change.select2- điều đó sẽ không kích hoạt trình nghe bị ràng buộc (xem github.com/select2/select2/issues/3620 ).
Paul

2

kể từ v.4.0.x ...

để xóa các giá trị, nhưng cũng khôi phục sử dụng trình giữ chỗ ...

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

nếu nó trống, nó sẽ chọn mục tùy chọn đầu tiên thay vào đó có thể không phải là thứ bạn muốn

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

thẳng thắn ... Chọn2 là một nỗi đau ở mông, điều đó làm tôi ngạc nhiên vì nó đã không được thay thế.


1

Tôi đã thử các giải pháp trên nhưng không có giải pháp nào hoạt động với phiên bản 4x.

Những gì tôi muốn đạt được là: xóa tất cả các tùy chọn nhưng không chạm vào trình giữ chỗ. Mã này làm việc cho tôi.

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

Nếu bạn sử dụng selector.find ('tùy chọn: không (: đầu tiên)'). Html (''); nó nên hoạt động
wazza

1

Sử dụng select2 phiên bản 3.2, điều này làm việc cho tôi:

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

Không cần thực hiện initSelection


1
Đây là cách đơn giản nhất để tôi làm điều đó. Các phương pháp khác không hiệu quả với tôi.
chevybow

1

Sau khi thử 10 giải pháp đầu tiên ở đây và thất bại, tôi thấy giải pháp này hoạt động (xem "nilov đã nhận xét vào ngày 7 tháng 4 • đã chỉnh sửa" bình luận xuống trang):

(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);

Thay đổi được thực hiện:

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

(Tác giả ban đầu cho thấy var $select = $(this[1]);, mà một bình luận đã sửa var $select = $(this[0]);, mà tôi hiển thị ở trên.)


1

Sử dụng mã này vào tập tin js của bạn

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

0

Trước khi bạn xóa giá trị bằng cách sử dụng này $("#customers_select").select2("val", ""); hãy đặt tiêu điểm này vào bất kỳ điều khiển nào khác khi nhấp vào đặt lại.

Điều này sẽ hiển thị giữ chỗ một lần nữa.


0

Giao diện DOM, đã theo dõi trạng thái ban đầu ...

Vì vậy, làm như sau là đủ:

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

0

Vâng bất cứ khi nào tôi làm

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

Tôi bắt đầu nhận được một số độ trễ sau ba đến bốn kích hoạt. Tôi cho rằng có một rò rỉ bộ nhớ. Nó không nằm trong mã của tôi bởi vì nếu tôi loại bỏ dòng này, ứng dụng của tôi không bị lag.

Vì tôi có các tùy chọn allowClear được đặt thành true, tôi đã sử dụng

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

Điều này có thể được theo sau bởi $ ('myselectdropdown'). Select2 ('close'); kích hoạt sự kiện trên phần tử dom2 trong trường hợp bạn muốn đóng đề xuất mở xuống.


0

Một cách rất hay để làm điều đó (tôi thấy nó hoạt động cho phiên bản 4.0.3):

var selection = $("#DelegateId").data("select2").selection;
var evt = document.createEvent("UIEvents");
selection._handleClear(evt);
selection.trigger("toggle", {});
  • allowClear phải được đặt thành true
  • một tùy chọn trống phải tồn tại trong phần tử chọn

0

Giải pháp của tôi là:

$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');
    });

0
$('myselectdropdown').select2('val', '0')

Trong đó 0 là giá trị đầu tiên của bạn trong danh sách thả xuống

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.