HTML选择表单,带有输入自定义值的选项


104

我希望有一个输入字段,用户可以输入自定义文本值或从下拉菜单中选择。普通<select>只提供下拉选项。

我如何才能<select>接受自定义值?例如:福特?

<select>
  <option value="volvo">Volvo</option>
  <option value="saab">Saab</option>
  <option value="mercedes">Mercedes</option>
  <option value="audi">Audi</option>
</select>

您可以使用javascript动态地将一个选项添加到选择中,但是使用此信息将成为真正的难题。
大卫,

我没有在我的网站finnmglas.com/contact上为自定义值添加该选项,但是有人通过自定义值与我联系。太奇怪了
Finnmglas

Answers:


248

HTML5具有内置的组合框。您创建一个文本input和一个datalist。然后,您向中添加一个list属性input,其值为iddatalist

更新:自2019年3月起,所有主要浏览器(现在包括Safari 12.1和iOS Safari 12.3)都支持datalist此功能所需的级别。有关详细的浏览器支持,请参见caniuse

看起来像这样:

<input type="text" list="cars" />
<datalist id="cars">
  <option>Volvo</option>
  <option>Saab</option>
  <option>Mercedes</option>
  <option>Audi</option>
</datalist>


3
只有大约50%的浏览器支持此功能。仅最新的Firefox,Chrome和Opera支持此功能。IE,Safari和移动浏览器没有。参见http://caniuse.com/
markmarijnissen 2014年

2
到2016年已经过去了一半(超过2年),而且大多数浏览器仍不完全支持此功能,至少没有重大错误。在Safari / Safari iOS之外的几乎所有版本的最新版本中,至少都可以使用某些功能,但是您必须进行测试以确保用例能够正常运行。仍然是最好的答案。
Michael Gaskill

1
它对我很好。在许多情况下,我们不需要支持旧的浏览器。我只在输入字段的背景上添加了“向下箭头”图像,以向用户提示它是可扩展的。代码(您需要一个实际的图像文件):<input type="text" list="cars" style="background:url('images/arrow_down.png') no-repeat right center">
Eugene Kardash '16

4
我刚刚在IE,Firefox和Chrome的最新版本中进行了测试,并且一切正常。我认为在许多情况下,这是解决此常见问题的简便方法。
凯尔

3
我真的很想使用它,但是我需要设置一个默认值。用户仅在下拉菜单中看到默认选项,而在所有选项中则看到默认选项(因为它们被过滤掉了)。在查看所有选项之前,他们将需要知道清除输入字段。
贾斯汀

25

Alen Saqe的最新JSFiddle在Firefox上没有为我切换,因此我想我将提供一个简单的html / javascript解决方法,该方法在表单(关于提交)中可以很好地起作用,直到datalist标记被所有浏览器/设备接受为止。有关更多详细信息并查看其实际效果,请访问:http : //jsfiddle.net/6nq7w/4/ 注意:在切换的同级之间不允许有任何空格!

<!DOCTYPE html>
<html>
<script>
function toggleField(hideObj,showObj){
  hideObj.disabled=true;        
  hideObj.style.display='none';
  showObj.disabled=false;   
  showObj.style.display='inline';
  showObj.focus();
}
</script>
<body>
<form name="BrowserSurvey" action="#">
Browser: <select name="browser" 
          onchange="if(this.options[this.selectedIndex].value=='customOption'){
              toggleField(this,this.nextSibling);
              this.selectedIndex='0';
          }">
            <option></option>
            <option value="customOption">[type a custom value]</option>
            <option>Chrome</option>
            <option>Firefox</option>
            <option>Internet Explorer</option>
            <option>Opera</option>
            <option>Safari</option>
        </select><input name="browser" style="display:none;" disabled="disabled" 
            onblur="if(this.value==''){toggleField(this,this.previousSibling);}">
<input type="submit" value="Submit">
</form>
</body>
</html>


我想再次经历那个麻烦!那里不支持Witch版本的Firefox!我用我不记得的某个版本测试了它!荣誉!
Alen Saqe 2014年

