#javascript #jquery #html #drag-and-drop
#javascript #jquery #HTML #перетаскивание
Вопрос:
Я хочу разрешить пользователю изменять порядок столбцов в таблице, перетаскивая их. Я использую jquery.dragtable.js чтобы разрешить перетаскивание. Все работает нормально. Теперь я хочу сохранить порядок таблиц после перетаскивания на стороне клиента и восстановить состояние onload.
Вот мой HTML-код:
<table id="tblReg" class="table table-bordered">
<thead>
<tr>
<th>#</th>
<th>First Name</th>
<th>Last Name</th>
<th>Username</th>
<th>Password</th>
<th>Email</th>
<th>Phone</th>
</tr>
</thead>
<tbody>
<tr>
<th>1</th>
<td>Mark</td>
<td>Otto</td>
<td>@mdo</td>
<td>545trt574</td>
<td>Na@email.com</td>
<td>7788994320</td>
</tr>
<tr>
<th>2</th>
<td>Jacob</td>
<td>Thornton</td>
<td>@fat</td>
<td>yffft5456</td>
<td>Na@email.com</td>
<td>7788994320</td>
</tr>
<tr>
<th>3</th>
<td>Larry</td>
<td>the Bird</td>
<td>@twitter</td>
<td>fgfhgf444</td>
<td>Na@email.com</td>
<td>7788994320</td>
</tr>
<tr>
<th>4</th>
<td>Rima</td>
<td>the Bird</td>
<td>@twitter</td>
<td>jjk8899</td>
<td>Na@email.com</td>
<td>7788994320</td>
</tr>
<tr>
<th>5</th>
<td>Sundar</td>
<td>the Bird</td>
<td>@twitter</td>
<td>76767687hjh</td>
<td>Na@email.com</td>
<td>7788994320</td>
</tr>
</tbody>
</table>
<a href="#" class="order">Get Table Order</a>
<p class="porder"></p>
Jquery:
$(document).ready(function(){
$('#tblReg').each(function(){
$(this).dragtable({
placeholder: 'dragtable-col-placeholder',
items: 'thead th:not( .notdraggable ):not( :has( .dragtable-drag-handle ) ), .dragtable-drag-handle',
appendTarget: $(this).parent(),
scroll: true
});
});
$('a.order').click(function(){
console.log($('#tblReg').dragtable('order'));
var curOrder = $('#tblReg').dragtable('order');
$('.porder').text(curOrder);
return false;
});
});
Ссылка на плагин:https://github.com/akottr/dragtable
Разрешить предоставлять получает порядок таблиц следующим образом:
["#", "First Name", "Last Name", "Username", "Password", "Email", "Phone"]
Теперь я хочу сохранить это на стороне клиента (localStorage / Cookies) и изменить порядок загрузки в соответствии с сохраненными данными.
Как это сделать? Я новичок в jquery.
Ответ №1:
Попробуйте этот код, он работает нормально.
Порядок столбцов устанавливается в sessionStorage после перетаскивания, а затем обновите страницу. Вы увидите изменение порядка столбцов.
Упорядочивание записей в формате массива вы можете увидеть в консоли:
<!DOCTYPE html>
<html>
<head>
<title>Reorder</title>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
<link rel="stylesheet" type="text/css" href="//rawgithub.com/akottr/dragtable/master/dragtable.css" />
</head>
<body>
<div class="container-fluid">
<div class="row">
<div class="col-sm-12">
<table id="tblReg" class="table table-bordered">
<thead>
<tr class="active">
<th id="number">#</th>
<th id="fname">First Name</th>
<th id="lname">Last Name</th>
<th id="uname">Username</th>
<th id="pass">Password</th>
<th id="email">Email</th>
<th id="phone">Phone</th>
</tr>
</thead>
<tbody>
<tr>
<th>1</th>
<td>Mark</td>
<td>Otto</td>
<td>@mdo</td>
<td>545trt574</td>
<td>Na@email.com</td>
<td>7788994320</td>
</tr>
<tr>
<th>2</th>
<td>Jacob</td>
<td>Thornton</td>
<td>@fat</td>
<td>yffft5456</td>
<td>Na@email.com</td>
<td>7788994320</td>
</tr>
<tr>
<th>3</th>
<td>Larry</td>
<td>the Bird</td>
<td>@twitter</td>
<td>fgfhgf444</td>
<td>Na@email.com</td>
<td>7788994320</td>
</tr>
<tr>
<th>4</th>
<td>Rima</td>
<td>the Bird</td>
<td>@twitter</td>
<td>jjk8899</td>
<td>Na@email.com</td>
<td>7788994320</td>
</tr>
<tr>
<th>5</th>
<td>Sundar</td>
<td>the Bird</td>
<td>@twitter</td>
<td>76767687hjh</td>
<td>Na@email.com</td>
<td>7788994320</td>
</tr>
</tbody>
</table>
</div>
</div>
<div class="row">
<div class="col-sm-12">
<a href="#" class="btn btn-info order">Get Table Order</a>
<p class="porder"></p>
</div>
</div>
</div>
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<script src="//ajax.googleapis.com/ajax/libs/jqueryui/1.10.2/jquery-ui.min.js"></script>
<script src="//rawgithub.com/akottr/dragtable/master/jquery.dragtable.js"></script>
<script type="text/javascript">
$(document).ready(function(){
// this code for sessionStorage
$('#tblReg').dragtable({
persistState: function(table) {
if (!window.sessionStorage) return;
var ss = window.sessionStorage;
table.el.find('th').each(function(i) {
if(this.id != '') {table.sortOrder[this.id]=i;}
});
ss.setItem('tableorder', JSON.stringify(table.sortOrder));
},
restoreState: eval('(' window.sessionStorage.getItem('tableorder') ')')
});
// this code for each th drag and drop
$('#tblReg').each(function(){
$(this).dragtable({
placeholder: 'dragtable-col-placeholder',
items: 'thead th:not(.notdraggable):not(:has(.dragtable-drag-handle)), .dragtable-drag-handle',
appendTarget: $(this).parent(),
scroll: true
});
});
// Click and then you see ordering of (th) in console.
$('a.order').click(function(e){
e.preventDefault();
var order_array = [];
$('#tblReg').dragtable().find('thead th').each(function(i,v){
order_array.push($(v).text());
});
console.log(order_array);
$('.porder').text(order_array);
});
});
</script>
</body>
</html>
Комментарии:
1. но после обновления страницы порядок таблиц не меняется в соответствии с консольным массивом
2. и я хочу использовать localStorage вместо sessionStorage @ Raeesh
3. Массив консоли изменится после нажатия кнопки «Получить порядок в таблице». И я пытаюсь решить с помощью localStorage @sandy
Ответ №2:
Попробуйте этот код для сохранения порядка столбцов в localStorage.
//For localstorage
$('#tblReg').dragtable({
persistState: function(table) {
if (!window.localStorage) return;
var ss = window.localStorage;
table.el.find('th').each(function(i) {
if(this.id != '') {table.sortOrder[this.id]=i;}
});
ss.setItem('tableorder', JSON.stringify(table.sortOrder));
$('a.order').trigger('click');//When drop the column then button will trigger
},
restoreState: eval('(' window.localStorage.getItem('tableorder') ')')
});
Комментарии:
1. Здесь вы также используете <th> ID и активный класс для <tr>, но добавлять <th> ID не нужно, потому что моя таблица генерируется динамически.
2. Он отлично работает с <td> id. но моя таблица генерируется динамически, поэтому мне нужно без td id @Raeesh
3. Спасибо @sandy. Из-за необходимости уникальной идентификации в localStorage для установки и получения записей. Звучит неплохо для ваших нужд, я пытаюсь решить это без <th> id после достижения, опубликую здесь…
4. Привет, Раиш, я создал код для генерации динамического идентификатора, и он работает нормально. Но когда я добавляю одну или несколько таблиц, это не работает.
5. Привет @JargoViet. Хорошо, если вы хотите, чтобы несколько таблиц сохраняли порядок в localStorage, поэтому вам понадобятся разные идентификатор таблицы и th id , а также другое имя setItem и после инициализируйте эти идентификаторы в коде JavaScript . Спасибо
Ответ №3:
Я закончил! Пожалуйста, проверьте, нет ли ошибки.
$(document).ready(function(){
//localStorage.clear();
var tblReg = $('#tblReg').attr('id');
var tblRegMaster = $('#tblRegMaster').attr('id');
processDnD(tblReg);
processDnD(tblRegMaster);
});
function processDnD(cuTable){
var tblName = cuTable;
$('#' cuTable).find('th').each(function() {
var ctxt = $(this).text();
if(ctxt == 'First Name'){
$(this).attr('id','firstName-' tblName);
}else if(ctxt == 'Password'){
$(this).attr('id','password' tblName);
}else if(ctxt == 'Email'){
$(this).attr('id','iemail' tblName);
}else if(ctxt == 'Username'){
$(this).attr('id','userName' tblName);
}else if(ctxt == 'Last Name'){
$(this).attr('id','lastName' tblName);
}else if(ctxt == '#'){
$(this).attr('id','slNo' tblName);
}else if(ctxt == 'Phone'){
$(this).attr('id','phone' tblName);
}else if(ctxt == 'PO Number'){
$(this).attr('id','pono' tblName);
}else if(ctxt == 'Shipper'){
$(this).attr('id','shipperName' tblName);
}else if(ctxt == 'Status'){
$(this).attr('id','cuStatus' tblName);
}else if(ctxt == 'Booking Line'){
$(this).attr('id','BookingLine' tblName);
}else if(ctxt == 'Access Mode'){
$(this).attr('id','AccessMode' tblName);
}else if(ctxt == 'Container No'){
$(this).attr('id','ContainerNo' tblName);
}
})
$('#' cuTable).dragtable({
persistState: function(table) {
if (!window.localStorage) return;
var ss = window.localStorage;
table.el.find('th').each(function(i) {
if(this.id != '') {table.sortOrder[this.id]=i;}
});
ss.setItem('setTableOrder-' tblName, JSON.stringify(table.sortOrder));
},
restoreState: eval('(' window.localStorage.getItem('setTableOrder-' tblName) ')')
});
$('#' cuTable).each(function(){
$(this).dragtable({
placeholder: 'dragtable-col-placeholder',
items: 'thead th:not(.notdraggable):not(:has(.dragtable-drag-handle)), .dragtable-drag-handle',
appendTarget: $(this).parent(),
scroll: true
})
});
}