在Limit total entries displayed by datalist,使用@Olli的独特解决方案,我可以限制datalist
提供的建议的数量。
问题:该解决方案仅允许搜索option innerHTML
。即使datalist option value=
默认情况下也可以同时搜索datalist
。
例如(请参见下面的示例),如果我键入输入California
,则datalist
不会返回California
结果,但是如果我输入CA
或{{ 1}},然后CA-US
返回预期的datalist
结果。
我需要对Javscript代码进行哪些更改才能包含California
功能?
option innerHTML
var search = document.querySelector('#search');
var results = document.querySelector('#searchresults');
var templateContent = document.querySelector('#resultstemplate').content;
search.addEventListener('keyup', function handler(event) {
while (results.children.length) results.removeChild(results.firstChild);
var inputVal = new RegExp(search.value.trim(), 'i');
var clonedOptions = templateContent.cloneNode(true);
var set = Array.prototype.reduce.call(clonedOptions.children, function searchFilter(frag, el) {
if (inputVal.test(el.textContent) && frag.children.length < 5) frag.appendChild(el);
return frag;
}, document.createDocumentFragment());
results.appendChild(set);
});
var n = document.getElementById("search");
n.addEventListener("keyup", function(event) {
event.preventDefault();
if (event.keyCode === 13) {
document.getElementById("myButton").click();
}
});
答案 0 :(得分:1)
只需使用(inputVal.test(el.textContent) || inputVal.test(el.value)
代替inputVal.test(el.textContent)
即可获得理想的结果。在这里,我们同时搜索value
和innerHTML
,如果其中任何一个与输入文本匹配,都接受它:)
更新:即使用户从其中选择一个项目,这也会导致下拉列表停留在该位置,这是因为即使选择了一个项目,输入框的值也会与ex的下拉值相匹配。 California
将与California
匹配,并在下拉列表中显示。
要解决此问题,我们必须在if语句(search.value != el.value)
中添加另一个条件,这将确保如果输入值正好等于下拉值,则该下拉值将被忽略。在下面查看更新的代码段...
var search = document.querySelector('#search');
var results = document.querySelector('#searchresults');
var templateContent = document.querySelector('#resultstemplate').content;
search.addEventListener('keyup', function handler(event) {
while (results.children.length) results.removeChild(results.firstChild);
var inputVal = new RegExp(search.value.trim(), 'i');
var clonedOptions = templateContent.cloneNode(true);
var set = Array.prototype.reduce.call(clonedOptions.children, function searchFilter(frag, el) {
if ((inputVal.test(el.textContent) || inputVal.test(el.value)) && (search.value != el.value) && frag.children.length < 5) frag.appendChild(el);
return frag;
}, document.createDocumentFragment());
results.appendChild(set);
});
var n = document.getElementById("search");
n.addEventListener("keyup", function(event) {
event.preventDefault();
if (event.keyCode === 13) {
document.getElementById("myButton").click();
}
});
<template id="resultstemplate">
<option value="Alabama">AL-US</option>
<option value="California">CA-US</option>
<option value="Michigan">MI-US</option>
<option value="Texas">TX-US</option>
<option value="Wisconsin">WI-US</option>
</template>
<input type="text" name="search" id="search" placeholder="type state name or code" list="searchresults" autocomplete="off" />
<datalist id="searchresults"></datalist>
<button id="myButton" type="button"
onclick="loadDoc('state_data.xml', myFunction)">Submit
</button>