Подтвердить что ты не робот

JQuery ui-sortable - невозможно удалить tr в пустом теле

У меня есть два связанных элемента tbody, которые позволяют мне перетаскивать строки между двумя таблицами. Все работает нормально, пока все строки не будут удалены из любой таблицы.

Когда все строки перетаскиваются в другую таблицу, высота тела уменьшается, что делает невозможным падение строк внутри.

Известно ли обходное решение этой проблемы? (min-height не работает на элементе tbody)

Большое спасибо заранее.

4b9b3361

Ответ 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">&nbsp;</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.