JQuery Select2 — как выбрать все параметры

Я использую раскрывающийся список множественного выбора jQuery select2. Мне нужно выбрать все параметры в раскрывающемся списке из кода. По сути, есть флажок «Выбрать все», в котором должна быть реализована эта функция, я хочу выбрать/отменить выбор параметров в этом флажке.


person Ibad Baig    schedule 14.05.2013    source источник


Ответы (17)


Описание есть в ветке на гитхабе. Цитирование (https://github.com/ivaynberg/select2/issues/195#issuecomment-13489140 авторства MortadaAK), что позволяет вам выбирать все, нажав ctrl+a.

$(document).on("keypress",".select2-input",function(event){
    if (event.ctrlKey || event.metaKey) {
        var id =$(this).parents("div[class*='select2-container']").attr("id").replace("s2id_","");
        var element =$("#"+id);
        if (event.which == 97){
            var selected = [];
            element.find("option").each(function(i,e){
                selected[selected.length]=$(e).attr("value");
            });
            element.select2("val", selected);
        } else if (event.which == 100){
            element.select2("val", "");
        }
    }
});
person Piotr Stapp    schedule 14.05.2013
comment
@kkudi спросите автора на github - person Piotr Stapp; 21.07.2013
comment
что я хотела спросить у автора? приведенный выше код у меня вообще не работает. не знаю почему. я также сделал отладку кода. мои данные загружаются через ajax, не уверен, что есть какая-то разница. - person kkudi; 21.07.2013
comment
Я не уверен, что это то поведение, о котором я спрашиваю. Я хочу, чтобы после того, как вы напечатаете be, появился список кровати, пчелы, согнутого, колокольчика, и вы хотите выбрать все элементы из списка. - person kkudi; 23.07.2013
comment
@kkudi вы все еще можете сделать это с помощью флажка «Выбрать все», но, как сказал Гарат, вам придется написать свою собственную логику. Когда пользователь вводит be и нажимает Select All, отметьте все те выбранные значения, которые начинаются с be. - person Ibad Baig; 23.07.2013
comment
Если вы используете подчеркивание/lodash, вы можете программно выбрать все параметры из раскрывающегося списка, например: $("#someId").val(_.pluck($("#someId option"), "value")).trigger("change"); - person djKianoosh; 29.01.2014
comment
Обратите внимание, что этот код не работает, когда результаты загружаются с помощью ajax. - person sieppl; 11.02.2014

используя Select 2 DEMO

$("#e1").select2();
$("#checkbox").click(function(){
    if($("#checkbox").is(':checked') ){
        $("#e1 > option").prop("selected","selected");// Select All Options
        $("#e1").trigger("change");// Trigger change to select 2
    }else{
        $("#e1 > option").removeAttr("selected");
        $("#e1").trigger("change");// Trigger change to select 2
     }
});

$("#button").click(function(){
       alert($("#e1").val());
});
<select multiple id="e1" style="width:300px">
        <option value="AL">Alabama</option>
        <option value="Am">Amalapuram</option>
        <option value="An">Anakapalli</option>
        <option value="Ak">Akkayapalem</option>
        <option value="WY">Wyoming</option>
    </select>
<input type="checkbox" id="checkbox" >Select All

<input type="button" id="button" value="check Selected">

Вам нужен код Как показано в DEMO2 для простого выбора

$("#checkbox").click(function(){
    if($("#checkbox").is(':checked') ){
        $("select > option").prop("selected","selected");
    }else{
        $("select > option").removeAttr("selected");
     }
});

$("#button").click(function(){
       alert($("select").val());
});

<select multiple size=2>
  <option value="volvo">Volvo</option>
  <option value="saab">Saab</option>
  <option value="opel">Opel</option>
  <option value="audi">Audi</option>
</select> <input type="checkbox" id="checkbox" >Select All

<input type="button" id="button" value="check Selected">
person rahul maindargi    schedule 14.05.2013
comment
работал как шарм. Я бы только отфильтровал параметры без значений, иначе вы получите пустые параметры. $("#e1 > option").filter(function() { return $(this).val().length; }); - person stevenspiel; 04.03.2015
comment
что, если я удалю некоторые параметры, поле выбора все еще выбрано, как заставить их выбирать, если я изменю некоторые параметры. - person shakyl mansuri; 15.12.2016
comment
DEOMO1: Как изменить это, чтобы он выбирал только параметры после выполнения функции поиска? Например, вы ищете ala, который приносит Алабаму и Амалапурам, а затем я хочу выбрать все, чтобы выбрать только эти 2? - person pdolinaj; 29.04.2021

Ответ от здесь работает очень хорошо.

// Select all
$('#select-id').select2('destroy').find('option').prop('selected', 'selected').end().select2();

// Unselect all
$('#select-id').select2('destroy').find('option').prop('selected', false).end().select2();
person Alliswell    schedule 05.03.2018
comment
Супер простой способ загрузки и выгрузки опций для select2. спасибо - person Raj; 30.07.2018
comment
Очень аккуратный и чистый подход. - person Ibad Baig; 17.12.2019

вы могли бы сделать это для одной строки

$('select.your-select option').attr('selected', true).parent().trigger('change')
person Vladowski    schedule 22.07.2015
comment
Очень короткий вариант! - person insign; 26.12.2016
comment
Хотя изначально кажется, что это работает, плагин, похоже, не очень хорошо с ним работает и в конечном итоге не выберет вещи, которые были отменены вручную. - person Ecksters; 25.02.2017

$(document).ready(function() {
    $("#checkbox").click(function(){
      if($("#checkbox").is(':checked') ){ //select all
        $("#e1").find('option').prop("selected",true);
        $("#e1").trigger('change');
      } else { //deselect all
        $("#e1").find('option').prop("selected",false);
        $("#e1").trigger('change');
      }
  });
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<select multiple id="e1" style="width:300px">
        <option value="AL">Alabama</option>     //AJAX created
        <option value="Am">Amalapuram</option>  //AJAX created
        <option value="An">Anakapalli</option>  //AJAX created
        <option value="Ak">Akkayapalem</option> //AJAX created
        <option value="WY">Wyoming</option>     //AJAX created
    </select>
    <input type="checkbox" id="checkbox" >Select All

Если опции создаются после запроса AJAX, то эти опции не работают. Поэтому мы сопоставляем их с помощью find и выбираем/отменяем выбор после этого изменения триггера.

HTML

 <select multiple id="e1" style="width:300px">
        <option value="AL">Alabama</option>     //AJAX created
        <option value="Am">Amalapuram</option>  //AJAX created
        <option value="An">Anakapalli</option>  //AJAX created
        <option value="Ak">Akkayapalem</option> //AJAX created
        <option value="WY">Wyoming</option>     //AJAX created
    </select>
    <input type="checkbox" id="checkbox" >Select All

JS

$(document).ready(function() {
    $("#checkbox").click(function(){
      if($("#checkbox").is(':checked') ){ //select all
        $("#e1").find('option').prop("selected",true);
        $("#e1").trigger('change');
      } else { //deselect all
        $("#e1").find('option').prop("selected",false);
        $("#e1").trigger('change');
      }
  });
});

просто используйте найти.

person Riiwo    schedule 13.05.2016

$(document).ready(function() {
    $("#my-select").select2();
});

function selectAll() {
    $("#my-select > option").prop("selected", true);
    $("#my-select").trigger("change");
}

function deselectAll() {
    $("#my-select > option").prop("selected", false);
    $("#my-select").trigger("change");
}
.button-container {
  margin-bottom: 10px;
}

#my-select {
  width: 200px;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/select2.min.js"></script>
<link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/select2.min.css" rel="stylesheet"/>

<div class="button-container">
  <button type="button" onclick="selectAll()">Select All</button>
  <button type="button" onclick="deselectAll()">Deselect All</button>
</div>
<select id="my-select" multiple>
  <option value="apple">Apple</option>
  <option value="banana">Banana</option>
  <option value="grape">Grape</option>
  <option value="pineapple">Pineapple</option>
</select>

Это самый простой способ

function selectAll() {
  $("#my-select > option").prop("selected", true);
  $("#my-select").trigger("change"); 
}
person zeinFikry    schedule 02.10.2020

@Garath: я изменил ваш опубликованный код, чтобы он работал с результатами, загружаемыми через ajax. Спасибо, что подняли это здесь.

    $(document).on("keypress",".select2-input",function(event){
    if (event.ctrlKey || event.metaKey) {
        var id =$(this).parents("div[class*='select2-container']").attr("id").replace("s2id_","");
        var element =$("#"+id);
        if (event.which == 97){
            var selected = [];
            $('.select2-drop-active').find("ul.select2-results li").each(function(i,e){
                selected.push($(e).data("select2-data"));
            });
            element.select2("data", selected);
        } else if (event.which == 100){
            element.select2("data", []);
        }
    }
});
person sieppl    schedule 11.02.2014
comment
@ Джим, есть ли возможность выбрать все щелчком мыши? - person shorif2000; 04.03.2016

Информация: значения gSiteID — это значения, используемые при первоначальном динамическом создании параметров выбора. #selAllSites — это идентификатор флажка, а #siteID — это идентификатор списка выбора, которым вы хотите управлять.

var gSiteIDs = "8475, 9082, 2387, 1234";

function selectAllSites() 
{
    if($("#selAllSites").is(":Checked")) {
        $("#siteID").select2("val", [gSiteIDs]);                                
    } else {
        $("#siteID").select2("val", []);                                
    }
}           
person Jeff    schedule 10.10.2014
comment
Это лучший ответ, который я нашел для этого, другие ответы ставят вас в состояние, которое может стать действительно глючным. - person Ecksters; 25.02.2017

Это прекрасно работает с AJAX, предотвращает открытие окна закладок в FF (Ctrl-D) и отлично работает, когда для параметра closeOnSelect установлено значение off.

$(document).on("keypress",".select2-input",function(event){
    if (event.ctrlKey || event.metaKey) {
        var id =$(this).parents("div[class*='select2-container']").attr("id").replace("s2id_","");
        var element =$("#"+id);

        if (event.which == 97){
            var selected = [];
            $('.select2-drop-active').find("ul.select2-results li").each(function(i,e){
                selected.push($(e).data("select2-data"));
            });
            element.select2("data", selected);
            element.select2("focus");
            event.preventDefault();
        } else if (event.which == 100){
            element.select2("data", []);
            event.preventDefault();
        }
    }
});
person Maciej Niemir    schedule 30.01.2015

$.fn.select2.amd.require([
    'select2/utils',
    'select2/dropdown',
    'select2/dropdown/attachBody'
], function (Utils, Dropdown, AttachBody) {
    function SelectAll() { }

    SelectAll.prototype.render = function (decorated) {
        var $rendered = decorated.call(this);
        var self = this;

        var $selectAll = $(
            '<button type="button" style="width: 100%; height: 3rem; text-align: left; color: blue; background: none; border: none; box-shadow: none">Select All</button>'
        );

        $rendered.find('.select2-dropdown').prepend($selectAll);

        $selectAll.on('click', function (e) {
            var $results = $rendered.find('.select2-results__option[aria-selected=false]');

            // Get all results that aren't selected
            $results.each(function () {
                var $result = $(this);

                // Get the data object for it
                var data = $result.data('data');

                // Trigger the select event
                self.trigger('select', {
                    data: data
                });
            });

            self.trigger('close');
        });

        return $rendered;
    };

    $("#select-id").select2({
        placeholder: "Select weekdays...",
        allowClear: true,
        dropdownAdapter: Utils.Decorate(
            Utils.Decorate(
                Dropdown,
                AttachBody
            ),
            SelectAll
        )
    });
});

Исходный код: http://jsbin.com/seqonozasu/1/edit?html,js,output

person Văn Quyết    schedule 26.03.2018
comment
Если вы вручную выберете 2 элемента в списке, а затем «Выбрать все», будут выбраны все, кроме 2 элементов, которые вы изначально выбрали. - person Kelly Elton; 15.01.2019

просто посмотрите на этот jsFiddle, который я создал, уверен, что это ответ на все, что вы искали

Выбрать2 Несколько раскрывающихся меню с выбором всех свойств

$(".checkbox").click(function(){
    if($(".checkbox").is(':checked') ){
        $(this).parent().find('option').prop("selected","selected");
        $(this).parent().find('option').trigger("change");
        $(this).parent().find('option').click();
        
    }else{
       $(this).parent().find('option').removeAttr("selected","selected");
       $(this).parent().find('option').trigger("change");
     }
});

$("#button").click(function(){
       alert($("select").val());
});

$(document).ready(function() {
    		  $('.select2').select2({
    			    closeOnSelect: false,
    			    allowClear:false
    		  });
    	  	});
<div>
<select multiple size=2 class="select2">
  <option value="volvo">Volvo</option>
  <option value="saab">Saab</option>
  <option value="opel">Opel</option>
  <option value="audi">Audi</option>
</select> <input type="checkbox" class="checkbox" >Select All
</div>

<div>
<select multiple size=2 class="select2">
  <option value="volvo">Volvo</option>
  <option value="saab">Saab</option>
  <option value="opel">Opel</option>
  <option value="audi">Audi</option>
</select> <input type="checkbox" class="checkbox" >Select All
</div>

person codelover    schedule 24.12.2018

Пользовательская реализация Select all в select2 DEMO

function RunSelect2(){
  $('#select-id').select2({
     allowClear: true,
     closeOnSelect: false,
  }).on('select2:open', function() {  

    setTimeout(function() {
        $(".select2-results__option .select2-results__group").bind( "click", selectAlllickHandler ); 
    }, 0);

  });
}

RunSelect2();


var selectAlllickHandler = function() {
	$(".select2-results__option .select2-results__group").unbind( "click", selectAlllickHandler );        
  $('#select-id').select2('destroy').find('option').prop('selected', 'selected').end();
  RunSelect2();
};
.select2-results__group
{
  cursor:pointer !important;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.5/js/select2.min.js"></script>
<link href="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.5/css/select2.min.css" rel="stylesheet"/>

<select multiple id='select-id' style="width:300px">
    <optgroup label="select all">
      <option value='1'>1 one</option>
      <option value='2'>2 two</option>
      <option value='3'>3 three</option>
      <option value='4'>4 four</option>
      <option value='5'>5 five</option>
      <option value='6'>6 six</option>
    </optgroup>
</select>

person yikekas    schedule 04.07.2019

Если вам нужен флажок для этого действия, просто сделайте это.

<select id="myselect" multiple="multiple">
  <option value="level1">Level 1</option>
  <option value="level2">Level 2</option>
  <option value="level3">Level 3</option>
  <option value="level4">Level 4</option>
</select>

<br/>
Select/Deselect <input type="checkbox" id="selectall"/>

Jquery-функция:

$("#selectall").on('click',function(){
    var checked = $("#selectall").prop("checked");
  if(checked==true){
    $("#myselect > option").prop("selected",true);
  }else{
    $("#myselect > option").prop("selected",false);
  }
});
person Vaibhav Tomar    schedule 13.10.2019

Обновление 2019

Чтобы программно выбрать параметр/элемент для элемента управления Select2, используйте метод jQuery .val().

Вы также можете передать массив val сделать множественный выбор:

$('#mySelect2').val(['1', '2']);
$('#mySelect2').trigger('change');

https://select2.org/programmatic-control/add-select-clear-items#selecting-options

person Zat42    schedule 10.12.2019

Сдача

$result.data('data');

to

Utils.GetData($result.get(0),'data')
person Vidmantas Norkus    schedule 16.12.2019
comment
Хотя этот код может ответить на вопрос, предоставление дополнительного контекста относительно почему и/или как этот код отвечает на вопрос, повышает его ценность в долгосрочной перспективе. - person Tân; 17.12.2019

Эта строка кода выберет все параметры

$('select.select-all-class-name').attr('selected', true).parent().trigger('change');

Добавьте избранные события для работы во всех сценариях. Приведенная выше строка не работает в сценарии, когда вы выбираете и отменяете выбор параметра, а затем нажимаете selectAll. Последний невыбранный вариант не будет выбран. Чтобы исправить это, добавьте следующую строку кода.

//Select options selected true for the selected option
$('#mySelect2').on('select2:selecting', function (e) {
    $('select#mySelect2ID > option[value="'+e.params.args.data.id+'"]').attr('selected', true);
});

//DeSelect options selected to false for the option deselected
$('#mySelect2').on('select2:unselecting', function (e) {
    $('select#mySelect2ID > option[value="'+e.params.args.data.id+'"]').attr('selected', false);
});
person Mohan Prasad    schedule 20.05.2020

Пожалуйста, смотрите код ниже.

$('.select2').select2({
    formatResult:function(object, container, query){
        if(object.id=='all' || object.id=='clear')
            return '<span style="color:#31708F;font-size:10px;"><i class="fa fa-chevron-right"></i> '+object.text+'</span>';

        return object.text;
    }
});
$('.select2').on("change", function(e) {
    if($.inArray('all', e.val)===0){
        var selected = [];
        $(this).find("option").each(function(i,e){
            if($(e).attr("value")=='all' || $(e).attr("value")=='clear')
                return true;

            selected[selected.length]=$(e).attr("value");
        });
        $(this).select2('val',selected);
    }else if($.inArray('clear', e.val)===0){
        $(this).select2('val','');
    }
});

Ссылка из: https://github.com/select2/select2/issues/195#issuecomment-52163095

person Jaydp    schedule 12.08.2020