JQuery ui-sortable - невозможно удалить tr в пустом теле
У меня есть два связанных элемента tbody, которые позволяют мне перетаскивать строки между двумя таблицами. Все работает нормально, пока все строки не будут удалены из любой таблицы.
Когда все строки перетаскиваются в другую таблицу, высота тела уменьшается, что делает невозможным падение строк внутри.
Известно ли обходное решение этой проблемы? (min-height не работает на элементе tbody)
Большое спасибо заранее.
Ответы
Ответ 1
Что вы можете сделать, так это создать строку, невидимую для "сортируемого" механизма. Вероятно, самый простой способ сделать это - с помощью опции "items".
Скажем, ваш HTML выглядит так:
<tbody class="sortable">
<tr><td>stuff</td></tr>
<tr><td>stuff</td></tr>
<tr><td>stuff</td></tr>
<tr class="sort-disabled"><td></td></tr>
</tbody>
Тогда в jquery вы можете иметь
$('.sortable').sortable({
items: ">*:not(.sort-disabled)"
});
Это немного взломать, но я думаю, что если вы поиграете с вариациями этого (дайте .sort-disabled строку некоторую высоту в CSS и т.д.), вы, вероятно, можете найти что-то, что сработает для вас. Вы также можете попробовать иметь строку с расширением .sort как первая, так и последняя, так что место в середине является целью капли.
Надеюсь, это поможет!
Ответ 2
Трудно заставить таблицу esp. чтобы иметь высоту, пока она пуста. Поэтому я сделал это следующим образом.
<div class="ui-widget sortablecolumn">
<table>
</table>
</div>
$( '.sortablecolumn').sortable(
{
connectWith: '.sortablecolumn',
items: 'table > tbody > *',
receive: function(ev, ui) {
ui.item.parent().find('table > tbody').append(ui.item);
}
});
$( '.sortablecolumn' ).disableSelection();
Ключевыми аспектами являются items
селектор и receive
обработчик событий, когда добавленный элемент перемещается в тело таблицы.
Теперь он отлично работает.
Ответ 3
Оформить заказ мое сообщение об этом - вы можете решить его, добавив метод к клику, который добавляет высоту в пустые контейнеры:
function sortAndDrag() {
//show BEFORE sortable starts
$(".sortableClass").bind('click mousedown', function(){
$(".sortableClass"").each(function (c) {
if ($("tbody", this).size() == 0) {
$(this).addClass("aClassWhichGivesHeight")
}
})
});
//enable sortable
$(".sortableClass").sortable({
connectWith: ".sortableClass",
stop: function (a, d) {
$("tbody").removeClass("aClassWhichGivesHeight");
}
});
}
Что-то вроде этого?
Ответ 4
У меня такой же вопрос, и мне удалось решить половину этого:
$('table').sortable(
{
connectWith: 'table',
items: 'tbody tr'
});
Это позволяет мне перемещать строки в пустую таблицу, и это выглядит нормально, но элемент вставлен после tbody, а не внутри него. Я думаю, что ответ Дэнни Роберт будет работать для меня, но мне было бы интересно увидеть решение без хака.
Ответ 5
Вот как я решил проблему с невозможностью сбросить tr в пустом теле:
$(function() {
var sort1 = $('#sort1 tbody');
var sort2 = $('#sort2 tbody');
sizeCheck(sort1);
sizeCheck(sort2);
//Start the jQuery Sortable for Active and Fresh Promo Tables
$("#sort1 tbody, #sort2 tbody").sortable({
items: ">*:not(.sort-disabled)",
deactivate: function(e, ui) {
sizeCheck(sort1);
sizeCheck(sort2);
},
//Connect tables to pass data
connectWith: ".contentTable tbody"
}).disableSelection();
});
//Prevent empty tbody from not allowing items dragged into it
function sizeCheck(item){
if($(item).height() == 0){
$(item).append('<tr class="sort-disabled"><td></td></tr>');
}
}
Ответ 6
Я знаю, что этот вопрос был отмечен как "ответил", но я также хотел добавить еще один способ приблизиться к этому.
То, что я делаю, это проверить, пуст ли пул, если это так, создать новый элемент строки и ввести его в tbody. Я помещал сообщение как "Нет больше предметов" в td.
Как только элемент будет сброшен в "пустой" список, пустое сообщение будет уничтожено.
Я использую Mootools, следовательно, отсутствует пример кода.
Ответ 7
i используйте:
$(document).ready(function(){
$( "#sortable1 tbody, #sortable2 tbody" ).sortable({
connectWith: ".connectedSortable",
remove: function(event, ui){ if($(this).html().replace(/^\s+/, "") == '') { $(this).html('<tr class="tmp_tr nobr"><td colspan="7"> </td></tr>'); }},
update: function( event, ui ) {$(this).find('.tmp_tr').remove();},
}).disableSelection();
});
Ответ 8
JS
$(".sortable").sortable({
items: 'tbody > tr',
connectWith: ".sortable"
});
CSS
.sortable {
background-color: silver;
height: 10px;
}
.sortable td { background-color: white; }
HTML
<table class='sortable'>
<tbody>
<tr><td colspan="2" class="drop-row" style="display: none;"></td></tr>
</tbody>
</table>
Более подробная информация и даже лучший код на
https://devstuffs.wordpress.com/2015/07/31/jquery-ui-sortable-with-connected-tables-and-empty-rows/
Ответ 9
Простое решение (PURE CSS):
tbody:after {
content:" ";
height:30px;
}
Если пустое пространство не является пустым пространством. Это невидимый пустой символ, как показано ниже:
Невидимые символы - ASCII
Работала для меня в FF и Chrome.