Saya mempunyai jadual data dengan medan input. Apabila pengguna memasuki medan, saya perlu mencari nombor baris yang mereka masukkan. Saya bertanya soalan sebelum ini dan mendapat jawapan yang baik, tetapi jika jadual data responsif dan medan berada dalam pop timbul, jawapan itu tidak lagi berfungsi.
Ini kod saya:
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')); // 顯示行索引 - 結(jié)果為undefined!為什么? console.log(row.index()); }); });
<link rel="stylesheet" type="text/css" /> <link 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>
Jika anda menjalankan kod ini dalam tetingkap yang cukup besar, ia akan berfungsi dengan baik. Tetapi jika anda mengecilkan tetingkap supaya lajur kanan turun secara responsif ke dalam sub-baris, kod untuk mencari indeks baris tidak lagi berfungsi.
Bagaimana untuk mencari barisan sel kanak-kanak dengan betul?
Dang.row($(this).closest("td")).index()
未定義時(shí),使用table.api().row(this).index()
.
Cukup aneh, table.api().row(this)
hanya berfungsi pada baris yang dikembangkan, bukan baris asal, jadi anda perlu terus menggunakan .closest("td") untuk mendapatkan baris asal.
Secara khusus, table.api().row(...)
將返回一個(gè)jQuery對(duì)象,因此要檢查是否返回了任何行,請(qǐng)檢查.length === 0
.
Diberi:
let row = table.api().row($(this).closest("td")) if (row.length === 0) row = table.api().row(this);
Kemudian .index()
akan memberikan indeks baris yang dijangkakan.
Coretan kod yang dikemas kini:
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 rel="stylesheet" type="text/css" />
<link 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>