当前位置: 首页 > 知识库问答 >
问题:

显示数据列表标签,但提交实际值

汝彭薄
2023-03-14

目前HTML5

但是,value属性的实现与

<input list="answers" name="answer">
<datalist id="answers">
  <option value="42">The answer</option>
</datalist>

不同的浏览器对此有不同的处理方式:

选择一个后,输入将填充值,而不是内部文本。我只希望用户在下拉列表和输入中看到文本(“答案”),但在提交时传递值42,就像select一样。

如何使所有浏览器的下拉列表显示


共有3个答案

有骏奇
2023-03-14

我意识到这可能有点晚了,但我偶然发现了这一点,并想知道如何处理具有多个相同值但不同键的情况(根据大熊的评论)。

所以我稍微修改了Stephan Muller的回答:

具有非唯一值的数据列表:

<input list="answers" name="answer" id="answerInput">
<datalist id="answers">
  <option value="42">The answer</option>
  <option value="43">The answer</option>
  <option value="44">Another Answer</option>
</datalist>
<input type="hidden" name="answer" id="answerInput-hidden">

当用户选择一个选项时,浏览器将替换输入。值使用数据列表选项的,而不是内部文本

然后,以下代码检查带有该值的选项,将其推入隐藏字段并替换输入。值内部文本

document.querySelector('#answerInput').addEventListener('input', function(e) {
    var input = e.target,   
        list = input.getAttribute('list'),
        options = document.querySelectorAll('#' + list + ' option[value="'+input.value+'"]'),
        hiddenInput = document.getElementById(input.getAttribute('id') + '-hidden');

    if (options.length > 0) {
      hiddenInput.value = input.value;
      input.value = options[0].innerText;
      }

});

因此,用户看到的是选项的innerText所说的任何内容,而不是选项中的唯一id。值在提交表单时可用。演示JSFIDLE

辛麻雀
2023-03-14

我使用的解决方案如下:

<input list="answers" id="answer">
<datalist id="answers">
  <option data-value="42" value="The answer">
</datalist>

然后使用JavaScript访问要发送到服务器的值,如下所示:

var shownVal = document.getElementById("answer").value;
var value2send = document.querySelector("#answers option[value='"+shownVal+"']").dataset.value;


希望能有帮助。

袁博
2023-03-14

请注意,datalistselect不同。它允许用户输入一个不在列表中的自定义值,如果不先定义它,就不可能为此类输入获取备用值。

处理用户输入的可能方法是按原样提交输入值、提交空白值或阻止提交。这个答案只处理前两个选项。

如果您想完全禁止用户输入,那么select可能是更好的选择。

要在下拉列表中仅显示选项的文本值,我们使用内部文本,并省略属性。我们要发送的实际值存储在自定义的数据值属性中:

要提交这个data-value,我们必须使用一个

<input list="suggestionList" id="answerInput">
<datalist id="suggestionList">
    <option data-value="42">The answer</option>
</datalist>
<input type="hidden" name="answer" id="answerInput-hidden">

这样,当原始输入中的文本发生变化时,我们可以使用javascript来检查文本是否也存在于datist中,并获取其data-value。该值插入隐藏输入并提交。

document.querySelector('input[list]').addEventListener('input', function(e) {
    var input = e.target,
        list = input.getAttribute('list'),
        options = document.querySelectorAll('#' + list + ' option'),
        hiddenInput = document.getElementById(input.getAttribute('id') + '-hidden'),
        inputValue = input.value;

    hiddenInput.value = inputValue;

    for(var i = 0; i < options.length; i++) {
        var option = options[i];

        if(option.innerText === inputValue) {
            hiddenInput.value = option.getAttribute('data-value');
            break;
        }
    }
});

需要常规和隐藏输入上的id回答回答-隐藏,脚本才能知道哪个输入属于哪个隐藏版本。这样就可以在同一个页面上有多个输入,一个或多个数据管理器提供建议。

任何用户输入都按原样提交。要在数据列表中不存在用户输入时提交空值,请更改hiddenInput。值=输入值tohiddenInput。value=”“

jsFiddle示例:普通javascript和jQuery

 类似资料:
  • 问题内容: 当前,大多数主流浏览器(Safari除外)都支持HTML5 元素,这似乎是一种向输入添加建议的有趣方式。 但是,value属性的实现与上的内部文本之间似乎存在一些差异。例如: 选择一个后,输入将填充值而不是内部文本。我只希望用户在下拉列表和输入中看到文本(“答案”),但42像那样select将值传递给Submit。 如何使所有浏览器的下拉列表显示 的标签(内部文本),但在 提交valu

  • 我有这个对象显示在一个组合框中: 我想把这个列表显示到一个组合框中。 问题是如何将组的名称从对象显示到组合框中?

  • 本文向大家介绍bootstrap提示标签、提示框实现代码,包括了bootstrap提示标签、提示框实现代码的使用技巧和注意事项,需要的朋友参考一下 首先聊一聊提示标签: 效果: 下面讲一讲提示框: 效果: 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教程。

  • 我试图分配用户作为版主到论坛类别(subreddits)中的透视表称为 这是桌子 版主:id、用户id、子Reddit id、创建时间、更新时间 用户: id: name: email... 子域名:id,用户id,名称。。。 我已经创建了视图,控制器和模型,但数据不会提交到数据库,我没有错误。 注意:我需要访问此路径,以便进入视图并开始提交。 编辑:我刚刚清空了函数,并将其替换为

  • 使用Springboot 2.2.4和Openshift的本地发行版(Minishift,库伯内特斯Master 1.11,Openshift Web Console 3.11)。 该应用程序本身只是一个spring-boot-starter-data-rest CRUD,用于Openshift中一个pod中配置的简单雇员实体。数据源是另一个容器中的MySQL服务。 在部署时,一些数据被加载到员工

  • 我对Prestashop 1.7有一个完全神秘的问题。7. 在数据库ps_product表中,所有数量都设置为0。然而,在BO中,我可以看到实际数量。 编辑:我发现桌子ps_stock_availabe。数量在这里。我在控制器中添加了此代码: 没有运气。 我怎样才能在控制器中获得我的产品实例中的股票信息? 谢谢你抽出时间。