【问题标题】:HTML select form with option to enter custom value带有输入自定义值选项的 HTML 选择表单
【发布时间】:2011-08-04 18:15:39
【问题描述】:

我想要一个输入字段,用户可以输入自定义文本值或从下拉列表中选择。普通的<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 上为自定义值添加该选项,但是有人用自定义值联系了我。太奇怪了

标签: html forms


【解决方案1】:

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

更新:截至 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>

【讨论】:

  • 只有大约 50% 的浏览器支持此功能。只有最新的 firefox、chrome 和 opera 支持这个; IE、Safari 和移动浏览器没有。见http://caniuse.com/
  • 2016 年已经过去了一半(2 年多之后),大多数浏览器仍然不完全支持这一点,至少没有明显的错误。至少,除了 Safari / Safari iOS 之外,几乎所有的最新版本都可以使用某些东西,但是您必须进行测试以确保您的用例正常工作。这仍然是最好的答案。
  • 它对我很有效。在许多情况下,我们不需要支持旧浏览器。我只在输入字段的背景上添加了“向下箭头”图像,以向用户提示它是可扩展的。代码(你需要一个实际的图像文件):&lt;input type="text" list="cars" style="background:url('images/arrow_down.png') no-repeat right center"&gt;
  • 我刚刚在最新版本的 IE、Firefox 和 Chrome 中进行了测试,一切正常。我认为这对于许多情况下的这个常见问题来说是一个非常简单的解决方案。
  • 我真的很想使用它,但我需要设置一个默认值。用户只能在下拉菜单中看到默认值与所有选项(因为它们被过滤掉了)。他们需要知道在看到所有选项之前清除输入字段。
【解决方案2】:

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>

【讨论】:

  • 我想再看一遍那个小提琴!那里不支持女巫版本的 Firefox!我用一些我不记得的版本对其进行了测试!赞一个!
  • 我不知道我使用的是哪个版本的 FF。我刚刚看了 FF34.0,现在我正在获得功能,所以不用担心。但是,可以清除默认切换选项“其他”。当我通过编辑值删除“其他”时,下拉菜单没有提供直观的值来选择(访问编辑功能)。我认为这归结为个人喜好。因为当字段可编辑时下拉菜单箭头仍然存在,所以用户可能没有意识到该字段是可编辑的。对你没有兴趣;只是一些反馈。我的 sn-p 还考虑了
    .
    内的字段命名
  • 这个巧妙但难以理解的(对我而言)脚本+html的最终结果是将选定的选项值或输入的文本附加到与查询字符串相同的页面的GET中。有谁知道如何将操作转换为 POST,以便我可以在 php 文件中获取值并在那里对其进行处理?
  • 我编写这个脚本的目的是让它按照 html 表单提交的行为。您是否使用 post 方法作为表单标签中的属性? @Han 如果你为你的孤立的 sn-p 创建一个 3v4l.org 链接,我可以快速查看并可能提供建议。
  • 男孩,我觉得自己很笨。我忘了在表单标签中放一个方法。它与发布的这个非常小的修改一样工作:
    ...美丽的脚本,mickmackusa。感谢您的后续提示!
【解决方案3】:

jQuery 解决方案!

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

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

当我有一些固定选项并且我希望另一个选项是可编辑的时,我需要类似的东西!在这种情况下,我做了一个隐藏的输入,它会与选择选项重叠,并且可以编辑并使用 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/

【讨论】:

    【解决方案4】:

    如果 datalist 选项不能满足您的要求,请查看 Select2 库和“Dynamic option creation

    $(".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>

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

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

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

        我希望它对某人有所帮助。

        【讨论】:

        • 我很荣幸。我刚刚检查了我的记录,这是我在 Stack Overflow 上发表的第 12 个帖子——感觉就像一百万年前。
        • 我刚刚玩了你的演示链接,看起来你已经失去了在两种类型的字段之间无限期切换的效果。
        猜你喜欢
        • 1970-01-01
        • 2018-08-27
        • 1970-01-01
        • 2020-07-28
        • 1970-01-01
        • 2018-02-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多