每次我得到一个要求下拉菜单的规范时,我都会抱怨“其他(在下面指定)”选项,因为它们很难实现。
- 将此信息存储在数据库中的最佳方式是什么?使用两个字段是否更好,一个是不同表中值的整数外键(包括“其他”),第二个字符串字段用于存储“其他”值(如果选择)?或者只是将所选选项存储为字符串(这也使得从数据库中取回值更容易)。
- 界面方面,如果选择“其他”(可能通过一些 jQuery 黑客),你是使用常规的旧的
<select>
并弹出一个隐藏的<input type="text"/>
,还是使用某种组合框小部件?这个小部件的“过滤”版本是我发现的对用户最友好的一个,但实现看起来不太好(2000 行,并且有错误)。
例如,假设我有一个名为vehicles
. 它列出了在我的网站上注册的所有车辆。它包含诸如年份、品牌、型号、里程之类的内容。
假设我有另一张桌子,其中包含所有供用户选择的品牌:本田、丰田、宝马等。
但是我的“品牌”表可能不是最新的,所以如果没有列出,我想允许用户输入他们自己的。在这种情况下,他们会从下拉列表中选择“其他品牌”,然后手动输入品牌。
您将如何在vehicles
表格中表示这一点?
一个。作为一个字段,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">
-- modify for other layouts 中。