Для плагина меню выбора chosen.js существует ли установленный способ добавить "выбрать все элементы в списке" или функция «удалить все элементы в списке» для множественного ввода? В основной ветке или, может быть, в одном из ответвлений? Или кто-то делал это раньше, есть какие-то советы?
«выбрать все» и «удалить все» с помощью selected.js
Ответы (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/
trigger('liszt:updated')
это ключ, даже если вы перестанете использовать выбранный код, он все равно будет работать.
- person Wesley Murch; 24.06.2012
$('div#mySelect_chzn ul.chzn-choices li.search-choice').remove();
- person Salem; 27.08.2013
Попробуйте этот код, он будет работать 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');
Я пропустил подобную функцию. Это добавляет две ссылки 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;
}
Просто прямой способ очистки выбора:
$('select').val('');
$('select').val('').trigger("chosen:updated");
Я понимаю, что этот вопрос довольно старый, но я столкнулся с похожей проблемой и хотел поделиться своим результатом, так как мне нравится его простота:
Я создал две кнопки (все и ничего) и поместил их влево и вправо внутри 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');
});
Вероятно, потребуется некоторая очистка в отношении макета, но он вполне функционален, и я решил поделиться.
$("#ctrlName option:selected").removeAttr("selected").trigger('liszt:updated');
очистить все
$("#ctrlName option").attr("selected","selected").trigger('liszt:updated');
выбрать все
Вы должны попробовать это:
$('#drpdwn').empty();
$('#drpdwn').trigger('chosen:updated');