javascript - 如何突出显示和选择多行?
问题描述
我希望能够执行与 Excel 类似的操作,用户可以突出显示并选择多行:
[ ]
这是一个示例,用户可以单击该行并选择该行。但我希望将类似于 Excel 的绿色轮廓应用于我的 Bootstrap 表。理想情况下,将有一个选项可以更改光标以突出显示和选择行。
$("#table tr").click(function(){
$(this).toggleClass('selected');
var value=$(this).find('td:first').html();
alert(value);
});
$('.ok').on('click', function(e){
var selected = [];
$("#table tr.selected").each(function(){
selected.push($('td:first', this).html());
});
alert(selected);
});
td {border: 1px #DDD solid; padding: 5px; cursor: pointer;}
.selected {
background-color: brown;
color: #FFF;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.0/dist/css/bootstrap.min.css" integrity="sha384-B0vP5xmATw1+K9KRQjQERJvTumQW0nPEzvF6L/Z6nronJ3oUOFUFpCjEUQouq2+l" crossorigin="anonymous">
<table id="table">
<tr>
<td>1 Ferrari F138</td>
<td>1 000€</td>
<td>1 200€</td>
<td>Model monopostu stajne Scuderia Ferrari pre sezónu 2013</td>
<td>1</td>
<td>F138</td>
<td>Klik pre detaily</td>
</tr>
<tr>
<td>2 Ferrari F138</td>
<td>1 000€</td>
<td>1 200€</td>
<td>Model monopostu stajne Scuderia Ferrari pre sezónu 2013</td>
<td>1</td>
<td>F138</td>
<td>Klik pre detaily</td>
</tr>
<tr>
<td>3 Ferrari F138</td>
<td>1 000€</td>
<td>1 200€</td>
<td>Model monopostu stajne Scuderia Ferrari pre sezónu 2013</td>
<td>1</td>
<td>F138</td>
<td>Klik pre detaily</td>
</tr>
</table>
<input type="button" name="OK" class="ok" value="OK"/>
解决方案
dragstart
您将不得不dragend
在<table>
.
您可以在拖动开始和结束时捕获单元格索引,计算增量,设置范围选择,最后显示选择。
var isDragging = false;
var start, end;
var lastKnownCell;
var $table = $('#table');
function getCellByCoords(coords) {
return $table.find('tr').eq(coords.row).find('td').eq(coords.col);
}
function getCellCoords(cell) {
return { row: $(cell).parent().index(), col: $(cell).index() };
}
function clearHighlight() {
$table.find('td').removeClass('highlighted');
}
function getMin() {
return {
row: Math.min(start.row, end.row),
col: Math.min(start.col, end.col)
}
}
function getMax() {
return {
row: Math.max(start.row, end.row),
col: Math.max(start.col, end.col)
}
}
function iterateActive(callback) {
var min = getMin(), max = getMax();
for (var row = min.row; row < max.row + 1; row++) {
for (var col = min.col; col < max.col + 1; col++) {
var cell = getCellByCoords({ row: row, col: col });
callback($(cell), row, col);
}
}
}
function selectCells() {
iterateActive(function($cell, row, col) {
$cell.toggleClass('selected');
});
}
function highlightCells() {
iterateActive(function($cell, row, col) {
$cell.addClass('highlighted');
});
}
function onStartDrag(e) {
start = getCellCoords(e.target);
isDragging = true;
}
function onStopDrag(e) {
end = getCellCoords(e.target);
isDragging = false;
selectCells();
clearHighlight();
}
function onDrag(e) {
if (isDragging && e.target.tagName === 'TD' && e.target !== lastKnownCell) {
lastKnownCell = e.target;
end = getCellCoords(e.target);
clearHighlight();
highlightCells();
}
}
function displaySelection() {
var text = $table.find('tr').map(function() {
return $(this).find('td').map(function() {
return $(this).hasClass('selected') ? $(this).text() : '';
}).toArray().join('\t').trim();
}).toArray().filter(function(row) {
return row.length > 0;
}).join('\n');
console.log(text);
}
$table.on({
mousedown: onStartDrag,
mouseup: onStopDrag,
mousemove: onDrag
});
$('.ok').on('click', displaySelection);
.as-console-wrapper { max-height: 3em !important; }
table {
border-collapse: collapse;
font-size: smaller;
}
tr {
-webkit-touch-callout: none;
-webkit-user-select: none;
-khtml-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
td {
border: 1px #DDD solid;
padding: 5px;
cursor: pointer;
}
.selected {
background-color: brown;
color: #FFF;
}
.highlighted {
background-color: lightblue;
color: #000;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<table id="table">
<tr>
<td>1 Ferrari F138</td>
<td>1 000€</td>
<td>1 200€</td>
<td>Model monopostu stajne Scuderia Ferrari pre sezónu 2013</td>
<td>1</td>
<td>F138</td>
<td>Klik pre detaily</td>
</tr>
<tr>
<td>2 Ferrari F138</td>
<td>1 000€</td>
<td>1 200€</td>
<td>Model monopostu stajne Scuderia Ferrari pre sezónu 2013</td>
<td>1</td>
<td>F138</td>
<td>Klik pre detaily</td>
</tr>
<tr>
<td>3 Ferrari F138</td>
<td>1 000€</td>
<td>1 200€</td>
<td>Model monopostu stajne Scuderia Ferrari pre sezónu 2013</td>
<td>1</td>
<td>F138</td>
<td>Klik pre detaily</td>
</tr>
</table>
<input type="button" name="OK" class="ok" value="OK" />
推荐阅读
- python - 在python中,'import foo.bar as bar'和'from foo import bar'有什么区别?
- javascript - 从 Javascript 中删除文件和值
- javascript - React/TypeScript:我应该如何处理这种组件组合方式?
- bash - shell中的重定向警告不是错误或输出
- rtf - 想要在 10 次迭代后结束 RTF 模板 BI Publisher 中的 for 循环
- javascript - 有没有办法在单个 spa 项目中加载微型应用程序之前显示加载器
- javascript - iOS13.4.1 - XMLHTTPRequest 无法在 beforeunload / unload 事件处理程序中加载错误
- reactjs - 如何将 React 中的参数从函数传递到类
- reactjs - React:一旦状态更新,如何在数据表扩展中呈现数组?
- pygame - Pygame - 在小行星游戏中创建多个小行星物体时遇到问题