Demo
我想使用Windows Shift和Ctrl键选择多行,如Windows中的多个文件夹选择.
从所选行的表中,我必须获取第一列(学生ID),并传递给服务器端C#并从数据库中删除这些记录.
我已经在javascript中编写了代码,但是该类名未被应用到< tr>在Shift或Ctrl左键单击.
HTML
<table id="tableStudent" border="1"> <thead> <tr> <th>ID</th> <th>Name</th> <th>Class</th> </tr> </thead> <tbody> <tr onmousedown="RowClick(this,false);"> <td>1</td> <td>John</td> <td>4th</td> </tr> <tr onmousedown="RowClick(this,false);"> <td>2</td> <td>Jack</td> <td>5th</td> </tr> <tr onmousedown="RowClick(this,false);"> <td>3</td> <td>Michel</td> <td>6th</td> </tr> <tr onmousedown="RowClick(this,false);"> <td>4</td> <td>Mike</td> <td>7th</td> </tr> <tr onmousedown="RowClick(this,false);"> <td>5</td> <td>Yke</td> <td>8th</td> </tr> <tr onmousedown="RowClick(this,false);"> <td>6</td> <td>4ke</td> <td>9th</td> </tr> <tr onmousedown="RowClick(this,false);"> <td>7</td> <td>7ke</td> <td>10th</td> </tr> </tbody> </table>
JavaScript的
var selectedrow; function RowClick(currenttr,lock) { var trs =tableStudent.tBodies[0].getElementsByTagName("tr"); var cnt; if(window.event.button==2) { if(currenttr.className=='selected') return false; } alert(trs.length); if (((window.event.shiftKey) && (window.event.ctrlKey) ) ||(window.event.shiftKey)) { for(var j=0; j<trs.length; j++) { if (trs[j].className!='normallock') { trs[j].className='normal'; } } var mark=false; if (typeof(selectedrow)=="undefined") { selectedrow=currenttr; selectedrow.className='selected' return false; } for(var j=0; j<trs.length; j++) { if ((trs[j].id ==selectedrow.id) || (trs[j].id ==currenttr.id) ) { if (trs[j].className!='normallock') { trs[j].className='selected' mark = !(mark); } } else { if(mark==true) { if (trs[j].className!='normallock') trs[j].className='selected' } } } } else if(window.event.ctrlKey) { //if ctrl key is seelcted while selecting the patients // select the patient with currently clicked row plus // maintain the prevIoUs seelcted status cnt=0; for(var j=0; j<trs.length; j++) { if(trs[j].id == currenttr.id) { if(trs[j].className=='selected') { trs[j].className='normal'; }else { trs[j].className='selected'; } } if(trs[j].className=='selected') { cnt++; } } if(cnt==0) { selectedrow=undefined; return false; } } else { for(var j=0; j<trs.length; j++) { if(trs[j].id == currenttr.id) { trs[j].className='selected' } else { if (trs[j].className!='normallock') trs[j].className='normal'; } } } selectedrow=currenttr; }
解决方法
这可能不是你想要的所有功能,因为问题有点模糊,但他试图添加Ctrl或Shift鼠标左键来选择或取消选择多个表行 –
see demo和下面的代码.免责声明:只有在Chrome和代码测试中,几乎可以肯定地进行优化.
JavaScript的
var lastSelectedRow; var trs = document.getElementById('tableStudent').tBodies[0].getElementsByTagName('tr'); // disable text selection document.onselectstart = function() { return false; } function RowClick(currenttr,lock) { if (window.event.ctrlKey) { toggleRow(currenttr); } if (window.event.button === 0) { if (!window.event.ctrlKey && !window.event.shiftKey) { clearAll(); toggleRow(currenttr); } if (window.event.shiftKey) { selectRowsBetweenIndexes([lastSelectedRow.rowIndex,currenttr.rowIndex]) } } } function toggleRow(row) { row.className = row.className == 'selected' ? '' : 'selected'; lastSelectedRow = row; } function selectRowsBetweenIndexes(indexes) { indexes.sort(function(a,b) { return a - b; }); for (var i = indexes[0]; i <= indexes[1]; i++) { trs[i-1].className = 'selected'; } } function clearAll() { for (var i = 0; i < trs.length; i++) { trs[i].className = ''; } }
HTML
<table id="tableStudent" border="1"> <thead> <tr> <th>ID</th> <th>Name</th> <th>Class</th> </tr> </thead> <tbody> <tr onmousedown="RowClick(this,false);"> <td>7</td> <td>7ke</td> <td>10th</td> </tr> </tbody> </table>
CSS
.selected { background: lightBlue }
我也将看看addEventListener vs onclick,并将事件处理程序绑定到HTML之外并转换为JavaScript.这被称为Unobtrusive Javascript.
您可能想要阅读的资源:
> Retrieve Table Row Index of Current Row
> disable text selection while pressing ‘shift’
> https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort