Каждый раз, когда я получаю спецификацию, требующую выпадающего списка с опцией «Другое (указать ниже)», я стонаю, потому что это такая боль для реализации.Выпадающие списки с опцией «other»
- Какое удобство хранения этой информации в базе данных? Лучше ли использовать два поля: один целочисленный внешний ключ для значения в другой таблице (в том числе «Другой») и второе строковое поле для хранения значения «Другое», если оно выбрано? Или просто сохраните выбранный параметр как строку независимо (это также облегчает извлечение значения из базы данных).
- Интерфейс по умолчанию, вы используете обычный старый
<select>
и всплываете скрытый<input type="text"/>
, если выбрано «Другое» (возможно, через хакерство jQuery) или использовать вид виджетов combox? «Фильтрация» версии this widget является наиболее удобной для пользователя, но реализация выглядит не очень хорошо (2000 строк, и у нее есть ошибки).
В качестве примера, скажем, у меня есть таблица под названием vehicles
. В нем перечислены все транспортные средства, зарегистрированные на моем сайте. Он содержит такие вещи, как год, марка, модель, пробег.
Скажем, у меня есть еще одна таблица, которая содержит все делает для пользователей, чтобы выбрать из: Honda, Toyota, BMW и т.д.
Но мой «делает» таблица может не быть в курсе, так что я хочу позволяют пользователям вводить свои собственные, если они не указаны. В этом случае они выберет «Other Make» из раскрывающегося списка, а затем введите команду make вручную.
Как вы представляете это в таблице ?
a. Как одно поле, make
, которое может быть varchar(255)
. то есть, если они выберут существующий код, он просто будет скопирован в это поле
b. В качестве двух полей: make_id
и make_other
. Первый удерживает ключ от таблицы makes
, а второй заполняется только в том случае, если они выбирают «другое».
Решение JQuery для показа/скрытия "Другой" текстовое поле:
$('select>option').filter(function() {
return !!$(this).data('other');
}).each(function() {
$(this).closest('div.row').next().toggle($(this).is(':selected'));
$(this).parent().on('change', function() {
if($(':selected',this).data('other')) {
$(this).closest('div.row').next().show().find('input').focus();
} else {
$(this).closest('div.row').next().hide().find('input').val('');
}
});
});
Просто добавьте data-other="1"
к "Другое (пожалуйста, укажите)" <option>
. Предполагает, что ваши входы выложены в <div class="row">
- изменить для других макетов.
Вопрос не в том, хранить ли его в БД, а о том, как * хранить его в БД. Вы используете одно или несколько полей для записи выбранного параметра? – mpen
@Mark Я обновил ответ – fujy
Ваше обновление не ясно. Я обновлю ошибку с более конкретным примером, чтобы вы знали, о чем я говорю. – mpen