如何在搜索框中输入,并使输入的字母从建议的单词变为粗体?例如,我在搜索栏中输入"他",当我输入:help时,它看起来是这样的.此外,如果我输入"lp",文本应该出现:help.

我已经写了一些代码,我只是想添加这个功能,但不知道如何做到这一点.谢谢

  // List toggle (search bar)
  const searchBar = document.querySelector('#search-bar');
  const searchList = document.querySelector('#search-list');

  searchBar.addEventListener('click', () => {
    searchList.style.display = "block";
  });

  const updateListState = e => {
    const targetId = e.target.id;
    if (targetId !== 'search-bar' && targetId !== 'search-list' && targetId !== 'search-bar-filler' && targetId !== 'search-bar-container' && targetId !== 'search-item-names' && targetId !== 'search-submit' && targetId !== 'search-submit-container') {
      searchList.style.display = "none";
    }
  }
  document.addEventListener('mousemove', updateListState);

  // Letter search (search bar)
  function search_items() {
    let input = document.getElementById('search-bar').value
    input = input.toLowerCase();

    let x = document.getElementsByClassName('search-item-names');

    for (i = 0; i < x.length; i++) {
      if (!x[i].innerHTML.toLowerCase().includes(input)) {
        x[i].style.display = "none";
      }
      else {
        x[i].style.display = "list-item";
      }
    }
  }
  #filler {
    position: absolute;
    background-color: red;
    width: 20px;
    height: 20px;
  }

  #search-list {
    margin-top: 20px;
    width: 150px;
    height: 150px;
    display: none;
  }
  <div id="search-bar-container">
    <input id="search-bar" type="text" name="search" onkeyup="search_items()" placeholder="Search items..">
    <div id="search-bar-filler"></div>
    <div id='search-list'>
      <div id="search-item-names" class="search-item-names">Automotive Degreaser</div>
      <div id="search-item-names" class="search-item-names">Beats by Dre</div>
      <div id="search-item-names" class="search-item-names">JBL Partybox</div>
      <div id="search-item-names" class="search-item-names">Makeup</div>
      <div id="search-item-names" class="search-item-names">Mr Potato Head</div>
      <div id="search-item-names" class="search-item-names">Olympus Camera</div>
      <div id="search-item-names" class="search-item-names">Pillow</div>
      <div id="search-item-names" class="search-item-names">RC Race Car</div>
      <div id="search-item-names" class="search-item-names">Simon Rabbit</div>
      <div id="search-item-names" class="search-item-names">Truth Hoodie</div>
    </div>
  </div>

推荐答案

如何根据用户的输入动态创建正则表达式,并使用它来解析和格式化建议的匹配部分:

const searchBar = document.querySelector('#search-bar');
const searchList = document.querySelector('#search-list');

searchBar.addEventListener('click', () => {
    searchList.style.display = "block";
});

const updateListState = e => {
    const targetId = e.target.id;
    if (targetId !== 'search-bar' && targetId !== 'search-list' && targetId !== 'search-bar-filler' && targetId !== 'search-bar-container' && targetId !== 'search-item-names' && targetId !== 'search-submit' && targetId !== 'search-submit-container') {
        searchList.style.display = "none";
    }
}
document.addEventListener('mousemove', updateListState);

function search_items() {
    let input = document.getElementById('search-bar').value;
    input = input.toLowerCase();
    let x = document.getElementsByClassName('search-item-names');
    const regex = new RegExp(input, 'gi');
    for (let i = 0; i < x.length; i++) {
        let originalText = x[i].getAttribute('data-original-text');
        if (!originalText) {
            originalText = x[i].textContent;
            x[i].setAttribute('data-original-text', originalText);
        }
        if (!originalText.toLowerCase().includes(input)) {
            x[i].style.display = "none";
        } else {
            x[i].style.display = "list-item";
            const formattedText = originalText.replace(regex, match => `<b>${match}</b>`);
            x[i].innerHTML = formattedText;
        }
    }
}

document.getElementById('search-bar').addEventListener('input', function () {
    if (this.value === '') {
        search_items();
    }
});
#filler {
    position: absolute;
    background-color: red;
    width: 20px;
    height: 20px;
}

#search-list {
    margin-top: 20px;
    width: 150px;
    height: 150px;
    display: none;
}
<div id="search-bar-container">
    <input id="search-bar" type="text" name="search" onkeyup="search_items()" placeholder="Search items..">
    <div id="search-bar-filler"></div>
    <div id='search-list'>
        <div id="search-item-names" class="search-item-names">Automotive Degreaser</div>
        <div id="search-item-names" class="search-item-names">Beats by Dre</div>
        <div id="search-item-names" class="search-item-names">JBL Partybox</div>
        <div id="search-item-names" class="search-item-names">Makeup</div>
        <div id="search-item-names" class="search-item-names">Mr Potato Head</div>
        <div id="search-item-names" class="search-item-names">Olympus Camera</div>
        <div id="search-item-names" class="search-item-names">Pillow</div>
        <div id="search-item-names" class="search-item-names">RC Race Car</div>
        <div id="search-item-names" class="search-item-names">Simon Rabbit</div>
        <div id="search-item-names" class="search-item-names">Truth Hoodie</div>
    </div>
</div>

Javascript相关问答推荐

在HTML中使用脚本变量作为背景图像源

如何访问react路由v6加载器函数中的查询参数/搜索参数

ReactJS中的material UI自动完成类别

Bootstrap动态选项卡在切换选项卡后保持活动状态,导致元素堆叠

jQuery提交按钮重新加载页面,即使在WordPress中使用preventDefault()

使用javascript将Plotly Expandable Sparkline转换为HighCharter Plot在bslib卡中

Angular:动画不启动

为什么!逗号和空格不会作为输出返回,如果它在参数上?

如何在bslib nav_insert之后更改导航标签的CSS类和样式?

Ember.js 5.4更新会话存储时如何更新组件变量

是什么导致了这种奇怪的水平间距错误(?)当通过JavaScript将列表项元素追加到无序列表时,是否在按钮之间?

JavaScript是否有多个`unfined`?

TinyMCE 6导致Data:Image对象通过提供的脚本过度上载

将范围 Select 器添加到HighChart面积图

用于部分字符串的JavaScript数组搜索

Node.js API-queryAll()中的MarkLogic数据移动

Next.js无法从外部本地主机获取图像

未找到用于 Select 器的元素:in( puppeteer 师错误)

KeyboardEvent:检测到键具有打印的表示形式

如果查询为空,则MongoDB将所有文档与$in匹配