Разрешить новые значения с помощью select.js multiple select
Я использую plugin http://harvesthq.github.com/chosen/ с помощью jQuery, чтобы разрешить пользователю выбирать несколько вариантов из выбранного. Однако теперь я хочу, чтобы они позволяли им создавать ценности, которые еще не присутствуют - любая идея, как это сделать?
EDIT: что-то похожее на собственную панель выбора/создания тега SO будет близко к тому, что я после
Предпочтительно, не изменяя или не редактируя плагин, но выполняйте, если это необходимо.
Код:
HTML:
<p>Select something</p>
<select name="theSelect[]" multiple="multiple">
<option value="First Option">First Option</option>
<option value="Second Option">Second Option</option>
</select>
JavaScript:
$(function(){
$('select').chosen();
});
Итак, если пользователь должен был ввести "Третий вариант", я бы хотел добавить это в список и выбрать его. Значение и отображаемое имя будут/будут одинаковыми, чтобы не беспокоить
Ответы
Ответ 1
В соответствии с документацией вы можете попробовать сделать что-то вроде этого:
$('select').append('<option>test</option>');
$('select').trigger('liszt:updated');
Как сказал Тони в комментариях ниже:
"Начиная с версии 1.0, которую теперь выбран" триггер: обновлен ". См. harvesthq.github.io/chosen/#change-update-events"
Ответ 2
Я наткнулся на это, ища те же идеи.
Похоже, что это довольно популярный запрос функции, и несколько вилок внедрили его. Похоже, он скоро будет объединен в мастер-ветку.
+1 для этого конкретного притяжения, в котором работал шарм:
https://github.com/harvesthq/chosen/pull/166
Здесь вы можете просмотреть вилку Koenpunt: https://github.com/koenpunt/chosen
Ответ 3
Я просто пытался решить ту же проблему. Я немного изменил исходный код. Здесь новая функция keyup_checker. Взгляните на случай 13:
AbstractChosen.prototype.keyup_checker = function(evt) {
var stroke, _ref;
stroke = (_ref = evt.which) != null ? _ref : evt.keyCode;
this.search_field_scale();
switch (stroke) {
case 8:
if (this.is_multiple && this.backstroke_length < 1 && this.choices > 0) {
return this.keydown_backstroke();
} else if (!this.pending_backstroke) {
this.result_clear_highlight();
return this.results_search();
}
break;
case 13:
evt.preventDefault();
if (this.results_showing) {
if (!this.is_multiple || this.result_highlight) {
return this.result_select(evt);
}
$(this.form_field).append('<option>' + $(evt.target).val() + '</option>');
$(this.form_field).trigger('liszt:updated');
this.result_highlight = this.search_results.find('li.active-result').last();
return this.result_select(evt);
}
break;
case 27:
if (this.results_showing) this.results_hide();
return true;
case 9:
case 38:
case 40:
case 16:
case 91:
case 17:
break;
default:
return this.results_search();
}
};
Ответ 4
Вот простой способ, которым я это сделал:
$(".search-field").find("input").live( "keydown", function (evt) {
var stroke;
stroke = (_ref = evt.which) != null ? _ref : evt.keyCode;
if (stroke == 9) { // 9 = tab key
$('#tags').append('<option value="' + $(this).val() + '" selected="selected">' + $(this).val() + '</option>');
$('#tags').trigger('chosen:updated');
}
});
Ответ 5
Я знаю, что это не ответ, а альтернативное решение.
Я искал добавленную часть "на лету" и обнаружил, что http://ivaynberg.github.com/select2/#tags предоставляет то же самое, что выбрали + другие вещи, например "Пометка".
Ответ 6
Вы можете просто прикрепить событие к текстовому полю ввода, чтобы прослушать определенный код символа. После этого добавьте опцию и активируйте обновление в раскрывающемся списке.
var dropDown = $('select.chosen');
dropDown.parent().find('.chzn-container .chzn-search input[type=text]').keydown( function (evt) {
var stroke, _ref, target, list;
// get keycode
stroke = (_ref = evt.which) != null ? _ref : evt.keyCode;
target = $(evt.target);
// get the list of current options
list = target.parents('.chzn-container').find('.chzn-choices li.search-choice > span').map(function () { return $(this).text(); }).get();
if (stroke === 9 || stroke === 13) {
var value = $.trim(target.val());
// if the option does not exists
if ($.inArray(value,list) < 0) {
var option = $('<option>');
option.text(value).val(value).appendTo(dropDown);
option.attr('selected','selected');
// add the option and set as selected
}
// trigger the update event
dropDown.trigger("liszt:updated");
return true;
}
});
Ответ 7
Обновление для ответа leogdion, которое работает с более поздними версиями:
var dropDown = $('#select_chosen');
// Make the chosen drop-down dynamic. If a given option is not in the list, the user can still add it
dropDown.parent().find('.chosen-container .search-field input[type=text]').keydown(
function (evt) {
var stroke, _ref, target, list;
// get keycode
stroke = (_ref = evt.which) != null ? _ref : evt.keyCode;
// If enter or tab key
if (stroke === 9 || stroke === 13) {
target = $(evt.target);
// get the list of current options
chosenList = target.parents('.chosen-container').find('.chosen-choices li.search-choice > span').map(function () { return $(this).text(); }).get();
// get the list of matches from the existing drop-down
matchList = target.parents('.chosen-container').find('.chosen-results li').map(function () { return $(this).text(); }).get();
// highlighted option
highlightedList = target.parents('.chosen-container').find('.chosen-results li.highlighted').map(function () { return $(this).text(); }).get();
// Get the value which the user has typed in
var newString = $.trim(target.val());
// if the option does not exists, and the text doesn't exactly match an existing option, and there is not an option highlighted in the list
if ($.inArray(newString,matchList) < 0 && $.inArray(newString,chosenList) < 0 && highlightedList.length == 0) {
// Create a new option and add it to the list (but don't make it selected)
var newOption = '<option value="' + newString + '">' + newString + '</option>';
$("#select").prepend(newOption);
// trigger the update event
$("#select").trigger("chosen:updated");
// tell chosen to close the list box
$("#select").trigger("chosen:close");
return true;
}
// otherwise, just let the event bubble up
return true;
}
}
)
Ответ 8
Я обновил код от 3nochroot еще раз. Теперь у меня есть только один селектор, чтобы найти вход мультиселектора.
$(document).ready(function() {
$(".js-choicelist").chosen({
//config comes here
}).parent().find('.chosen-container .search-field input[type=text]').keydown(
function (evt) {
var stroke, _ref, target, list;
// get keycode
stroke = (_ref = evt.which) != null ? _ref : evt.keyCode;
// If enter or tab key
if (stroke === 9 || stroke === 13) {
target = $(evt.target);
// get the list of current options
chosenList = target.parents('.chosen-container').find('.chosen-choices li.search-choice > span').map(function () { return $(this).text(); }).get();
// get the list of matches from the existing drop-down
matchList = target.parents('.chosen-container').find('.chosen-results li').map(function () { return $(this).text(); }).get();
// highlighted option
highlightedList = target.parents('.chosen-container').find('.chosen-results li.highlighted').map(function () { return $(this).text(); }).get();
// Get the value which the user has typed in
var newString = $.trim(target.val());
// if the option does not exists, and the text doesn't exactly match an existing option, and there is not an option highlighted in the list
if ($.inArray(newString,matchList) < 0 && $.inArray(newString,chosenList) < 0 && highlightedList.length == 0) {
// Create a new option and add it to the list (but don't make it selected)
var newOption = '<option value="' + newString + '">' + newString + '</option>';
var choiceSelect = target.parents('.select-multiple').find('select');
choiceSelect.prepend(newOption);
// trigger the update event
choiceSelect.trigger("chosen:updated");
// tell chosen to close the list box
choiceSelect.trigger("chosen:close");
return true;
}
// otherwise, just let the event bubble up
return true;
}
}
)
})