JQueryUI 可排序的 thead 和 tbody 在拖动隐藏两个字段的行时缩小
JQueryUI sortable thead and tbody shrinked while dragging row with two fields hidden
我有一个包含不同行和字段的 table。在一行中,我有两个带有 display:none;
的字段,当我拖动这些行时,在 <tbody>
和 <thead>
中会产生类似横向填充的效果,table 没有缩小,table 的元素是。
在下一个 JsFiddle 中,第一行无法正常工作,但在第二行中只有一个字段 display:none;
可以正常工作。
有问题尽管问。
错误示例
Table 拖动时:
起初我认为可以通过查找具有 class .hidden-td
的 <td>
元素的数量来解决(class 具有 display: none;
) 并查找具有 class .placeholder-style
的元素(是 class 具有在执行拖动时生成的 <tr>
)并添加许多 <td>
因为我正在移动的 <tr>
中有,但没有,不起作用。
我知道有多少字段.hidden-td
与这一行
var numcells = $('.hidden-td').length;
问题
第一行有 9 个元素,另一行有 8 个元素。在我的函数中 start()
我只在占位符中隐藏了一列,所以当我拖动第一行时,只有一列没有应用 class .hidden-td
,这就是为什么在列的末尾有一个 space。
我该如何解决这个问题?
创建 placeholder 时,它只获取行中的单元格数并用这些单元格创建一个空行。
您正在将 class hidden-td
添加到第 n 个 child 2,因此您隐藏了一个单元格。这适用于第 2 行及以上行,但不适用于第一行,因为该行中还有一个单元格。请参阅第 2 行的 placeholder:
<td colspan="1"> </td><td colspan="1" class="hidden-td"> </td><td colspan="1"> </td><td colspan="1"> </td><td colspan="1"> </td><td colspan="1"> </td><td colspan="1"> </td><td colspan="1"> </td>
第一行:
<td colspan="1"> </td><td colspan="1" class="hidden-td"> </td><td colspan="1"> </td><td colspan="1"> </td><td colspan="1"> </td><td colspan="1"> </td><td colspan="1"> </td><td colspan="1"> </td><td colspan="1"> </td>
您可以做的是隐藏占位符中的每个单元格并仅显示您需要的数字。这可以用 CSS 来完成,像这样:
.placeholder-style td {
display: none;
}
.placeholder-style td:nth-child(-n+7) {
display: table-cell;
}
您可以尝试下面代码段中的方法。
$("#tabs").tabs();
$("#tbodyproject").sortable({
items: "> tr",
appendTo: "parent",
helper: "clone",
placeholder: "placeholder-style",
start: function(event, ui) {
ui.helper.css('display', 'table');
// console.log(ui.placeholder.html())
},
stop: function(event, ui) {
ui.item.css('display', '')
},
update: function( event, ui ) {
let newOrder = $(this).sortable('toArray');
$.ajax({
type: "POST",
url:'/admin/projects/updateOrder',
data: {ids: newOrder}
})
.done(function( msg ) {
location.reload();
});
}
}).disableSelection();
img {
width: 100px;
}
.hidden-td{
display:none;
}
.table{
background-color:green;
border:0;
width:100%;
}
.trdrag{
background-color:yellow;
}
.trdrag.ui-sortable-handle td.tdslug, .trdrag.ui-sortable-handle td.tdslug img{
text-align:center;
align-items:center;
display: table-cell;
justify-content: center;
}
.trdrag.ui-sortable-handle td.tdslug{
white-space:normal;
word-wrap: break-word;
}
.trdrag.ui-sortable-handle td.tdslug img{
padding-left:1rem;
}
.trdrag.ui-sortable-handle {
text-align:center;
align-items:center;
display: table-row;
justify-content: center;
width:100%;
margin-left: .3rem;
}
.thcenter{
background-color:grey !important;
}
.ui-sortable-helper {
left:0px!important;
}
.idrow{
width:5%;
}
.tdvisible{
width:5%;
}
.tdslug{
width:10%;
}
.tdimg{
width:15%;
}
.tdorder{
width:20%;
}
.tdacciones{
width:40%;
}
.placeholder-style td {
display: none;
}
.placeholder-style td:nth-child(-n+7) {
display: table-cell;
}
<link href="https://code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css" rel="stylesheet"/>
<script
src="https://code.jquery.com/jquery-3.2.1.min.js"
integrity="sha256-hwg4gsxgFZhOsEEamdOYGBf13FyQuiTwlAQgxVSNgt4="
crossorigin="anonymous"></script>
<script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>
<div id="tabs">
<div class="col-md-12">
<div id="table1">
<table class="table">
<thead>
<tr>
<th class="thcenter">ID</th>
<th class="thcenter">Visible</th>
<th class="thcenter">Nombre</th>
<th class="thcenter">Header</th>
<th class="thcenter">Home</th>
<th class="thcenter">Orden</th>
<th class="thcenter"><span class="glyphicon glyphicon-cog"></span>Acciones</th>
</tr>
</thead>
<tbody id="tbodyproject">
<tr id="id1" class="trdrag">
<td class="idrow tdcenter"><p id="margindata">1</p></td>
<td class="hidden-td" style="display:none;">Testing</td>
<td class="hidden-td" style="display:none;">Testing2</td>
<td class="tdcenter tdvisible">
Yes
</td>
<td class="tdslug"><p id="margindata">Slug</p></td>
<td class="tdimg"><img src="http://via.placeholder.com/350x150" class="sizeheader"></td>
<td class="tdimg"><img src="http://via.placeholder.com/350x150" class="sizehome"></td>
<td class="tdcenter tdorder"><p id="margindata">Order 1</p></td>
<td class="tdacciones">
<form method="POST" action="{{route('admin.projects.destroy',$project->id)}}" onsubmit="return ConfirmarBorrar()">
<a href="#" class="btn btn-success btn-sm" id="margindata">Edit</a>
<input type="submit" value="Delete" class="btn btn-danger btn-sm" id="margindata">
<input type="hidden" name="_token" value="Token 1">Delete
</form>
</td>
</tr>
<tr id="id1" class="trdrag">
<td class="idrow tdcenter"><p id="margindata">2</p></td>
<td style="display:none;">Testing</td>
<td class="tdcenter tdvisible">
Yes
</td>
<td class="tdslug"><p id="margindata">Slug</p></td>
<td class="tdimg"><img src="http://via.placeholder.com/350x150" class="sizeheader"></td>
<td class="tdimg"><img src="http://via.placeholder.com/350x150" class="sizehome"></td>
<td class="tdcenter tdorder"><p id="margindata">Order 1</p></td>
<td class="tdacciones">
<form method="POST" action="{{route('admin.projects.destroy',$project->id)}}" onsubmit="return ConfirmarBorrar()">
<a href="#" class="btn btn-success btn-sm" id="margindata">Edit</a>
<input type="submit" value="Delete" class="btn btn-danger btn-sm" id="margindata">
<input type="hidden" name="_token" value="Token 1">Delete
</form>
</td>
</tr>
<tr id="id1" class="trdrag">
<td class="idrow tdcenter"><p id="margindata">3</p></td>
<td style="display:none;">Testing</td>
<td class="tdcenter tdvisible">
Yes
</td>
<td class="tdslug"><p id="margindata">Slug</p></td>
<td class="tdimg"><img src="http://via.placeholder.com/350x150" class="sizeheader"></td>
<td class="tdimg"><img src="http://via.placeholder.com/350x150" class="sizehome"></td>
<td class="tdcenter tdorder"><p id="margindata">Order 1</p></td>
<td class="tdacciones">
<form method="POST" action="{{route('admin.projects.destroy',$project->id)}}" onsubmit="return ConfirmarBorrar()">
<a href="#" class="btn btn-success btn-sm" id="margindata">Edit</a>
<input type="submit" value="Delete" class="btn btn-danger btn-sm" id="margindata">
<input type="hidden" name="_token" value="Token 1">Delete
</form>
</td>
</tr>
<tr id="id1" class="trdrag">
<td class="idrow tdcenter"><p id="margindata">1</p></td>
<td style="display:none;">Testing</td>
<td class="tdcenter tdvisible">
Yes
</td>
<td class="tdslug"><p id="margindata">Slug</p></td>
<td class="tdimg"><img src="http://via.placeholder.com/350x150" class="sizeheader"></td>
<td class="tdimg"><img src="http://via.placeholder.com/350x150" class="sizehome"></td>
<td class="tdcenter tdorder"><p id="margindata">Order 1</p></td>
<td class="tdacciones">
<form method="POST" action="{{route('admin.projects.destroy',$project->id)}}" onsubmit="return ConfirmarBorrar()">
<a href="#" class="btn btn-success btn-sm" id="margindata">Edit</a>
<input type="submit" value="Delete" class="btn btn-danger btn-sm" id="margindata">
<input type="hidden" name="_token" value="Token 1">Delete
</form>
</td>
</tr>
<tr id="id1" class="trdrag">
<td class="idrow tdcenter"><p id="margindata">4</p></td>
<td style="display:none;">Testing</td>
<td class="tdcenter tdvisible">
Yes
</td>
<td class="tdslug"><p id="margindata">Slug</p></td>
<td class="tdimg"><img src="http://via.placeholder.com/350x150" class="sizeheader"></td>
<td class="tdimg"><img src="http://via.placeholder.com/350x150" class="sizehome"></td>
<td class="tdcenter tdorder"><p id="margindata">Order 1</p></td>
<td class="tdacciones">
<form method="POST" action="{{route('admin.projects.destroy',$project->id)}}" onsubmit="return ConfirmarBorrar()">
<a href="#" class="btn btn-success btn-sm" id="margindata">Edit</a>
<input type="submit" value="Delete" class="btn btn-danger btn-sm" id="margindata">
<input type="hidden" name="_token" value="Token 1">Delete
</form>
</td>
</tr>
<tr id="id2" class="trdrag">
<td class="idrow tdcenter"><p id="margindata">5</p></td>
<td class="tdcenter tdvisible">
Yes
</td>
<td class="tdslug"><p id="margindata">Slug</p></td>
<td class="tdimg"><img src="http://via.placeholder.com/350x150" class="sizeheader"></td>
<td class="tdimg"><img src="http://via.placeholder.com/350x150" class="sizehome"></td>
<td class="tdcenter tdorder"><p id="margindata">Order 2</p></td>
<td class="tdacciones">
<form method="POST" action="{{route('admin.projects.destroy',$project->id)}}" onsubmit="return ConfirmarBorrar()">
<a href="#" class="btn btn-success btn-sm" id="margindata">Edit</a>
<input type="submit" value="Delete" class="btn btn-danger btn-sm" id="margindata">
<input type="hidden" name="_token" value="Token 2">Delete
</form>
</td>
</tr>
</tbody>
</table>
<br><br>
</div>
</div>
在过去的几天里,我自己一直在努力使用 sortable 插件,我认为需要进行以下更改:
添加辅助函数以在辅助对象(可拖动对象)上创建正确的大小以具有正确的大小。
在开始函数中,将项目html添加到占位符html,使占位符保持与原始相同。
代码:
$("#tbodyproject").sortable({
items: "> tr",
appendTo: "parent",
helper: "clone",
placeholder: "placeholder-style",
start: function(event, ui) {
$(this).find('.placeholder-style td:nth-child(2)').addClass('hidden-td')
//copy item html to placeholder html
ui.placeholder.html(ui.item.html());
//hide the items but keep the height/width.
ui.placeholder.css('visibility', 'hidden');
},
stop: function(event, ui) {
ui.item.css('display', '')
},
//add helper function to keep draggable object the same width
helper: function(e, tr)
{
var $originals = tr.children();
var $helper = tr.clone();
$helper.children().each(function(index)
{
// Set helper cell sizes to match the original sizes
$(this).width($originals.eq(index).width());
});
return $helper;
},
update: function( event, ui ) {
let newOrder = $(this).sortable('toArray');
$.ajax({
type: "POST",
url:'/admin/projects/updateOrder',
data: {ids: newOrder}
})
.done(function( msg ) {
location.reload();
});
}
}).disableSelection();
我有一个包含不同行和字段的 table。在一行中,我有两个带有 display:none;
的字段,当我拖动这些行时,在 <tbody>
和 <thead>
中会产生类似横向填充的效果,table 没有缩小,table 的元素是。
在下一个 JsFiddle 中,第一行无法正常工作,但在第二行中只有一个字段 display:none;
可以正常工作。
有问题尽管问。
错误示例
Table 拖动时:
起初我认为可以通过查找具有 class .hidden-td
的 <td>
元素的数量来解决(class 具有 display: none;
) 并查找具有 class .placeholder-style
的元素(是 class 具有在执行拖动时生成的 <tr>
)并添加许多 <td>
因为我正在移动的 <tr>
中有,但没有,不起作用。
我知道有多少字段.hidden-td
与这一行
var numcells = $('.hidden-td').length;
问题
第一行有 9 个元素,另一行有 8 个元素。在我的函数中 start()
我只在占位符中隐藏了一列,所以当我拖动第一行时,只有一列没有应用 class .hidden-td
,这就是为什么在列的末尾有一个 space。
我该如何解决这个问题?
创建 placeholder 时,它只获取行中的单元格数并用这些单元格创建一个空行。
您正在将 class hidden-td
添加到第 n 个 child 2,因此您隐藏了一个单元格。这适用于第 2 行及以上行,但不适用于第一行,因为该行中还有一个单元格。请参阅第 2 行的 placeholder:
<td colspan="1"> </td><td colspan="1" class="hidden-td"> </td><td colspan="1"> </td><td colspan="1"> </td><td colspan="1"> </td><td colspan="1"> </td><td colspan="1"> </td><td colspan="1"> </td>
第一行:
<td colspan="1"> </td><td colspan="1" class="hidden-td"> </td><td colspan="1"> </td><td colspan="1"> </td><td colspan="1"> </td><td colspan="1"> </td><td colspan="1"> </td><td colspan="1"> </td><td colspan="1"> </td>
您可以做的是隐藏占位符中的每个单元格并仅显示您需要的数字。这可以用 CSS 来完成,像这样:
.placeholder-style td {
display: none;
}
.placeholder-style td:nth-child(-n+7) {
display: table-cell;
}
您可以尝试下面代码段中的方法。
$("#tabs").tabs();
$("#tbodyproject").sortable({
items: "> tr",
appendTo: "parent",
helper: "clone",
placeholder: "placeholder-style",
start: function(event, ui) {
ui.helper.css('display', 'table');
// console.log(ui.placeholder.html())
},
stop: function(event, ui) {
ui.item.css('display', '')
},
update: function( event, ui ) {
let newOrder = $(this).sortable('toArray');
$.ajax({
type: "POST",
url:'/admin/projects/updateOrder',
data: {ids: newOrder}
})
.done(function( msg ) {
location.reload();
});
}
}).disableSelection();
img {
width: 100px;
}
.hidden-td{
display:none;
}
.table{
background-color:green;
border:0;
width:100%;
}
.trdrag{
background-color:yellow;
}
.trdrag.ui-sortable-handle td.tdslug, .trdrag.ui-sortable-handle td.tdslug img{
text-align:center;
align-items:center;
display: table-cell;
justify-content: center;
}
.trdrag.ui-sortable-handle td.tdslug{
white-space:normal;
word-wrap: break-word;
}
.trdrag.ui-sortable-handle td.tdslug img{
padding-left:1rem;
}
.trdrag.ui-sortable-handle {
text-align:center;
align-items:center;
display: table-row;
justify-content: center;
width:100%;
margin-left: .3rem;
}
.thcenter{
background-color:grey !important;
}
.ui-sortable-helper {
left:0px!important;
}
.idrow{
width:5%;
}
.tdvisible{
width:5%;
}
.tdslug{
width:10%;
}
.tdimg{
width:15%;
}
.tdorder{
width:20%;
}
.tdacciones{
width:40%;
}
.placeholder-style td {
display: none;
}
.placeholder-style td:nth-child(-n+7) {
display: table-cell;
}
<link href="https://code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css" rel="stylesheet"/>
<script
src="https://code.jquery.com/jquery-3.2.1.min.js"
integrity="sha256-hwg4gsxgFZhOsEEamdOYGBf13FyQuiTwlAQgxVSNgt4="
crossorigin="anonymous"></script>
<script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>
<div id="tabs">
<div class="col-md-12">
<div id="table1">
<table class="table">
<thead>
<tr>
<th class="thcenter">ID</th>
<th class="thcenter">Visible</th>
<th class="thcenter">Nombre</th>
<th class="thcenter">Header</th>
<th class="thcenter">Home</th>
<th class="thcenter">Orden</th>
<th class="thcenter"><span class="glyphicon glyphicon-cog"></span>Acciones</th>
</tr>
</thead>
<tbody id="tbodyproject">
<tr id="id1" class="trdrag">
<td class="idrow tdcenter"><p id="margindata">1</p></td>
<td class="hidden-td" style="display:none;">Testing</td>
<td class="hidden-td" style="display:none;">Testing2</td>
<td class="tdcenter tdvisible">
Yes
</td>
<td class="tdslug"><p id="margindata">Slug</p></td>
<td class="tdimg"><img src="http://via.placeholder.com/350x150" class="sizeheader"></td>
<td class="tdimg"><img src="http://via.placeholder.com/350x150" class="sizehome"></td>
<td class="tdcenter tdorder"><p id="margindata">Order 1</p></td>
<td class="tdacciones">
<form method="POST" action="{{route('admin.projects.destroy',$project->id)}}" onsubmit="return ConfirmarBorrar()">
<a href="#" class="btn btn-success btn-sm" id="margindata">Edit</a>
<input type="submit" value="Delete" class="btn btn-danger btn-sm" id="margindata">
<input type="hidden" name="_token" value="Token 1">Delete
</form>
</td>
</tr>
<tr id="id1" class="trdrag">
<td class="idrow tdcenter"><p id="margindata">2</p></td>
<td style="display:none;">Testing</td>
<td class="tdcenter tdvisible">
Yes
</td>
<td class="tdslug"><p id="margindata">Slug</p></td>
<td class="tdimg"><img src="http://via.placeholder.com/350x150" class="sizeheader"></td>
<td class="tdimg"><img src="http://via.placeholder.com/350x150" class="sizehome"></td>
<td class="tdcenter tdorder"><p id="margindata">Order 1</p></td>
<td class="tdacciones">
<form method="POST" action="{{route('admin.projects.destroy',$project->id)}}" onsubmit="return ConfirmarBorrar()">
<a href="#" class="btn btn-success btn-sm" id="margindata">Edit</a>
<input type="submit" value="Delete" class="btn btn-danger btn-sm" id="margindata">
<input type="hidden" name="_token" value="Token 1">Delete
</form>
</td>
</tr>
<tr id="id1" class="trdrag">
<td class="idrow tdcenter"><p id="margindata">3</p></td>
<td style="display:none;">Testing</td>
<td class="tdcenter tdvisible">
Yes
</td>
<td class="tdslug"><p id="margindata">Slug</p></td>
<td class="tdimg"><img src="http://via.placeholder.com/350x150" class="sizeheader"></td>
<td class="tdimg"><img src="http://via.placeholder.com/350x150" class="sizehome"></td>
<td class="tdcenter tdorder"><p id="margindata">Order 1</p></td>
<td class="tdacciones">
<form method="POST" action="{{route('admin.projects.destroy',$project->id)}}" onsubmit="return ConfirmarBorrar()">
<a href="#" class="btn btn-success btn-sm" id="margindata">Edit</a>
<input type="submit" value="Delete" class="btn btn-danger btn-sm" id="margindata">
<input type="hidden" name="_token" value="Token 1">Delete
</form>
</td>
</tr>
<tr id="id1" class="trdrag">
<td class="idrow tdcenter"><p id="margindata">1</p></td>
<td style="display:none;">Testing</td>
<td class="tdcenter tdvisible">
Yes
</td>
<td class="tdslug"><p id="margindata">Slug</p></td>
<td class="tdimg"><img src="http://via.placeholder.com/350x150" class="sizeheader"></td>
<td class="tdimg"><img src="http://via.placeholder.com/350x150" class="sizehome"></td>
<td class="tdcenter tdorder"><p id="margindata">Order 1</p></td>
<td class="tdacciones">
<form method="POST" action="{{route('admin.projects.destroy',$project->id)}}" onsubmit="return ConfirmarBorrar()">
<a href="#" class="btn btn-success btn-sm" id="margindata">Edit</a>
<input type="submit" value="Delete" class="btn btn-danger btn-sm" id="margindata">
<input type="hidden" name="_token" value="Token 1">Delete
</form>
</td>
</tr>
<tr id="id1" class="trdrag">
<td class="idrow tdcenter"><p id="margindata">4</p></td>
<td style="display:none;">Testing</td>
<td class="tdcenter tdvisible">
Yes
</td>
<td class="tdslug"><p id="margindata">Slug</p></td>
<td class="tdimg"><img src="http://via.placeholder.com/350x150" class="sizeheader"></td>
<td class="tdimg"><img src="http://via.placeholder.com/350x150" class="sizehome"></td>
<td class="tdcenter tdorder"><p id="margindata">Order 1</p></td>
<td class="tdacciones">
<form method="POST" action="{{route('admin.projects.destroy',$project->id)}}" onsubmit="return ConfirmarBorrar()">
<a href="#" class="btn btn-success btn-sm" id="margindata">Edit</a>
<input type="submit" value="Delete" class="btn btn-danger btn-sm" id="margindata">
<input type="hidden" name="_token" value="Token 1">Delete
</form>
</td>
</tr>
<tr id="id2" class="trdrag">
<td class="idrow tdcenter"><p id="margindata">5</p></td>
<td class="tdcenter tdvisible">
Yes
</td>
<td class="tdslug"><p id="margindata">Slug</p></td>
<td class="tdimg"><img src="http://via.placeholder.com/350x150" class="sizeheader"></td>
<td class="tdimg"><img src="http://via.placeholder.com/350x150" class="sizehome"></td>
<td class="tdcenter tdorder"><p id="margindata">Order 2</p></td>
<td class="tdacciones">
<form method="POST" action="{{route('admin.projects.destroy',$project->id)}}" onsubmit="return ConfirmarBorrar()">
<a href="#" class="btn btn-success btn-sm" id="margindata">Edit</a>
<input type="submit" value="Delete" class="btn btn-danger btn-sm" id="margindata">
<input type="hidden" name="_token" value="Token 2">Delete
</form>
</td>
</tr>
</tbody>
</table>
<br><br>
</div>
</div>
在过去的几天里,我自己一直在努力使用 sortable 插件,我认为需要进行以下更改:
添加辅助函数以在辅助对象(可拖动对象)上创建正确的大小以具有正确的大小。
在开始函数中,将项目html添加到占位符html,使占位符保持与原始相同。
代码:
$("#tbodyproject").sortable({
items: "> tr",
appendTo: "parent",
helper: "clone",
placeholder: "placeholder-style",
start: function(event, ui) {
$(this).find('.placeholder-style td:nth-child(2)').addClass('hidden-td')
//copy item html to placeholder html
ui.placeholder.html(ui.item.html());
//hide the items but keep the height/width.
ui.placeholder.css('visibility', 'hidden');
},
stop: function(event, ui) {
ui.item.css('display', '')
},
//add helper function to keep draggable object the same width
helper: function(e, tr)
{
var $originals = tr.children();
var $helper = tr.clone();
$helper.children().each(function(index)
{
// Set helper cell sizes to match the original sizes
$(this).width($originals.eq(index).width());
});
return $helper;
},
update: function( event, ui ) {
let newOrder = $(this).sortable('toArray');
$.ajax({
type: "POST",
url:'/admin/projects/updateOrder',
data: {ids: newOrder}
})
.done(function( msg ) {
location.reload();
});
}
}).disableSelection();