Arhn - архитектура программирования

Проблемы с переполнением и переносом текста в jQuery DataTable

У меня есть следующий DataTable (класс css полной ширины устанавливает ширину = 100%)

<table class="datatable full-width">
    <thead>
        <th>LOB</th>
        <th>Creditor Line 1</th>
        <th>Creditor Line 2</th>
        <th>Address</th>
        <th>City</th>
        <th>State</th>
        <th>Zip</th>
        <th></th>
    </thead>
    <tbody>
        ...
    </tbody>
</table>

Javascript:

var profileTable =
            $(".datatable").dataTable({
                "iDisplayLength": 25,
                "bDestroy": true,
                "bJQueryUI": true,
                "sPaginationType": "full_numbers",
                "bAutoWidth": false
            });

Все работает нормально, пока не будет запись с длинной текстовой строкой ... когда появляется запись с действительно длинным текстом, таблица данных переполняется в правой части страницы. (См. Снимок экрана ниже, красная линия - это место, где должна заканчиваться страница) http://i1109.photobucket.com/albums/h430/tbarbedo/overflow.jpg

Может ли кто-нибудь сказать мне, как обернуть текст в ячейках или предотвратить эту проблему с переполнением?

Я пробовал через table-layout: fixed ... это предотвращает переполнение, но устанавливает для всех столбцов одинаковую ширину.

Спасибо


Ответы:


1

Я согласился с ограничением (для некоторых людей преимуществом), когда в моих строках была только одна строка текста. CSS, содержащий длинные строки, становится таким:

.datatable td {
  overflow: hidden; /* this is what fixes the expansion */
  text-overflow: ellipsis; /* not supported in all browsers, but I accepted the tradeoff */
  white-space: nowrap;
}

[отредактируйте, чтобы добавить:] После использования моего собственного кода и первоначальной неудачи я осознал второе требование, которое могло бы помочь людям. Сама таблица должна иметь фиксированный макет, иначе ячейки будут продолжать пытаться расширяться, чтобы вместить содержимое, несмотря ни на что. Если стили DataTables или ваши собственные стили еще этого не сделали, вам необходимо установить это:

table.someTableClass {
  table-layout: fixed
}

Теперь, когда текст усечен многоточием, чтобы на самом деле «увидеть» текст, который потенциально скрыт, вы можете реализовать плагин всплывающей подсказки, кнопку подробностей или что-то в этом роде. Но быстрое и грязное решение - использовать JavaScript, чтобы установить заголовок каждой ячейки, идентичный ее содержимому. Я использовал jQuery, но вам необязательно:

  $('.datatable tbody td').each(function(index){
    $this = $(this);
    var titleVal = $this.text();
    if (typeof titleVal === "string" && titleVal !== '') {
      $this.attr('title', titleVal);
    }
  });

DataTables также предоставляет обратные вызовы на уровнях рендеринга строк и ячеек, поэтому вы можете предоставить логику для установки заголовков в этой точке вместо итератора jQuery.each. Но если у вас есть другие слушатели, которые изменяют текст ячеек, вам может быть лучше ударить их с помощью jQuery.each в конце.

Весь этот метод усечения ТАКЖЕ будет иметь ограничение, которое, как вы указали, вы не являетесь поклонником: по умолчанию столбцы будут иметь одинаковую ширину. Я определяю столбцы, которые будут постоянно широкими или постоянно узкими, и явно устанавливаю для них ширину в процентах (вы можете сделать это в своей разметке или с помощью sWidth). Любые столбцы без явной ширины получают равномерное распределение оставшегося места.

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

