2017-04-25 105 views
0

我用我的页面的w3School代码,它工作正常,但它只过滤一列,不知道如何创建循环,但跳跃有更容易的解决方案。过滤表格多列

td = tr[i].getElementsByTagName("td")[0];  

改变这里0变为1列,可以找到任何东西这么尝试过许多不同的事情,但不是程序员不知道是否有任何其他的特性,可以让多列,花了这么多的搜索,请帮助

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 (i = 0; i < tr.length; i++) { 
 
    td = tr[i].getElementsByTagName("td")[0]; 
 
    if (td) { 
 
     if (td.innerHTML.toUpperCase().indexOf(filter) > -1) { 
 
     tr[i].style.display = ""; 
 
     } else { 
 
     tr[i].style.display = "none"; 
 
     } 
 
    } 
 
    } 
 
}
* { 
 
    box-sizing: border-box; 
 
} 
 

 
#myInput { 
 
    background-image: url('/css/searchicon.png'); 
 
    background-position: 10px 10px; 
 
    background-repeat: no-repeat; 
 
    width: 100%; 
 
    font-size: 16px; 
 
    padding: 12px 20px 12px 40px; 
 
    border: 1px solid #ddd; 
 
    margin-bottom: 12px; 
 
} 
 

 
#myTable { 
 
    border-collapse: collapse; 
 
    width: 100%; 
 
    border: 1px solid #ddd; 
 
    font-size: 18px; 
 
} 
 

 
#myTable th, 
 
#myTable td { 
 
    text-align: left; 
 
    padding: 12px; 
 
} 
 

 
#myTable tr { 
 
    border-bottom: 1px solid #ddd; 
 
} 
 

 
#myTable tr.header, 
 
#myTable tr:hover { 
 
    background-color: #f1f1f1; 
 
}
<h2>My Customers</h2> 
 

 
<input type="text" id="myInput" onkeyup="myFunction()" placeholder="Search    for names.." 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>Germany</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>

+0

