รีเซ็ตค่า 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;
   }
});

คำตอบ:


238

คุณต้องกำหนด select2 เป็น

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

ในการรีเซ็ต select2

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

7
ฉันลองมันด้วย <select multiple> แต่ฉันได้รับข้อผิดพลาด: ตัวเลือก 'initSelection' ไม่ได้รับอนุญาตให้ใช้สำหรับ Select2 เมื่อต่อกับอิลิเมนต์ <select>
โซริน Postelnicu

15
สิ่งนี้ไม่ได้ผลสำหรับฉัน ตัวยึดตำแหน่งยังไม่ปรากฏขึ้น
bcr

5
ดูคำตอบของ @Lego Stormtroopr ด้านล่างซึ่งสะท้อนวิธีการใหม่ตาม API ของ Select2 วิธีการข้างต้นถูกคัดค้าน
David

14
ในฐานะของ v4.0.3 ดูเหมือนว่าจะไม่.select2("val", "")ทำงานอีกต่อไป
adamj

31
$("#customers_select").val('').trigger('change') ;ฉันใช้สิ่งนี้และใช้งานได้
Akshay Kulkarni

125

Select2 เปลี่ยน API ของพวกเขาแล้ว:

Select2: select2("val")วิธีการเลิกใช้แล้วและจะถูกลบในรุ่น Select2 ในภายหลัง ใช้ $ element.val () แทน

วิธีที่ดีที่สุดในการทำเช่นนี้คือ:

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

แก้ไข: ธันวาคม 2016ความคิดเห็นแนะนำว่าด้านล่างนี้เป็นวิธีการอัปเดตที่ทำได้:

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

136
สิ่งนี้จะอัปเดตค่า แต่เพื่อให้แสดงอย่างถูกต้องคุณจะต้องเรียกใช้เหตุการณ์การเปลี่ยนแปลง $('#your_select_input').val('').trigger('change')
Saneem

5
สิ่งนี้ไม่ได้ผลสำหรับฉัน ตัวยึดตำแหน่งยังไม่ปรากฏขึ้น
bcr

3
สิ่งนี้ใช้ได้กับฉันด้วยการchangeเพิ่มทริกเกอร์ แต่ยังทริกเกอร์ไลบรารีการตรวจสอบความถูกต้องที่เราใช้อยู่ - สำหรับตอนนี้ฉันจะต้องใช้เวอร์ชันที่เลิกใช้แล้ว
Dave Newton

6
สิ่งนี้ทำงานไม่ถูกต้องโดยใช้ select2 4.0.2 มันจะรีเซ็ตตัวเลือกและคืนค่าตัวยึดตำแหน่ง แต่เมื่อฉันเลือกค่าใหม่ (รีเซ็ตโพสต์) ฉันยังเห็นตัวเลือก "สตริงว่าง" (เช่นกล่องที่มีเพียง "x" อยู่)
kounoupis

1
$ ('# your_select_input'). val (''). trigger ('change') ใช้งานได้เฉพาะเมื่อมีการจัดหาตัวแทนไว้ ตัวเลือกสตริงว่างอื่นจะปรากฏเป็นตัวเลือกที่เลือก
amol

116

คำตอบที่ยอมรับไม่ได้ในกรณีของฉัน ฉันกำลังลองสิ่งนี้อยู่และมันทำงานได้ดี:

กำหนด 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 ไม่ทำงาน
แดน Tappin

ทั้ง $('#your_select_input').val('').trigger('change')มิได้$('#your_select_input').val('');ไม่ทำงานใน Firefox
อเล็กซ์ศิลปะ

1
มันใช้งานได้สำหรับฉันมันลบข้อมูลทั้งหมดจาก select2 ฉันใช้ v4.0.3
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")ทำงานได้ดีเช่นกัน
Roubi

โปรดทราบว่าคุณต้องมี <option> ว่างใน <select> ของคุณด้วย หากคุณใช้ ajax กับ select2 สิ่งนี้จะช่วย - $ ('# selectFieldId') prepend ('<ตัวเลือกที่เลือก = "เลือก"> </option>')
musicjerm

20

ด้วย 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

2
ใช่นั่นคือเหตุผลที่ฉันเน้นคำตอบของชื่อ
Shanka SMS

