HTML5 表单的 list 属性/datalist 元素非常酷。当您在文本输入框中键入时,它会显示一个下拉菜单,您可以从中选择。或者您可以输入您想要的任何内容。list 属性本身不会将您锁定到任何特定值。这样,它有点像一组带有“其他”键入选项的单选按钮。
就像这样
<input type="text" id="search" list="states" placeholder="Find U.S. State">
<datalist id="states">
<option value="Alabama">
<option value="Alaska">
<!-- All the other states -->
</datalist>
最终呈现为

不幸的是,datalist 的浏览器支持(截至撰写本文时)仅限于 Firefox 4+、Opera 10.6+ 和尚未发布的 IE 10。您可能希望获得 WebKit 支持(以及旧版浏览器支持)来使用此有用功能。所以我制作了这个填充程序。它依赖于 Modernizr 进行检测,并依赖于 jQuery 来使其正常工作。

我在 iOS 5、IE 6+、Chrome(可能所有)和 Safari(可能所有)上使其正常工作。旧版 IE 缺少阴影框,但您可以使用 CSS 以您想要的方式进行样式设置。
与任何填充程序一样,您从正确的最新标记开始,它在旧版浏览器中“正常工作”。此填充程序模拟下拉菜单以及从下拉菜单中选择选项。它具有键盘支持(上下箭头和用回车键选择)并且即使在窗口调整大小后也能正确定位自身。
Safari 需要一个额外的技巧,因为它声称支持 list 属性和 datalist 元素,但实际上它不起作用。因此 Modernizr 检测不正确。由于 Safari 有着这些非常高的浏览器版本号,而其他浏览器都没有,因此我们可以仅使用 jQuery 对其进行测试。
if (!Modernizr.input.list || (parseInt($.browser.version) > 400))
更新 来自 Lee Reamsnyder 的以上内容,以防止更新的 Chrome 出现误报
if (!Modernizr.input.list || (parseInt($.browser.version) > 400 && !window.chrome))
它就是这个样子
它并不完美。它应该是一个插件,并在多个输入框上工作。它在 IE 中应该看起来更好。代码可能可以优化。如果您想下载或分叉它,请访问 GitHub。
更新(2012 年 10 月)
修复了 GitHub 链接
更新到 jQuery 1.8
为 jQuery 1.8 更新自定义 :contains 方法
干得漂亮。
但它不会阻止默认浏览器的操作(Chrome 也提供从表单历史记录中获取的元素列表,这些列表显示在 datalist 选项之上)…
哦,datalist 并不总是与输入框对齐(如果列表更改,并且窗口显示或隐藏滚动条)…
您应该能够使用 form 标签中的 autocomplete=’off’ 禁用浏览器的默认填充操作。
这确实解决了问题,但它破坏了 Opera 的原生 datalist 功能。
如何将 autocomplete=”off” 作为填充程序的一部分动态添加,这样您就不会在 Opera 中禁用 datalist?
您提到浏览器支持时,有一个拼写错误。我认为缺少“Opera”这个词 ;-)
@viki53 也许 autocomplete=”off” 会阻止默认列表出现?(瞎猜)
猜得不错 - 我在 Chrome 的开发者工具中将 autocomplete=”off” 添加到 HTML 中,结果正是这样。我相信很快就会出现一个巧妙的解决方案。
似乎有一个 bug。如果您开始键入州名,按下向下箭头一次,然后按回车键,它会在框中输入阿拉巴马州。您必须按下向下箭头两次才能选择过滤列表中的第一个选项。
已修复。
您看到这个了吗?https://github.com/JamieAppleseed/selectToAutocomplete
很酷。显然是不同的项目。
向下键不起作用…有什么意义,键入并使用鼠标进行选择,拜托 chris。你做得很好,但你需要从 UX 的角度修复这个问题。
此致
在我的文章中列出的浏览器(在 Mac 上)上对我来说可以正常工作。如果对您不起作用,请分叉它,修复它,并提交一个拉取请求:https://github.com/chriscoyier/Relevant-Dropdowns
具有讽刺意味的是,autocomplete=”off” 会在 Opera 中关闭 datalist。
该死。再次删除了。我想知道 preventDefault 是否适用于试图自动完成的浏览器。
干得漂亮!之前不知道这个功能。它在 iPad 上还是有点 bug,但感谢您提供这段代码 :)
非常棒。我讨厌社区如此吹毛求疵,这是一个好主意,我喜欢您的尝试,无论它是否有一些 bug。像您这样的人让网络变得更美好!
哦,我甚至发现 jQuery 可以解决这个问题。
Chris,我遇到的问题是,它似乎只适用于短列表。对于任何大型列表来说,这都是行不通的,我们仍然会使用 jQuery AutoComplete。这很可惜,因为我总是乐于在可以使用的情况下使用 HTML5 而不是 jQuery。
例如,在我构建的一个网站上,我们有三个字段,用户可以在其中键入机场。全球有超过 10,000 个机场,因此您可以想象在 HTML 中拥有 10,000 个选项是多么荒谬。
我不知道,也许有一种方法可以将 CSV 文件拉入请求,可能使用一些 jQuery,但仍然以比 AutoComplete 更轻便的方式进行,并且不需要 jQuery UI。
为什么您在填充程序中使用 jQuery?它看起来是一个相对简单的填充程序,可以在没有 jQuery 的情况下完成。我之前用“纯”JavaScript 编写了类似的东西,只是它在构造函数中接受所有数据作为对象。我可能会将其重写为填充程序:P
做得好,兄弟。做吧。
好主意,但在我的 iPhone 上不可用。好吧,你可以看到它在尝试工作,但它真的不适合 iPhone 对话框的呈现方式。
硬核分叉操作
演示在我的 IE 7-9 中似乎根本不起作用。
好的,它在 IE 中不起作用的原因是 IE(即使到 9)不支持 datalist,因此它不识别 datalist 的子元素。需要使用条件注释为 IE 添加一个选择框才能使其正常工作。
更大的 bug:如果下拉菜单包含滚动条,并且用户点击它,然后点击滚动条,则下拉菜单会消失。您甚至可以在 Chrome 的演示中看到这一点,方法是点击“州”字段,然后不要键入任何内容。下拉菜单会显示,然后您可以用鼠标点击下拉菜单。
好的,我已经找到了点击滚动条导致消失问题的解决方案。我不太习惯 GitHub 或者任何东西。如何提交补丁?
如果你愿意,可以将它压缩成 zip 文件并发送到我的邮箱 [电子邮件保护] ,我会查看一下。
在 iOS 上不起作用 :(
在我的 iOS 5 上可以正常使用:http://cl.ly/Dcr0