代码之家  ›  专栏  ›  技术社区  ›  Chris

筛选包含链接的html表

  •  1
  • Chris  · 技术社区  · 4 年前

    How to filter a html table using simple javascript? 我想用链接到url的单元格过滤html表。

    这里是我搜索“时的示例” sweden 它还显示“德国”,因为 Germany https://germany.net/sweden 在桌子上

    function myFunction() {
      var input, filter, table, tr, td, i;
      input = document.getElementById("myInput");
      filter = input.value.toUpperCase();
      table = document.getElementById("myTable");
      tr = table.getElementsByTagName("tr");
      for (var i = 0; i < tr.length; i++) {
        var tds = tr[i].getElementsByTagName("td");
        var flag = false;
        for(var j = 0; j < tds.length; j++){
          var td = tds[j];
          if (td.innerHTML.toUpperCase().indexOf(filter) > -1) {
            flag = true;
          } 
        }
        if(flag){
            tr[i].style.display = "";
        }
        else {
            tr[i].style.display = "none";
        }
      }
    }
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
    <html>
    <head>
    <meta name="viewport" content="width=device-width, initial-scale=1">
    </head>
    <body>
    <input type="text" id="myInput" onkeyup="myFunction()" placeholder="Search for names then click to launch.." title="Type in a name">
    
    <table id="myTable">
      <tr class="header">
        <th style="width:60%;">Name</th>
        <th style="width:40%;">Country</th>
      </tr>
      <tr>
        <td>Alfreds Futterkiste</td>
        <td><a href="https://germany.net/sweden">Germany</a></td>
      </tr>
      <tr>
        <td>Berglunds snabbkop</td>
        <td>Sweden</td>
      </tr>
      <tr>
        <td>Island Trading</td>
        <td>UK</td>
      </tr>
      <tr>
        <td>Koniglich Essen</td>
        <td>Germany</td>
      </tr>
      <tr>
        <td>Laughing Bacchus Winecellars</td>
        <td>Canada</td>
      </tr>
      <tr>
        <td>Magazzini Alimentari Riuniti</td>
        <td>Italy</td>
      </tr>
      <tr>
        <td>North/South</td>
        <td>UK</td>
      </tr>
      <tr>
        <td>Paris specialites</td>
        <td>France</td>
      </tr>
    </table>
    </body>
    </html>
    2 回复  |  直到 4 年前
        1
  •  1
  •   Dominik Roberto C Dl Garza    4 年前

    改变 innerHTML innerText 所以避免在过滤器中包含链接。

    旁注:只有当你想确保你的搜索中不包含HTML元素时,这才有效。如果你的用例超出了这个范围,你将需要一个不同的结构(比如JSON)中的数据来过滤,这样也会生成表。

    function myFunction() {
      var input, filter, table, tr, td, i;
      input = document.getElementById("myInput");
      filter = input.value.toUpperCase();
      table = document.getElementById("myTable");
      tr = table.getElementsByTagName("tr");
      for (var i = 0; i < tr.length; i++) {
        var tds = tr[i].getElementsByTagName("td");
        var flag = false;
        for(var j = 0; j < tds.length; j++){
          var td = tds[j];
          if (td.innerText.toUpperCase().indexOf(filter) > -1) {
          //      ^-- I changed this
            flag = true;
          } 
        }
        if(flag){
            tr[i].style.display = "";
        }
        else {
            tr[i].style.display = "none";
        }
      }
    }
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
    <html>
    <head>
    <meta name="viewport" content="width=device-width, initial-scale=1">
    </head>
    <body>
    <input type="text" id="myInput" onkeyup="myFunction()" placeholder="Search for names then click to launch.." title="Type in a name">
    
    <table id="myTable">
      <tr class="header">
        <th style="width:60%;">Name</th>
        <th style="width:40%;">Country</th>
      </tr>
      <tr>
        <td>Alfreds Futterkiste</td>
        <td><a href="https://germany.net/sweden">Germany</a></td>
      </tr>
      <tr>
        <td>Berglunds snabbkop</td>
        <td>Sweden</td>
      </tr>
      <tr>
        <td>Island Trading</td>
        <td>UK</td>
      </tr>
      <tr>
        <td>Koniglich Essen</td>
        <td>Germany</td>
      </tr>
      <tr>
        <td>Laughing Bacchus Winecellars</td>
        <td>Canada</td>
      </tr>
      <tr>
        <td>Magazzini Alimentari Riuniti</td>
        <td>Italy</td>
      </tr>
      <tr>
        <td>North/South</td>
        <td>UK</td>
      </tr>
      <tr>
        <td>Paris specialites</td>
        <td>France</td>
      </tr>
    </table>
    </body>
    </html>
        2
  •  0
  •   Tushar Wasson    4 年前
    use textContent instead of innerHtml.
    

    function myFunction() {
          var input, filter, table, tr, td, i;
          input = document.getElementById("myInput");
          filter = input.value.toUpperCase();
          table = document.getElementById("myTable");
          tr = table.getElementsByTagName("tr");
          for (var i = 0; i < tr.length; i++) {
            var tds = tr[i].getElementsByTagName("td");
            var flag = false;
            for(var j = 0; j < tds.length; j++){
              var td = tds[j];
             console.log(td.textContent);
    
              if (td.textContent.toUpperCase().indexOf(filter) > -1) {
                flag = true;
              } 
            }
            if(flag){
                tr[i].style.display = "";
            }
            else {
                tr[i].style.display = "none";
            }
          }
        }
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
        <html>
        <head>
        <meta name="viewport" content="width=device-width, initial-scale=1">
        </head>
        <body>
        <input type="text" id="myInput" onkeyup="myFunction()" placeholder="Search for names then click to launch.." title="Type in a name">
    
        <table id="myTable">
          <tr class="header">
            <th style="width:60%;">Name</th>
            <th style="width:40%;">Country</th>
          </tr>
          <tr>
            <td>Alfreds Futterkiste</td>
            <td><a href="https://germany.net/sweden">Germany</a></td>
          </tr>
          <tr>
            <td>Berglunds snabbkop</td>
            <td>Sweden</td>
          </tr>
          <tr>
            <td>Island Trading</td>
            <td>UK</td>
          </tr>
          <tr>
            <td>Koniglich Essen</td>
            <td>Germany</td>
          </tr>
          <tr>
            <td>Laughing Bacchus Winecellars</td>
            <td>Canada</td>
          </tr>
          <tr>
            <td>Magazzini Alimentari Riuniti</td>
            <td>Italy</td>
          </tr>
          <tr>
            <td>North/South</td>
            <td>UK</td>
          </tr>
          <tr>
            <td>Paris specialites</td>
            <td>France</td>
          </tr>
        </table>
        </body>
        </html>
        3
  •  0
  •   mplungjan Gvidas    4 年前

    问题是使用textContent而不是innerHTML

    这是现代版

    const search = document.getElementById("myInput");
    
    const toggle = () => {
      const text = search.value.toUpperCase();
      const rows = [...document.querySelectorAll("#myTable tr")]
    
      rows.forEach(tr => {
        const show = [...tr.querySelectorAll("td")].filter(td => {
          return td.textContent.toUpperCase().includes(text)
        }).length > 0
    
        tr.classList.toggle("hide", text && !show)
      })
    }
    
    search.addEventListener('keydown', ({ key }) => {
      if (["Backspace", "Delete"].includes(key))  toggle()
    })
    
    search.addEventListener('input', toggle)
    .hide {
      display: none
    }
    <input type="text" id="myInput" autocomplete="off" placeholder="Search for names then click to launch.." title="Type in a name">
    
    <table>
      <thead>
        <tr class="header">
          <th style="width:60%;">Name</th>
          <th style="width:40%;">Country</th>
        </tr>
      </thead>
      <tbody id="myTable">
        <tr>
          <td>Alfreds Futterkiste</td>
          <td><a href="https://germany.net/sweden">Germany</a></td>
        </tr>
        <tr>
          <td>Berglunds snabbkop</td>
          <td>Sweden</td>
        </tr>
        <tr>
          <td>Island Trading</td>
          <td>UK</td>
        </tr>
        <tr>
          <td>Koniglich Essen</td>
          <td>Germany</td>
        </tr>
        <tr>
          <td>Laughing Bacchus Winecellars</td>
          <td>Canada</td>
        </tr>
        <tr>
          <td>Magazzini Alimentari Riuniti</td>
          <td>Italy</td>
        </tr>
        <tr>
          <td>North/South</td>
          <td>UK</td>
        </tr>
        <tr>
          <td>Paris specialites</td>
          <td>France</td>
        </tr>
      </tbody>
    </table>