我原以为除了选择下拉列表中的值,还可以在组合框中输入文本。然而,我找不到如何实现此功能的信息。是否需要添加某些属性才能允许输入文本?
在使用datalist
之前(见下面的注意事项),您需要提供一个额外的input
元素,以便让用户输入他们自己的选项。
<select name="example">
<option value="A">A</option>
<option value="B">B</option>
<option value="-">Other</option>
</select>
<input type="text" name="other">
这种机制在所有浏览器中均可运行,无需 JavaScript。
您可以使用一些 JavaScript 来巧妙地仅在选择“其他”选项时显示 input
。
datalist
元素旨在提供更好的机制。在某些浏览器中(例如 iOS Safari < 12.2),不支持此元素或实现存在问题。 可以查看 Can I Use 页面 以查看当前 datalist 支持情况。
<input type="text" name="example" list="exampleList">
<datalist id="exampleList">
<option value="A">
<option value="B">
</datalist>
在HTML中,您需要这样做:
首先定义一个文本输入框:
<input type="text" list="browsers" />
并将一个数据列表附加到它上面(请注意输入元素的list属性)。
<datalist id="browsers">
<option value="Internet Explorer">
<option value="Firefox">
<option value="Chrome">
<option value="Opera">
<option value="Safari">
</datalist>
这个链接可以帮助您: http://www.scriptol.com/html5/combobox.php
您将看到两个例子。一个是HTML4,另一个是HTML5。
HTML5
<input type="text" list="browsers"/>
<datalist id="browsers">
<option>Google</option>
<option>IE9</option>
</datalist>
HTML4
<input type="text" id="theinput" name="theinput" />
<select name="thelist" onChange="combo(this, 'theinput')">
<option>one</option>
<option>two</option>
<option>three</option>
</select>
function combo(thelist, theinput) {
theinput = document.getElementById(theinput);
var idx = thelist.selectedIndex;
var content = thelist.options[idx].innerHTML;
theinput.value = content;
}
dojo
示例在大多数情况下不能应用于现有代码。因此,我不得不寻找替代方案,发现这里 - hxxp://technologymantrablog.com/how-to-create-a-combo-box-with-text-input-jquery-autocomplete/ (现在指向垃圾邮件网站或更糟的内容)。
archive.org(没有太大用处)现在已经是2016年,仍然没有一种简单的方法来实现组合框...虽然我们有datalist,但由于没有Safari/iOS支持,它实际上并不可用。至少我们有ES6...下面是一种尝试将div或span包装为组合框的组合类,它将输入框放在选择框上方,并绑定相关事件。
请在https://github.com/kofifus/Combo查看代码。
(该代码依赖于https://github.com/kofifus/New中的类模式)
创建一个组合框很容易!只需将一个div传递给其构造函数即可:
let mycombo=Combo.New(document.getElementById('myCombo'));
mycombo.options(['first', 'second', 'third']);
mycombo.onchange=function(e, combo) {
let val=combo.value;
// let val=this.value; // same as above
alert(val);
}
<script src="https://rawgit.com/kofifus/New/master/new.min.js"></script>
<script src="https://rawgit.com/kofifus/Combo/master/combo.min.js"></script>
<div id="myCombo" style="width:100px;height:20px;"></div>
select#programmoduleselect
{
clip: rect(auto auto auto 331px);
width: 351px;
height: 23px;
z-index: 101;
position: absolute;
}
input#programmodule
{
width: 328px;
height: 17px;
}
<table><tr>
<th>Programm / Modul:</th>
<td>
<select id="programmoduleselect"
onchange="var textbox = document.getElementById('programmodule'); textbox.value = (this.selectedIndex == -1 ? '' : this.options[this.selectedIndex].value); textbox.select(); fireEvent2(textbox, 'change');"
onclick="this.selectedIndex = -1;">
<option value=RFEM>RFEM</option>
<option value=RSTAB>RSTAB</option>
<option value=STAHL>STAHL</option>
<option value=BETON>BETON</option>
<option value=BGDK>BGDK</option>
</select>
<input name="programmodule" id="programmodule" value="" autocomplete="off"
onkeypress="if (event.keyCode == 13) return false;" />
</td>
</tr></table>
(最初在此处使用,但不要发送表单:old.dlubal.com/WishedFeatures.aspx)
编辑:对于macOS,样式需要有所不同:Ch是可以的,对于FF增加组合框的高度,Safari和Opera忽略组合框的高度,因此增加它们的字体大小(有一个上限,然后稍微减小文本框的高度):https://istack.dev59.com/efQ9i.webp
<link rel="stylesheet" href="https://ajax.googleapis.com/ajax/libs/dojo/1.9.6/dijit/themes/claro/claro.css" />
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/dojo/1.10.3/dojo/dojo.js"></script>
接下来,你可以直接按照Dojo示例代码进行操作,或者使用下面的示例来获取一个可用的组合框。
<body>
<!-- Dojo Dijit ComboBox with 'Claro' theme -->
<div class="claro"><input id="item_name_1" class=""/></div>
<script type="text/javascript">
$(document).ready(function () {
//In this example, dataStore is simply an array of JSON-encoded id/name pairs
dataStore = [{"id":"43","name":"Domain Name Renewal"},{"id":"42","name":"Hosting Renewal"}];
require(
[ "dojo/store/Memory", "dijit/form/ComboBox", "dojo/domReady!"],
function (Memory, ComboBox) {
var stateStore = new Memory({
data: dataStore
});
var combo = new ComboBox({
id: "item_name_1",
name: "desc_1",
store: stateStore,
searchAttr: "name"},
"item_name_1"
).startup();
});
});
</script>
</body>
其他的答案都不令人满意,主要是因为用户界面看起来很糟糕。我发现了this,它看起来很好,非常接近完美,而且可以自定义。
这里可以找到完整的示例、选项等列表here,但这是一个基本演示:
$('#editable-select').editableSelect();
<link href="https://cdn.jsdelivr.net/npm/jquery-editable-select@2.2.5/dist/jquery-editable-select.min.css" rel="stylesheet"/>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/jquery-editable-select@2.2.5/dist/jquery-editable-select.min.js"></script>
<select id="editable-select">
<option>Alfa Romeo</option>
<option>Audi</option>
<option>BMW</option>
<option>Citroen</option>
</select>
<html>
<head>
<title></title>
<script src="jquery-3.1.0.js"></script>
<script>
$(function () {
$('#selectnumber').change(function(){
alert('.val() = ' + $('#selectnumber').val() + ' AND html() = ' + $('#selectnumber option:selected').html() + ' AND .text() = ' + $('#selectnumber option:selected').text());
})
});
</script>
</head>
<body>
<div>
<select id="selectnumber">
<option value="1">one</option>
<option value="2">two</option>
<option value="3">three</option>
<option value="4">four</option>
</select>
</div>
</body>
</html>
Thanks...:)
<select>
元素无法做到那样。 - j08691list
属性可以胜任工作,请考虑更改接受的答案。 - laggingreflex<select>
和<option>
,并且开始时选择了一个空白选项。这个列表有一些值,并且“看起来像是一个组合框”;只是缺少在文本区域中输入的能力。 - ToolmakerSteve