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

如何使datalist从一开始就匹配结果

易品
2023-03-14

我想用html制作datalist这里是一个例子

<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>

但是当我搜索“go”时,它会显示两个结果

    null

我必须在MySQL中存储的5000多条记录上实现这一点。

共有1个答案

姜淇
2023-03-14

对于这种情况,有一个非常合理的解决方案:在datalist内部html中保留一个空的(如果为空,将在焦点事件中填充),并用JavaScript在每个输入事件中动态填充它。在JS中,最好按字母顺序对选项数组进行排序,以便能够在发现某些巧合而没有进一步匹配时停止迭代。继续这个问题的例子:

const dlOptions = ["C", "C#", "C++", "CSS", "Erlang", "Go", "HTML", "Java",
"JavaScript", "PHP And HTML", "Python And C++", "Ruby And Go"].map(o => {
    return [`<option value="${o}"></option>`, o.toLowerCase()];
});

function completeDataList(e) {
    const fill = val => document.getElementById('languages').innerHTML = val;
    if(!e.target.value) {
        fill(dlOptions.reduce((sum, [html]) => sum + html, ''));
    } else if(!(e instanceof InputEvent)) { // OR: else if(!e.inputType)
        e.target.blur();
    } else {
        const inputValue = e.target.value.toLowerCase();
        let result = '';
        for (const [html, valuePattern] of dlOptions) {
            if (!valuePattern.indexOf(inputValue)) {
                result += html;
            } else if (result) {
                break;
            }
        }
        fill(result);
    }
}

function fillDataListIfEmpty() {
    if(!document.getElementById('languages').innerHTML) {
        completeDataList({ target: {} });
    }
}
<h1>Datalist Demo</h1>
<label for="default">Pick a programming language</label>
<input type="text" id="default" list="languages" oninput="completeDataList(event)" onfocus="fillDataListIfEmpty()">
<datalist id="languages"></datalist>
 类似资料:
  • 我使用Twittertypeahead.js搜索名单的名字和客户端希望根据名字的建议。 有没有一个选项可以让Twittertypeahead.js搜索查询与每个结果的开头相匹配,而不是字符串中的任何位置? 我可以在函数中看到一个变量,但是我不知道如何将其指定为一个选项,甚至不知道这是否与我试图实现的目标有关。 在我的项目中调用typeahead的jQuery函数是: 我可以看到来自的响应格式 所以

  • 请告诉我,每次我运行消费者时,如何从一开始就使用Kafka消费者API阅读消息。

  • 我正在尝试构建一个基本的服务人员来处理从我的网站发送的所有AJAX请求。 服务工作者已订阅获取事件。我可以处理所有发送的请求,但在第一次安装service worker时,该请求不起作用。 一旦安装了服务工作者,如果我刷新网页,那么获取事件处理程序就会工作。 我希望我的服务人员从一开始就获取所有请求。有可能吗? 这是我的代码: 指数html sw.js

  • 我在本地机器上安装了Kafka,并启动了zookeeper和一个代理服务器。 现在我有一个单独的主题,描述如下: 我有一个生产者在消费者启动之前产生了一些消息,如下所示: 当我使用--从头开始选项启动消费者时,它不会显示生产者生成的所有消息: 但是,它显示的是新添加的消息。 我在这里怎么了?有什么帮助吗?

  • 我对从有序对象列表中获取子列表的Y方法感兴趣。子列表应该以一个对象开始,该对象匹配一个与它的属性相关的给定条件,它应该以一个对象匹配一个不同的条件结束。 假设我有以下类: 我需要从(包括)到(包括)的子列表,保持它在源列表中的顺序,将放在一边。 我知道如何在不使用流的情况下做到这一点(比如查找开始和结束的索引,然后将元素从index获取到index),这可能已经足够了,但有些过时,不能真正满足我对