我不知道我使用的是FF版本。我刚刚看过FF34.0,现在正在获得功能,所以不用担心。但是,可以清除默认的切换选项“其他”。当我通过编辑值删除“其他”时,下拉菜单没有提供直观的值来选择(访问编辑功能)。我认为这取决于个人喜好。因为当字段可编辑时,下拉菜单箭头仍然存在,所以用户可能无法意识到该字段是可编辑的。对你没兴趣;只是一些反馈。我的代码段还考虑了<form>内部的字段命名。
mickmackusa 2014年

对于我来说,这种巧妙但难以理解的脚本+ html的最终结果是将所选的选项值或输入的文本作为查询字符串附加到同一页面的GET上。有谁知道如何将动作转换为POST,这样我就可以在php文件中获取值并在那里进行处理?

我编写此脚本的主要目的是使其符合html表单提交的行为。您是否将post方法用作form标记中的属性?@Han如果您为孤立的代码段创建了3v4l.org链接,我可以快速浏览一下,并可能提出建议。
mickmackusa

1
男孩,我觉得很蠢。我忘了在form标签中放一个方法。它的工作原理是对它进行了非常小的修改:<form name =“ BrowserSurvey” method =“ post” action =“ / gotThis.php”> ...漂亮的脚本mickmackusa。感谢您的跟进提示!

13

jQuery解决方案!

演示:http : //jsfiddle.net/69wP6/2/

下面的另一个演示(已更新!)

当我有一些固定的选项并且我希望另一个选项可编辑时,我需要类似的东西!在这种情况下,我做了一个隐藏的输入,该输入将与select选项重叠,并且是可编辑的,并使用jQuery使其无缝运行。

我正在与大家分享小提琴!

的HTML

<div id="billdesc">
    <select id="test">
      <option class="non" value="option1">Option1</option>
      <option class="non" value="option2">Option2</option>
      <option class="editable" value="other">Other</option>
    </select>
    <input class="editOption" style="display:none;"></input>
</div>

的CSS

body{
    background: blue;
}
#billdesc{
    padding-top: 50px;
}
#test{
    width: 100%;
    height: 30px;
}
option {
    height: 30px;
    line-height: 30px;
}

.editOption{
    width: 90%;
    height: 24px;
    position: relative;
    top: -30px

}

jQuery的

var initialText = $('.editable').val();
$('.editOption').val(initialText);

$('#test').change(function(){
var selected = $('option:selected', this).attr('class');
var optionText = $('.editable').text();

if(selected == "editable"){
  $('.editOption').show();


  $('.editOption').keyup(function(){
      var editText = $('.editOption').val();
      $('.editable').val(editText);
      $('.editable').html(editText);
  });

}else{
  $('.editOption').hide();
}
});

编辑:明智地添加了一些简单的设计,使人们可以清楚地看到输入的结尾!

JS小提琴:http : //jsfiddle.net/69wP6/4/


11

你真的不能。您必须同时具有下拉菜单和文本框,并让他们选择或填写表单。没有javascript,您可以创建一个单独的单选按钮集,以便他们在其中选择下拉菜单或文本输入,但这对我来说似乎很混乱。使用某些javascript,您可以根据自己选择的哪个来切换禁用一个或另一个,例如,在下拉菜单中有一个“ other”选项来触发文本字段。


9

如果数据列表选项不能满足您的要求,请查看Select2库和“动态选项创建

$(".js-example-tags").select2({
  tags: true
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<link href="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.6-rc.0/css/select2.min.css" rel="stylesheet"/>
<script src="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.6-rc.0/js/select2.min.js"></script>


<select class="form-control js-example-tags">
  <option selected="selected">orange</option>
  <option>white</option>
  <option>purple</option>
</select>


0

使用上述解决方案之一(@mickmackusa),我使用Hooks在React 16.8+中制作了一个工作原型。

https://codesandbox.io/s/heuristic-dewdney-0h2y2

希望对您有所帮助。


我很荣幸。我刚刚检查了一下记录,这是我在Stack Overflow上发表的第12篇帖子-感觉就像一百万年前。
mickmackusa

我只是在玩弄您的演示链接,看来您已经失去了在两种类型的字段之间无限切换的影响。
mickmackusa
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.