it-swarm.com.ru

jQuery UI Сортируемый с таблицей и tr шириной

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

Например; если моя строка таблицы составляет 500px, когда я начинаю перетаскивать, она становится 300px. Я предполагаю, что это происходит, потому что ширина не определена в сетке. Это потому, что я использую два класса для tds (fix и liquid).

Класс fix делает td равным ширине содержимого, а liquid делает td шириной 100%. Это мой подход к таблице сетки без необходимости присваивать ширину tds.

Любая идея, как сделать сортируемую работу с моим подходом?

153
ntan

Я нашел ответ здесь .

Я немного изменил его, чтобы клонировать строку вместо добавления ширины к оригиналу:

  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;
  },
250
Dave James Miller

Я думаю, что это может помочь:

.ui-sortable-helper {
    display: table;
}
159
Yaroslav

Выбранный ответ - действительно хорошее решение, но в нем есть одна серьезная ошибка, которая проявляется в оригинальной скрипке JS ( http://jsfiddle.net/bgrins/tzYbU/ ): попробуйте перетащить самое длинное строка ( Благословит вас Бог, мистер Розуотер ), а остальные ширины ячейки разрушаются.

Это означает, что фиксации ширины ячейки на перетаскиваемой ячейке недостаточно - вам также необходимо зафиксировать ширину таблицы.

$(function () {
    $('td, th', '#sortFixed').each(function () {
        var cell = $(this);
        cell.width(cell.width());
    });

    $('#sortFixed tbody').sortable().disableSelection();
});

JS Fiddle: http://jsfiddle.net/rp4fV/3/

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

Чтобы обойти это при добавлении или изменении содержимого, вам необходимо очистить установленную ширину:

$('td, th', '#sortFixed').each(function () {
    var cell = $(this);
    cell.css('width','');
});

Затем добавьте ваш контент, затем снова установите ширину.

Это все еще не полное решение, так как (особенно с таблицей) вам нужен заполнитель для удаления. Для этого нам нужно добавить функцию при запуске, которая создает заполнитель:

$('#sortFixed tbody').sortable({
    items: '> tr',
    forcePlaceholderSize: true,
    placeholder:'must-have-class',
    start: function (event, ui) {
        // Build a placeholder cell that spans all the cells in the row
        var cellCount = 0;
        $('td, th', ui.helper).each(function () {
            // For each TD or TH try and get it's colspan attribute, and add that or 1 to the total
            var colspan = 1;
            var colspanAttr = $(this).attr('colspan');
            if (colspanAttr > 1) {
                colspan = colspanAttr;
            }
            cellCount += colspan;
        });

        // Add the placeholder UI - note that this is the item's content, so TD rather than TR
        ui.placeholder.html('<td colspan="' + cellCount + '">&nbsp;</td>');
    }
}).disableSelection();

JS Fiddle: http://jsfiddle.net/rp4fV/4/

28
Keith

Кажется, что клонирование строки не работает хорошо в IE8, но оригинальное решение делает.

Протестировано с помощью jsFiddle .

6
vincentp

Вызовите этот следующий код, когда ваша таблица будет готова к сортировке, это позволит убедиться, что ваши элементы td исправлены, не нарушая структуру таблицы.

 $(".tableToSort td").each(function () {
            $(this).css("width", $(this).width());
        });  
4
Teoman shipahi

Похоже, disableSelection() - метод плохой и не рекомендуется в настоящее время. Я больше не могу использовать ввод текста внутри сортируемой строки в Mozilla Firefox 35.0. Это просто больше не сфокусировано.

0
Miika Kontio

Решение Кейта прекрасно, но в Firefox возникло небольшое разрушение, которое не суммировало colspans, а приняло их решение. (Старый JS строки типа боли в колене)

заменив эту строку:

 cellCount += colspan;

с:

 cellCount += colspan-0;

Исправляет проблему. (Поскольку js вынужден рассматривать переменные как числа вместо строк)

0
Max

Ответ Дэйва Джеймса Миллера сработал для меня, но из-за расположения контейнерных элементов на моей странице помощник, который перетаскивает курсор мыши, смещен относительно положения моей мыши. Чтобы исправить это, я добавил следующее к вспомогательному обратному вызову

$(document.body).append($helper);

Вот полный обратный вызов с добавленной выше строкой:

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());
  });

  // append it to the body to avoid offset dragging
  $(document.body).append($helper);

  return $helper;
}

Я бы добавил это в качестве комментария к ответу Дэйва, но у меня не было достаточно представителей на этот счет.

0
Shea Riley