«выбрать все» и «удалить все» с помощью selected.js

Для плагина меню выбора chosen.js существует ли установленный способ добавить "выбрать все элементы в списке" или функция «удалить все элементы в списке» для множественного ввода? В основной ветке или, может быть, в одном из ответвлений? Или кто-то делал это раньше, есть какие-то советы?


person Petrov    schedule 23.06.2012    source источник


Ответы (7)


Это должно быть довольно прямолинейно, просто сначала сделайте это «нормальным» способом:

$('.my-select-all').click(function(){
    $('#my_select option').prop('selected', true); // Selects all options
});

Затем вызовите событие liszt:updated для обновления выбранного виджета, чтобы все это выглядело примерно так:


Обновление. Для тех, кто не прокручивает вниз и не проверяет другие ответы, событие называется chosen:updated в версии, выпущенной в августе 2013 года. В случае сомнений обратитесь к документации.


<select multiple>
  <option value="1">1</option>
  <option value="2">2</option>
  <option value="3">3</option>
</select>
<button class="select">Select all</button>
<button class="deselect">Deselect all</button>
$('select').chosen();
$('.select').click(function(){
    $('option').prop('selected', true);
    $('select').trigger('liszt:updated');
});
$('.deselect').click(function(){
    $('option').prop('selected', false);
    $('select').trigger('liszt:updated');
});​

Рабочая демонстрация (код js внизу): http://jsfiddle.net/C7LnL/1/

Более сжатая версия: http://jsfiddle.net/C7LnL/2/.

Еще более сжатая версия: http://jsfiddle.net/C7LnL/3/

person Wesley Murch    schedule 23.06.2012
comment
молодец @wesley - я подумал, что это будет что-то в этом роде. отличная помощь! - person Petrov; 24.06.2012
comment
trigger('liszt:updated') это ключ, даже если вы перестанете использовать выбранный код, он все равно будет работать. - person Wesley Murch; 24.06.2012
comment
при отмене выбора всех выбранных элементов у меня возникла проблема с обновлением элементов отображения div, я решаю это с помощью этого: $('div#mySelect_chzn ul.chzn-choices li.search-choice').remove(); - person Salem; 27.08.2013
comment
Не забывайте о e.preventDefault(); в противном случае вы получите эффект мигания выбора и отмены выбора - person Bartek S; 30.10.2013
comment
Название события больше не «list:updated», см. ответ Джека ниже. - person Paulo Scardine; 04.11.2013
comment
вместо $('select').trigger('list:updated'); $('выбрать').trigger('выбрано: обновлено'); работал на меня. - person Milan Maharjan; 26.11.2015

Попробуйте этот код, он будет работать 100%

// Deselect All
$('#my_select_box option:selected').removeAttr('selected');
$('#my_select_box').trigger('chosen:updated');

// Select All
$('#my_select_box option').prop('selected', true);  
$('#my_select_box').trigger('chosen:updated');
person Shivam Srivastava    schedule 14.01.2016

Я пропустил подобную функцию. Это добавляет две ссылки All и None (тексты настраиваются с помощью параметров uncheck_all_text и select_all_text) в верхней части всплывающего списка. Возможно, вам придется отредактировать это, если вы используете группировку.

