【问题标题】:How to highlight words in a table with a filter?如何使用过滤器突出显示表格中的单词?
【发布时间】:2019-07-04 04:56:02
【问题描述】:

我想创建一个带有过滤器的表格,该过滤器在显示搜索结果时突出显示已搜索的关键字。

我喜欢这个问题的答案:live highlight a word(s) with jQuery,但我不知道如何在我现有的代码中实现它。

function myFunction() {
  // Declare variables
  var input, filter, table, tr, td, i, txtValue;
  input = document.getElementById("myInput");
  filter = input.value.toUpperCase();
  table = document.getElementById("myTable");
  tr = table.getElementsByTagName("tr");

  // Loop through all table rows, and hide those who don't match the search query
  for (i = 0; i < tr.length; i++) {
    td = tr[i].getElementsByTagName("td")[0];
    if (td) {
      txtValue = td.textContent || td.innerText;
      if (txtValue.toUpperCase().indexOf(filter) > -1) {
        tr[i].style.display = "";
      } else {
        tr[i].style.display = "none";
      }
    }
  }
}
<input type="text" id="myInput" onkeyup="myFunction()" placeholder="Search...">
<table id="myTable">
  <tr>
    <td>
       <h1>Text</h1>
       <p><span class="red">Text</span></p>
       <p>Text</p>
    </td>
    <td><img src=".."></td>
  </tr>
  <td>
       <h1>Text</h1>
       <p><span class="red">Text</span></p>
       <p>Text</p>
    </td>
    <td><img src=".."></td>
</table>

【问题讨论】:

  • 所以您已经定义了一个目标并向我们展示了一些代码,但尚未确定该代码的具体问题或它产生的任何错误或代码具体做什么或不做什么以及在哪里你有具体的问题。还有助于在表格中提供足够的样本数据,使整个事情可以像minimal reproducible example 中那样运行
  • 请注意,您可能很容易在网络上找到现成的突出显示脚本
  • 看起来你只在第一个 中寻找你的单词匹配,如果你的单词恰好在该行的其他 td 标签中,它不会匹配那些。如果您想在其他 td 标记中查找单词,则必须添加一个嵌套循环以在这些标记中运行。

标签: javascript html html-table highlight


【解决方案1】:

你可以试试这个

function createTagAndAppendTo(tag, txt, elem){
  let customTag = document.createElement(tag);
  customTag.textContent = txt;
  elem.append(customTag);
}

function myFunction(evt) {
  // Declare variables
  let input, filter, table, tr, td, i, txtValue;
  let displayTr = [];
  filter = evt.value;
  table = document.getElementById("myTable");
  tr = table.getElementsByTagName("tr");
  let regExp = new RegExp(filter);
  if (!filter) {
    for (let i = 0; i < tr.length; i++) {
      tr[i].style.display = '';
    }
    return;
  }

  // Loop through all table rows, and hide those who don't match the search query
  for (let i = 0; i < tr.length; i++) {
    let trStyle = tr[i].style.display;
    td = tr[i].getElementsByTagName("td");
    for (let j = 0; j < td.length; j++) {

        txtValue = td[j].textContent;

        let count = (txtValue.match(regExp) || []).length;
        displayTr[i] = displayTr[i] ? displayTr[i] : count;
        if (count !== 0) {
          
          td[j].innerText = '';
          let strArray = txtValue.split(filter);
          let loopLength = strArray.length - 1;

          for (let i = 0; i < loopLength; i++) {
            createTagAndAppendTo('span', strArray[i], td[j]);
            createTagAndAppendTo('mark', filter, td[j]);
          }
          createTagAndAppendTo('span', strArray[loopLength], td[j]);
          
        } else {
          let tdStr = td[j].textContent;
          td[j].innerText = '';
          td[j].textContent = tdStr;
          
        }
      }
    
    if(displayTr[i] !== 0) {
      tr[i].style.display = '';
    } else {
       tr[i].style.display = 'none';
    }
  }
}
<input type="text" id="myInput" onkeyup="myFunction(this)" placeholder="Search...">
<table id="myTable">
  <tr>
    <td>...</td>
    <td>success</td>
    <td>Substring</td>
  </tr>
  <tr>
    <td>...</td>
    <td>...</td>
    <td>...</td>
  </tr>
</table>

【讨论】:

  • 好吧,问题是我想在 td 标签之间有更多的 html 标签。在这种情况下,如果我使用你的代码,它会弄乱我的 td 的整个结构......
  • 您能否提供html 标签的结构。另外,请非常具体地说明您的要求。
  • 好的。谢谢。现在,您要检查每个 html 标签中的 txt 并突出显示搜索到的文本?
  • 正好,不破坏html的结构
  • @Jay 你的问题解决了吗,还是仍然存在?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-03
  • 1970-01-01
  • 2014-08-07
  • 2016-05-02
  • 2020-08-15
相关资源
最近更新 更多