09.11.2011
  • Я не могу заставить это работать на меня. Datatables отказывается уважать эти свойства CSS и будет переносить строки только в том случае, если они расставлены через дефис. 28.11.2013
  • Некоторые CSS, которые не указаны, но описаны, заключаются в том, что для ячеек должна быть установлена ​​высота, которая будет содержать только одну строку текста. Это не сработает для многострочного текста. Фактически, это вообще НЕ должно быть обертыванием; это белое пространство: nowrap в действии. 28.11.2013

  • 2

    Следующее объявление CSS работает для меня:

    .td-limit {
        max-width: 70px;
        text-overflow: ellipsis;
        white-space: nowrap;
        overflow: hidden;
    }
    
    07.10.2014

    3

    Вы можете попробовать установить word-wrap, но он пока работает не во всех браузерах.

    Другой метод - добавить элемент вокруг данных вашей ячейки следующим образом:

    <td><span>...</span></td>
    

    Затем добавьте такой CSS:

    .datatable td span{
        max-width: 400px;
        display: block;
        overflow: hidden;
    }
    
    08.11.2011
  • Спасибо за ваш ответ. Это решение ограничивает размер столбца и скрывает переполнение, однако оно не работает для переноса текста в ячейку. 09.11.2011
  • Вы можете попробовать решения с этой страницы, однако решения пока нет. который работает во всех браузерах одинаково. Наиболее последовательные решения включают добавление специального символа после каждого символа, но это довольно хакерский прием. Когда я делал что-то подобное, раньше это было сделано так, чтобы вы могли навести курсор на обрезанный текст, и появилось всплывающее окно, показывающее показанный скрытый текст. Это также имеет то преимущество, что экономит вертикальное пространство. 09.11.2011

  • 4

    Та же проблема, и я решил поместить таблицу между кодом

    <div class = "table-responsive"> </ div>
    
    12.07.2017
  • Также удалите класс nowrap из таблицы, если вы его использовали. 08.05.2019

  • 5

    Просто стиль css с использованием white-space:nowrap очень хорошо работает, чтобы избежать переноса текста в ячейки. И, конечно, вы можете использовать text-overflow:ellipsis и overflow:hidden для обрезки текста с эффектом многоточия.

    <td style="white-space:nowrap">Cell Value</td>
    
    24.05.2017

    6

    Я очень поздно здесь, но после прочтения ответа @Greg Pettit и пары блогов или других вопросов SO, которые я, к сожалению, не могу вспомнить, я решил просто создать пару плагинов dataTables, чтобы справиться с этим.

    Я помещаю их в битбакет в репозитории Mercurial. Я следил за плагином fnSetFilteringDelay и просто изменил комментарии и код внутри, поскольку я никогда не делал плагин для чего-либо раньше. Я сделал 2 и не стесняюсь использовать их, вносить в них свой вклад или вносить предложения.

    • dataTables.TruncateCells - усекает каждую ячейку в столбце до заданного количества символов, заменяя последнюю 3 с многоточием и помещает полный предварительно обрезанный текст в присвоенный заголовок ячейки.

    • dataTables.BreakCellText - пытается вставить символ разрыва каждый X, определенный пользователем, символы в каждую ячейку в колонка. Есть причуды в отношении ячеек, которые содержат как пробелы, так и дефисы, вы можете получить некоторые странные результаты (например, пара символов, идущих после последнего вставленного символа
      ). Может быть, кто-то сможет сделать это более надежным, или вы можете просто поиграть с breakPos для столбца, чтобы он выглядел хорошо с вашими данными.

    17.08.2012

    7

    Я столкнулся с той же проблемой переноса текста, решил ее, изменив css класса таблицы в DT_bootstrap.css. Я представил последние две строки css table-layout и word-break.

       table.table {
        clear: both;
        margin-bottom: 6px !important;
        max-width: none !important;
        table-layout: fixed;
        word-break: break-all;
       } 
    
    23.12.2015
  • Хорошо, это работает, но высота строки увеличится. Любое решение вроде подсказки или просто ...? 20.06.2016

  • 8

    Попробуйте добавить td {word-wrap: break-word;} в CSS и посмотрите, исправит ли он это.

    08.11.2011
  • Я пробовал использовать это без «table-layout: fixed» без положительных результатов. 09.11.2011

  • 9

    Вы можете просто использовать рендеринг и обернуть свой собственный div или охватить его. TD трудно стилизовать, когда дело доходит до max-width, max-height и т. Д. Div и span - это просто.

    См .: https://datatables.net/examples/advanced_init/column_render.html

    Я думаю, что лучшее решение, чем работа с хаками CSS, которые не поддерживаются кросс-браузером.

    25.05.2015

    10

    Использование классов «responseive nowrap» в элементе таблицы должно помочь.

    07.11.2018
    Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..