请使用除w3school之外的其他资源,这不是特别好(例如[* tables *]的MDN(https://developer.mozilla.org/en-US/docs/Web/API/HTMLTableElement)和[* rows *](https://developer.mozilla.org/en-US/docs/Web/API/HTMLTableElement/rows))。您可以使用'tr [i] .cells [0]'而不是'tr [i] .getElementsByTagName(“td”)[0]''。输入少得多。 ;-)另外,请格式化你的代码,阅读起来越容易,人们就越有可能提供帮助。 – RobG

回答

7

有网络比W3学校上significantly better资源,你真的应该避免网站海事组织。话虽这么说,你只需要看看tr而非td S的一个,如果你想将整行匹配:

function myFunction() { 
    var input = document.getElementById("myInput"); 
    var filter = input.value.toUpperCase(); 
    var table = document.getElementById("myTable"); 
    var tr = table.getElementsByTagName("tr"); 
    for (var i = 0; i < tr.length; i++) { 
     if (tr.textContent.toUpperCase().indexOf(filter) > -1) { 
      tr[i].style.display = ""; 
     } else { 
      tr[i].style.display = "none"; 
     }  
    } 
} 

如果要筛选,而不是整个行多列,只需要使用OR (||)在你的病情:

function myFunction() { 
    var input = document.getElementById("myInput"); 
    var filter = input.value.toUpperCase(); 
    var table = document.getElementById("myTable"); 
    var tr = table.getElementsByTagName("tr"); 
    var tds = tr.getElementsByTagName('td'); 

    for (var i = 0; i < tr.length; i++) { 
     var firstCol = tds[0].textContent.toUpperCase(); 
     var secondCol = tds[1].textContent.toUpperCase(); 
     if (firstCol.indexOf(filter) > -1 || secondCol.indexOf(filter) > -1) { 
      tr[i].style.display = ""; 
     } else { 
      tr[i].style.display = "none"; 
     }  
    } 
} 

一些原因,本教程不是很大:您应该避免使用innerHTML而应使用textContent,因为它可能是你的细胞将有HTML,并且用户可以键入一个标签当试图搜索可见的文本并命名时的名称由什么匹配融合。你应该给你的函数名称指明它们的作用(例如filterTable而不是myFunction)。此外,还有更简单的方法来访问表数据(例如tr.cells)。如果您将keyup事件侦听器添加到#myInput,则每次调用此函数时都不需要查找该DOM节点。这里有一个例子:

function filterTable(event) { 
 
    var filter = event.target.value.toUpperCase(); 
 
    var rows = document.querySelector("#myTable tbody").rows; 
 
    
 
    for (var i = 0; i < rows.length; i++) { 
 
     var firstCol = rows[i].cells[0].textContent.toUpperCase(); 
 
     var secondCol = rows[i].cells[1].textContent.toUpperCase(); 
 
     if (firstCol.indexOf(filter) > -1 || secondCol.indexOf(filter) > -1) { 
 
      rows[i].style.display = ""; 
 
     } else { 
 
      rows[i].style.display = "none"; 
 
     }  
 
    } 
 
} 
 

 
document.querySelector('#myInput').addEventListener('keyup', filterTable, false);
<input id="myInput" type="text" /> 
 
<table id="myTable"> 
 
<thead> 
 
    <tr class="header"> 
 
    <th style="width:60%;">Name</th> 
 
    <th style="width:40%;">Country</th> 
 
    </tr> 
 
</thead> 
 
<tbody> 
 
    <tr> 
 
    <td>Alfreds Futterkiste</td> 
 
    <td>Germany</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>

+0

Rob u the man !!!我花了一些时间来弄清楚你做了什么,但现在它的工作,多亏了一个密尔(最后一个工作) –

+0

值得一票就在第一句话。 ;-) – RobG

0

你只需要添加一个循环来在细胞上,所以:基于可能是你遵循相同的教程

table = document.getElementById("myTable"); 
// tr = table.getElementsByTagName("tr"); 
// Easier to use the rows collection: 
var tr = table.rows; 

for (i = 0; i < tr.length; i++) { 

    // Easier to use the cells collection 
    // td = tr[i].getElementsByTagName("td")[0]; 
    cells = row.cells; 

    // Loop over all the cells 
    for (var j=0, jLen=cells.length; j<jLen; j++) { 
    td = cells[j]; 

    // Existing loop 
    if (td) { 
     if (td.innerHTML.toUpperCase().indexOf(filter) > -1) { 
     tr[i].style.display = ""; 
     } else { 
     tr[i].style.display = "none"; 
     } 
    } 
    } 
} 
+0

仅仅使用整个行的'innerHTML'然后遍历每个单元格会更有意义吗? –

+0

也感谢你RobG –

+0

@RobM。-sure或* textContent *,但我认为循环遍历单元格提供了更好的学习机会。 ;-) – RobG

0

,接受三种不同的文本输入并相应地对所有行进行排序:

function SortByMultiple() { 
 

 
    //Declare needed variables 
 
    var dateInput, nameInput, locationInput, dateFilter, nameFilter, locationFilter, table, tr, tdN, tdD, tdL, i; 
 

 
    //Set inputs by getElementById 
 
    nameInput = document.getElementById('nameInput'); 
 
    dateInput = document.getElementById('dateInput'); 
 
    locationInput = document.getElementById('locationInput'); 
 
    //Set filters 
 
    nameFilter = nameInput.value.toUpperCase(); 
 
    dateFilter = dateInput.value.toUpperCase(); 
 
    locationFilter = locationInput.value.toUpperCase(); 
 
    //Set the table and tr variables 
 
    table = document.getElementById("UL"); 
 
    tr = document.getElementsByTagName("tr"); 
 

 
    //Loop through items and hide those that don't match the query --> 
 
    for (i = 0; i < tr.length; i++) { 
 

 
     //Name is at index 0 
 
     tdN = tr[i].getElementsByTagName("td")[0]; 
 
     //Date is at index 2 
 
     tdD = tr[i].getElementsByTagName("td")[2]; 
 
     //Location is at index 1 
 
     tdL = tr[i].getElementsByTagName("td")[1]; 
 

 
     if (tdN.innerHTML.toUpperCase().indexOf(nameFilter) > -1 && tdD.innerHTML.toUpperCase().indexOf(dateFilter) > -1 && tdL.innerHTML.toUpperCase().indexOf(locationFilter) > -1) { 
 
      tr[i].style.display = ""; 
 
     } 
 
     else { 
 
      tr[i].style.display = "none"; 
 
     } 
 
    } 
 

 
}

通过在AND之后设置条件,它们都将在过滤器中考虑在内!