小さなテーブル(12行)にjQueryDatatablesプラグインを使用しています。一部の_<input type="text" ...
_フィールドでは編集が可能です。入力フィールドがフォーカスを失ったとき、その値を検証し、場合によってはフィールド値を変更する必要があります。後で.draw()
を発行せずに、変更された入力フィールド値をDataTablesで認識できるようにすることはできませんでしたが、これにより、テーブルがテーブルの一番上にスクロールします。
.draw()を発行した後、現在のスクロール位置を維持する方法はありますか?
_$('#mytable').on('blur', 'input', function (e) {
var inputFieldId = this.id;
var inputFieldVal = $(this).val();
{ ... perform validation of field value ... }
$('#mytable').DataTable().rows().invalidate().draw();
});
_
[〜#〜]編集[〜#〜]
誰かが私と同じことをしようとしているのを見ました、そして彼らは次のコードが彼らのために働いたことを示しました。これは私が必要なことを達成するための非常に簡単な方法のように思えますが、私は常にscrollTop = 0を自分で取得しています。現在選択されている行の行インデックスを取得する方法を知っている人はいますか?
_var scrollPos = $(".dataTables_scrollBody").scrollTop();
$('#mytable').DataTable().rows().invalidate().draw(false);
$(".dataTables_scrollBody").scrollTop(scrollPos);
_
私はあなたがそれをすることができるとは思いません、しかしあなたは代わりにコールバック関数を使うことができます:
$(document).ready(function() {
var selected = [];
$("#example").dataTable({
"processing": true,
"serverSide": true,
"ajax": "scripts/ids-arrays.php",
"rowCallback": function( row, data ) {
if ( $.inArray(data.DT_RowId, selected) !== -1 ) {
$(row).addClass('selected');
}
}
});
$('#example tbody').on('click', 'tr', function () {
var id = this.id;
var index = $.inArray(id, selected);
if ( index === -1 ) {
selected.Push( id );
} else {
selected.splice( index, 1 );
}
$(this).toggleClass('selected');
} );
} );
参照: https://datatables.net/examples/server_side/select_rows.html
var table = $('table#example').DataTable({
"preDrawCallback": function (settings) {
pageScrollPos = $('div.dataTables_scrollBody').scrollTop();
},
"drawCallback": function (settings) {
$('div.dataTables_scrollBody').scrollTop(pageScrollPos);
}});
これは私にとってはうまくいくようです。テーブルが描かれた後、私はdiv.dataTables_scrollBody
を見つけなければなりませんでした。
少し異なるシナリオですが、これをここに追加したかっただけです。これは私の場合はうまくいき、答えを探してここに到着する他の人にも役立つでしょう。
サーバー側の処理を使用しており、table.ajax.reload()
を使用して10秒ごとにテーブルデータの更新を行っています。この関数は、現在のページング値を維持するための引数を受け入れますが、スクロール位置を維持できません。解決策は、OPが言及したものと非常に似ており、コールバックのスクロール位置を設定します。なぜそれがうまくいかなかったのかわかりませんが、これが私が成功して使用している間隔コードです:
setInterval( function () {
scrollPos = $(".dataTables_scrollBody").scrollTop();
myTable.ajax.reload(function() {
$(".dataTables_scrollBody").scrollTop(scrollPos);
},false);
}, 10000 );
描画関数にpage
パラメータを渡すと、テーブルはスクロール時にシフトしませんが、.DataTable
ソースから再読み取りされます。例えば。 DataTableを更新するデータを「保存」した後:
$("your-selector").DataTable().row(t_itemid).invalidate();
$("your-selector").DataTable().row(t_itemid).draw('page');
注:DataTableのインスタンス化でid
列を使用しているため、単一の行を直接操作するのが簡単です。しかし、page
パラメーターは望ましい結果をもたらすと思います。
DataTables 1.10で解決した方法は、 preDrawCallBack を使用してScrollTopの位置を保存してから、 DrawCallback を使用して設定することです。
var pageScrollPos = 0;
var table = $('#example').DataTable({
"preDrawCallback": function (settings) {
pageScrollPos = $('body').scrollTop();
},
"drawCallback": function (settings) {
$('body').scrollTop(pageScrollPos);
}
});
次のコードは、Datatablesサーバー側のリロード時にスクロール位置を保持します。
var table = $('#mytable').DataTable();
var start_row = table.scroller.page()['start'];
table.ajax.reload(function () {
table.scroller().scrollToRow(start_row, false);
}, false);
このハックはどうですか? scrollTop()
は含まれません。最初にjquery.dataTables.jsを開き、この行を探して削除します。
divBodyEl.scrollTop = 0
その後、draw()/ clear()呼び出しの前に次のコードを配置します。
var $tbl=$('#my_table_id');
if (!document.getElementById('twrapper')) $tbl.wrap( '<div id="twrapper" style="display:block; height:'+$tbl.height()+'px;"></div>' );
else $('#twrapper').css('height',$tbl.height()+'px');
これを理解するのに少し時間がかかりました。