【问题标题】:Follow-up of search values from first column in html table using JS?使用JS跟踪html表中第一列的搜索值?
【发布时间】:2014-10-23 00:21:42
【问题描述】:

这是我的后续问题of this... See here. 我有一个 jscript(由 hex494D49 提供),从第一列搜索值。

我所需要的是,当用户搜索值时,表头也会显示,如果值没有存储。将显示一条消息,如下所示“未找到结果”。该怎么做?

Here's the JSfiddle file with html

这是 JScript:

document.getElementById('term').onkeyup = function(){
var term = this.value;    
var column = 0;            
var pattern = new RegExp(term, 'g');  
var table = document.getElementById('dataTable');
var tr = table.getElementsByTagName('TR');
for(var i = 0; i < tr.length; i++){
  var td = tr[i].getElementsByTagName('TD');
  for(var j = 0; j < td.length; j++){
    if(j == column && td[j].innerHTML == term){
      console.log('Found it: ' + td[j].innerHTML);
      tr[i].style.display = 'block';
      return;            
      alert('Found it: ' + td[j].innerHTML);
    }else{
      tr[i].style.display = 'none';
    }
  }    
}
};

【问题讨论】:

  • 表格有一个rows集合,每一行都有一个cells集合,所以不需要getElementsByTagName。表格行的默认 style.display 属性在某些浏览器中是 block,但在大多数情况下是 table-row
  • @RobG 所以我将块更改为表格行,现在它可以正确显示。我怎样才能显示表格标题?
  • 我明白了。我会修改代码并很快返回一个新版本。

标签: javascript search html-table


【解决方案1】:

这将是table 标记。如您所见,我添加了theadtbodytfoot

<!-- search box -->
<input type="text" name="term" id="term" autocomplete = "off" />

<!-- table results -->
<table id="dataTable">
<thead>
    <tr>
        <th>Example No.</th>
        <th>Column 1</th>
        <th>Column 2</th>
    </tr>
</thead>
<tfoot>
    <tr>
        <th colspan="3"></th>
    </tr>
</tfoot>
<tbody>
<tbody>    
    <tr>
        <td>345678917</td>
        <td>Test 1</td>
        <td>one_test1@gmail.com</td>
    </tr>
    <tr>
        <td>3512376894</td>
        <td>Test 2</td>
        <td>two.test2@hotmail.com</td>
    </tr>
</tbody>
</table>

上述标记的默认 CSS。下一步是将以下内容与 CSS 的其余部分合并。

table thead {
    display: table-row-group;
}

table tbody {
    display: table-row-group;
}

table tbody tr {
    display: none;
}

最后是 JavaScript sn-p 使用 getElementsByTagName() 方法

// JavaScript
document.getElementById('term').onkeyup = function(){
  var term = this.value;    
  var column = 0;
  var msg = 'No results found!';
  var pattern = new RegExp(term, 'g');  
  var table = document.getElementById('dataTable');
  var tr = table.getElementsByTagName('TR');

  for(var i = 0; i < tr.length; i++){
    var td = tr[i].getElementsByTagName('TD');
    for(var j = 0; j < td.length; j++){
      if(j == column && td[j].innerHTML == term){
        tr[i].style.display = 'table-row';
        table.tFoot.innerHTML = '';  
        return;
      }else{
        tr[i].style.display = 'none';
        table.tFoot.innerHTML = msg;
      }
    }    
  }
};

Working jsFiddle |不带tfootjsFiddle的版本


同上,但使用 rows[] 和 cells[] 集合

HTML

<!-- Search box -->
<input type="text" id="search" autocomplete = "off" />
<!-- Table -->
<table id="table">
    <thead>
        <tr>
            <th>Product</th>
            <th>Manufacturer</th>
            <th>Price</th>
            <th>InStock</th>
        </tr>    
    </thead>
    <tbody>
        <tr>
            <td>MacBook Air</td>
            <td>Apple</td>
            <td>$456</td>
            <td>85</td>            
        </tr>
        <tr>
            <td>Arc GIS</td>
            <td>ESRI</td>
            <td>$4556</td>
            <td>15</td>                        
        </tr>
        <tr>
            <td>3ds MAX</td>
            <td>Aurodesk</td>
            <td>$6556</td>
            <td>359</td>                        
        </tr>
        <tr>
            <td>Windows 7</td>
            <td>Micorsoft</td>
            <td>$256</td>
            <td>2567</td>                        
        </tr>        
    </tbody>
</table>
<!-- Message -->
<div id="message"></div>

CSS

table thead {
    display: table-row-group;
}
table tbody tr {
    display: none;
}

JavaScript

document.getElementById('search').onkeyup = function(){
    var table = document.getElementById('table'),
        tr = table.rows, td,
        term = this.value.toLowerCase(), column = 0, i, j,
        message = document.getElementById('message');

    for(i = 1; i < tr.length; i++){
        td = tr[i].cells;
        for(j = 0; j < td.length; j++){
            if(j == column && td[j].innerHTML.toLowerCase() == term){
                tr[i].style.display = 'table-row';
                message.innerHTML = '';
                return;
            }else{
                tr[i].style.display = 'none';
                message.innerHTML = 'No results found!';
            }
        }
    }
};

Working jsFiddle 如果你不会在你的表格中使用theadtbody 这是另一个版本jsFiddle

如果您想搜索所有列,只需更改此行

if(j == column && td[j].innerHTML.toLowerCase() == term){

到这个

if(td[j].innerHTML.toLowerCase() == term){

最后,如果您想要更灵活的搜索,请尝试以下版本

document.getElementById('search').onkeyup = function(){
    var table = document.getElementById('table'),
        tr = table.rows, td,
        term = this.value.toLowerCase().trim(), column = 0, i, j,
        message = document.getElementById('message'),
        pattern = new RegExp(term, 'gi');

    for(i = 1; i < tr.length; i++){
        td = tr[i].cells;
        for(j = 0; j < td.length; j++){
            if(j == column && term.length > 0 && td[j].innerHTML.match(pattern)){    
                tr[i].style.display = 'table-row';
                message.innerHTML = '';
                return;
            }else{
                tr[i].style.display = 'none';
                message.innerHTML = 'No results found!';
            }
        }
    }
};

Working jsFiddle

【讨论】:

  • 上面关于display属性的建议是正确的,我把它改成了table-row。正如我之前伤心的那样,在最初的答案中,表格行和列可能被rowscells 集合引用,但它们也可能被getElementsByTagName('TR')getElementsByTagName('TD') 方法引用,这很好。不过,我会同时使用rowscells 添加版本。
  • @User014019 如您所见,我稍微更改了table 标记。我不确定您是否可以在项目中更改它;如果没有,请告诉我我会以不同的方式进行;但假设这是一个正确的table 标记,具有headerbodyfooter。所以,试一试,让我知道是否一切正常。 &lt;th colspan="3"&gt;&lt;/th&gt; 这个3 这里是你的表格列数
  • 这就是我所需要的!谢谢你! +1
  • @User014019 哦,对不起!忘记了 jsFiddle 不会自动更新内容。这是jsFiddle 并更新了答案。
  • @User014019 是的,如果您无法控制(动态)表,第二个可能会更好; tfoot 也不需要额外的 CSS。我要休息一个小时;测试,玩弄代码...如果您需要改进或更改某些内容,请告诉我。正如我所说,与此同时,我将使用rowscells 添加版本。
猜你喜欢
  • 2014-10-21
  • 2014-03-30
  • 1970-01-01
  • 2012-02-25
  • 2011-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-14
相关资源
最近更新 更多