我有一個帶有輸入欄位的資料表。當使用者輸入到一個欄位時,我需要找到他們輸入的行號。我之前問過一個問題,並得到了一個很好的答案,但是如果數據表是響應式的,並且字段在子彈出窗口中,答案就不再起作用了。
這是我的程式碼:
function drawInput(data, type, row, meta) { return '<input id="r' + meta.row + 'c' + meta.col + '" val="' + data + '"></input>'; } var data = [{ c1: 'r1c1', c2: 'r1c2', c3: 'r1c3' }, { c1: 'r2c1', c2: 'r2c2', c3: 'r2c3' }]; $(function() { var table = $('table').dataTable({ info: false, searching: false, ordering: false, paging: false, columns: [{ defaultContent: '<span></span>' }, { data: 'c1', name: 'c1', defaultContent: '<input></input>', render: drawInput }, { data: 'c2', name: 'c2', defaultContent: '<input></input>', render: drawInput }, { data: 'c3', name: 'c3', defaultContent: '<input></input>', render: drawInput } ] }); table.api().rows.add(data); table.api().draw(); $('body').on('change', 'table :input', function(e) { // 找到包含输入字段的行 //console.log(this); var row = table.api().row($(this).closest('td')); // 显示行索引 - 结果为undefined!为什么? console.log(row.index()); }); });
<link href="https://cdn.datatables.net/1.13.6/css/jquery.dataTables.min.css" rel="stylesheet" type="text/css" /> <link href="https://cdn.datatables.net/responsive/2.5.0/css/responsive.dataTables.min.css" rel="stylesheet" type="text/css" /> <script src="https://code.jquery.com/jquery-3.7.0.min.js"></script> <script src="https://cdn.datatables.net/1.13.6/js/jquery.dataTables.min.js"></script> <script src="https://cdn.datatables.net/responsive/2.5.0/js/dataTables.responsive.min.js"></script> <div style='width:150px;'> <table width="100%" class="responsive"> <thead> <tr> <th></th> <th>Col 1</th> <th>Col 2</th> <th>Col 3</th> </tr> </thead> <tbody> </table> </div>
如果你在一個足夠大的視窗中運行這個程式碼,它就可以正常工作。但是如果你縮小窗口,使得右邊的列響應式地下降到子行中,找到行索引的程式碼就不再起作用了。
如何正確找到子單元格的行?
P粉7225212042023-09-13 15:55:25
當.row($(this).closest("td")).index()
未定義時,使用table.api().row(this).index( )
。
奇怪的是,table.api().row(this)
只適用於展開的行,而不是原始行,所以需要繼續使用.closest("td")來取得原始行。
具體來說,table.api().row(...)
將傳回一個jQuery對象,因此要檢查是否回傳了任何行,請檢查.length === 0
。
給出:
let row = table.api().row($(this).closest("td")) if (row.length === 0) row = table.api().row(this);
然後.index()
將給出預期的行索引。
更新的程式碼片段:
function drawInput(data, type, row, meta) {
return '<input id="r' + meta.row + 'c' + meta.col + '" val="' + data + '"></input>';
}
var data = [{
c1: 'r1c1',
c2: 'r1c2',
c3: 'r1c3'
}, {
c1: 'r2c1',
c2: 'r2c2',
c3: 'r2c3'
}];
$(function() {
var table = $('table').dataTable({
info: false,
searching: false,
ordering: false,
paging: false,
columns: [{
defaultContent: '<span></span>'
},
{
data: 'c1',
name: 'c1',
defaultContent: '<input></input>',
render: drawInput
},
{
data: 'c2',
name: 'c2',
defaultContent: '<input></input>',
render: drawInput
},
{
data: 'c3',
name: 'c3',
defaultContent: '<input></input>',
render: drawInput
}
]
});
table.api().rows.add(data);
table.api().draw();
$('body').on('change', 'table :input', function(e) {
// Find the row that contains the input field
console.log(this.id, this.name, table.api().row($(this).closest("td")).index(), table.api().row(this).index());
var row = table.api().row($(this).closest("td"))
if (row.length === 0) row = table.api().row(this);
// Show the row index - result is undefined! Why?
console.log(row.index());
});
});
<link href="https://cdn.datatables.net/1.13.6/css/jquery.dataTables.min.css" rel="stylesheet" type="text/css" />
<link href="https://cdn.datatables.net/responsive/2.5.0/css/responsive.dataTables.min.css" rel="stylesheet" type="text/css" />
<script src="https://code.jquery.com/jquery-3.7.0.min.js"></script>
<script src="https://cdn.datatables.net/1.13.6/js/jquery.dataTables.min.js"></script>
<script src="https://cdn.datatables.net/responsive/2.5.0/js/dataTables.responsive.min.js"></script>
<div style='width:150px;'>
<table width="100%" class="responsive">
<thead>
<tr>
<th></th>
<th>Col 1</th>
<th>Col 2</th>
<th>Col 3</th>
</tr>
</thead>
<tbody>
</table>
</div>