$("select").on("chosen:showing_dropdown", function(evnt, params) {
    var chosen = params.chosen,
        $dropdown = $(chosen.dropdown),
        $field = $(chosen.form_field);
    if( !chosen.__customButtonsInitilized ) {
        chosen.__customButtonsInitilized = true;
        var contained = function( el ) {
            var container = document.createElement("div");
            container.appendChild(el);
            return container;
        }
        var width = $dropdown.width();
        var opts = chosen.options || {},
            showBtnsTresshold = opts.disable_select_all_none_buttons_tresshold || 0;
            optionsCount = $field.children().length,
            selectAllText = opts.select_all_text || 'All',
            selectNoneText = opts.uncheck_all_text || 'None';
        if( chosen.is_multiple && optionsCount >= showBtnsTresshold ) {
            var selectAllEl = document.createElement("a"),
                selectAllElContainer = contained(selectAllEl),
                selectNoneEl = document.createElement("a"),
                selectNoneElContainer = contained(selectNoneEl);
            selectAllEl.appendChild( document.createTextNode( selectAllText ) );
            selectNoneEl.appendChild( document.createTextNode( selectNoneText ) );
            $dropdown.prepend("<div class='ui-chosen-spcialbuttons-foot' style='clear:both;border-bottom: 1px solid black;'></div>");
            $dropdown.prepend(selectNoneElContainer);
            $dropdown.prepend(selectAllElContainer);
            var $selectAllEl = $(selectAllEl),
                $selectAllElContainer = $(selectAllElContainer),
                $selectNoneEl = $(selectNoneEl),
                $selectNoneElContainer = $(selectNoneElContainer);
            var reservedSpacePerComp = (width - 25) / 2;
            $selectNoneElContainer.addClass("ui-chosen-selectNoneBtnContainer")
                .css("float", "right").css("padding", "5px 8px 5px 0px")
                .css("max-width", reservedSpacePerComp+"px")
                .css("max-height", "15px").css("overflow", "hidden");
            $selectAllElContainer.addClass("ui-chosen-selectAllBtnContainer")
                .css("float", "left").css("padding", "5px 5px 5px 7px")
                .css("max-width", reservedSpacePerComp+"px")
                .css("max-height", "15px").css("overflow", "hidden");
            $selectAllEl.on("click", function(e) {
                e.preventDefault();
                $field.children().prop('selected', true);
                $field.trigger('chosen:updated');
                return false;
            });
            $selectNoneEl.on("click", function(e) {
                e.preventDefault();
                $field.children().prop('selected', false);
                $field.trigger('chosen:updated');
                return false;
            });
        }
    }
});

Я также использую CSS, чтобы ограничить высоту выбранных вариантов, если их, скажем, десятки:

    .chosen-choices {
        max-height: 150px;
    }
person Tommi Ratamaa    schedule 13.09.2013
comment
Это кажется лучшим вариантом, потому что он адаптируется к выбору. Мне очень понравился результат. - person alex; 18.06.2014

Просто прямой способ очистки выбора:

$('select').val('');
$('select').val('').trigger("chosen:updated"); 
person Dariush Jafari    schedule 19.06.2016
comment
Закройте, но вам нужно обновить элемент управления. $('выбрать').val('').триггер(выбрано:обновлено); - person AntonK; 27.06.2016

Я понимаю, что этот вопрос довольно старый, но я столкнулся с похожей проблемой и хотел поделиться своим результатом, так как мне нравится его простота:

Я создал две кнопки (все и ничего) и поместил их влево и вправо внутри div, содержащего раскрывающийся список выбора. Кнопки выглядят примерно так:

<button style="float:left;" class="btn" id="iAll">All</button>
<button style="float:right;" class="btn" id="iNone">None</button>

Затем я добавил Jquery для обработки действий кнопки:

$('#iAll').on('click', function(e){
  e.preventDefault();
  $('#iSelect option').prop('selected', true).trigger('chosen:updated');
});

$('#iNone').on('click', function(e){
  e.preventDefault();
  $("#iSelect option:selected").removeAttr("selected").trigger('chosen:updated');
});

Вероятно, потребуется некоторая очистка в отношении макета, но он вполне функционален, и я решил поделиться.

person DLux    schedule 28.02.2018

$("#ctrlName option:selected").removeAttr("selected").trigger('liszt:updated'); 

очистить все

$("#ctrlName option").attr("selected","selected").trigger('liszt:updated'); 

выбрать все

person Ümit ÇELİK    schedule 25.02.2015

Вы должны попробовать это:

$('#drpdwn').empty();
$('#drpdwn').trigger('chosen:updated');
person anujgupta017    schedule 09.05.2014
comment
Это удалит все элементы из раскрывающегося списка и предотвратит их выбор в дальнейшем. - person Michael; 20.09.2014