有没有一种方法可以使HTML5数据列表使用模糊搜索?

时间:2019-12-13 16:06:53

标签: html input fuzzy-search html-datalist

我有一组要在搜索时进行模糊匹配的数据列表选项。例如,如果我键入“ PHP HTML”或“ PHPAndHTML”,则我希望它们中的任何一个都与“ PHP And HTML”选项匹配。有什么办法吗?有关代码示例,请参见this fiddle

<h1>Datalist Demo</h1>
<label for="default">Pick a programming language</label>
<input type="text" id="default" list="languages">
<datalist id="languages">
    <option value="HTML">
    <option value="CSS">
    <option value="JavaScript">
    <option value="Java">
    <option value="Ruby And Go">
    <option value="PHP And HTML">
    <option value="Go">
    <option value="Erlang">
    <option value="Python And C++">
    <option value="C">
    <option value="C#">
    <option value="C++">
</datalist>

我想使用本地数据列表而不是自定义库来执行此操作。原因是,在我的实际场景中,我的页面上有数百个输入都使用相同的数据列表,而使用自定义库会占用大量CPU,而如果我将所有输入都绑定到单个数据列表,则实际上

1 个答案:

答案 0 :(得分:7)

数据列表匹配行为不可自定义。

即使您试图强制下拉菜单可见,也不会显示。

$(document).on('keyup', '#default', function() {
  let val = this.value.split(/[\s]+|(?=[A-Z][a-z])|(?<=[a-z])(?=[A-Z])/),
    reg = '';
  val.forEach(function(entry) {
    if (entry != '')
      reg += '.*' + entry + '.*'
  });

  var datalist = $('#languages option');
  $.each(datalist, function(i) {
    var option = datalist[i].value;
    if (!option.match(reg)) {
      $(datalist[i]).hide()
    } else {
      $(datalist[i]).show()
      $('#languages').show()
      console.log(datalist[i].value)
    }
  });
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.5.1/jquery.js" integrity="sha256-QWo7LDvxbWT2tbbQ97B53yJnYU3WhH/C8ycbRAkjPDc=" crossorigin="anonymous"></script>
<h1>Datalist Demo</h1>
<label for="default">Pick a programming language</label>
<input type="text" id="default" list="languages">
<datalist id="languages" open="open">
    <option value="HTML">
    <option value="CSS">
    <option value="JavaScript">
    <option value="Java">
    <option value="Ruby And Go">
    <option value="PHP And HTML">
    <option value="Go">
    <option value="Erlang">
    <option value="Python And C++">
    <option value="C">
    <option value="C#">
    <option value="C++">
</datalist>

随意测试上面的代码,当您键入时,根据正则表达式显示/隐藏正确的值。但是数据列表不可见。

据说另一个答案也做了类似的事情,但即使这个答案也不能奏效,以证明我的观点。 https://stackoverflow.com/questions/42592978/how-to-make-datalist-match-result-from-beginning-only

如果您要具有可自定义的行为,我建议在此特定用例中使用插件。