2
คำตอบแรกแน่นอนมันไม่ได้ใช้อีกต่อไปจาก> 4.0 แต่ตัวเลือกที่สองช่วยฉันได้! นี่เป็นวิธีแก้ปัญหาเมื่อคุณต้องการล้าง select2 อย่างแท้จริง เพียงแค่ตั้งค่า. val ('') เพื่อเลือก 2 ไม่เพียงพอ คุณต้องล้างค่า html ด้วย ขอบคุณมาก!!!
wazza

9

ฉันรู้ว่านี่เป็นคำถามแบบเก่า แต่ใช้ได้กับ 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");

8

นี่เป็นวิธีที่ถูกต้อง:

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

6

คุณสามารถล้างข้อมูลการเลือกโดย

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

แต่มันจะไม่ทำให้คุณกลับไปเป็นตัวยึดตำแหน่งของคุณ

ดังนั้นวิธีแก้ปัญหาครึ่ง


5

ฉันลองใช้วิธีแก้ไขปัญหาด้านบน แต่ไม่ได้ผลสำหรับฉัน

นี่เป็นแฮ็คชนิดหนึ่งที่คุณไม่ต้องเปลี่ยน

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

หรือ

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

5

สำหรับผู้ใช้ที่โหลดข้อมูลจากระยะไกลสิ่งนี้จะรีเซ็ต select2 เป็นตัวยึดตำแหน่งโดยไม่ต้องปิด ajax ทำงานร่วมกับ v4.0.3:

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

ทำงานให้ฉัน แต่สิ่งกระตุ้นของฉันคือ 'เปลี่ยน'
Gregory R. Sudderth

นี่เป็นทางออกเดียวที่ทำให้ฉันสามารถรีเซ็ต Select2 จาก Select2 อื่นโดยใช้ข้อมูล Ajax
IlludiumPu36

5

ดังนั้นในการรีเซ็ตแบบฟอร์มบางท่านจะมีปุ่มรีเซ็ต เพิ่มรหัสต่อไปนี้ภายในแท็กสคริปต์

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

หรือเพียงแค่ล้างข้อมูลในฟิลด์ Select โดยไม่ต้องใช้ตัวแทน:

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

3

สำหรับผู้ถือสถานที่

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

ในการรีเซ็ตเลือก 2

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

หวังว่านี่จะช่วยได้


2

ทำตามวิธีที่แนะนำในการทำมัน พบได้ในเอกสารประกอบhttps://select2.github.io/options.html#my-first-option-is-being-displayed-instead-of-my-placeholder (นี่เป็นปัญหาที่ค่อนข้างพบบ่อย):

เมื่อเกิดเหตุการณ์นี้มันมักจะหมายความว่าคุณไม่ได้มีที่ว่างเปล่าเป็นตัวเลือกแรกในของคุณ<option></option><select>

ในขณะที่:

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

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 ('ตัวเลือก: ไม่ (: ก่อน)'). html (''); มันควรจะทำงาน
wazza

1

การใช้ select2 เวอร์ชั่น 3.2 มันใช้งานได้สำหรับฉัน:

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

ไม่จำเป็นต้องดำเนินการ initSelection


1
นี่เป็นวิธีที่ง่ายที่สุดที่ฉันจะทำได้ วิธีอื่นไม่ได้ผลสำหรับฉัน
chevybow

1

หลังจากลองใช้โซลูชัน 10 ข้อแรกที่นี่และล้มเหลวฉันพบวิธีแก้ปัญหานี้ในการทำงาน (ดู "nilov แสดงความคิดเห็นเมื่อ 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]);ซึ่งฉันแสดงไว้ด้านบน)



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

ฉันเริ่มเกิดความล่าช้าหลังจากที่ทริกเกอร์สามถึงสี่ ฉันคิดว่ามีหน่วยความจำรั่ว มันไม่ได้อยู่ในรหัสของฉันเพราะถ้าฉันลบบรรทัดนี้แอปของฉันจะล่าช้า

เนื่องจากฉันได้ตั้งค่าตัวเลือกที่ชัดเจนเป็นจริงฉันจึงไปด้วย

$('.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 ต้องถูกตั้งค่าเป็นจริง
  • ต้องมีตัวเลือกที่ว่างเปล่าในองค์ประกอบที่เลือก

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.