Как заставить jqGrid игнорировать внутреннюю таблицу

#jquery #html #css #jqgrid

#jquery #HTML #css #jqgrid

Вопрос:

На моей работе у нас есть несколько очень старых таблиц с данными, и мы пытаемся преобразовать их в jqGrid. К сожалению, не все таблицы можно воссоздать с нуля в jqGrid, поэтому мы используем tableToGrid для преобразования таблиц с данными в jqGrid и имеем, по крайней мере, некоторые функциональные возможности, такие как сортировка и стили css. Но мы обнаружили проблему с одной из наших таблиц: эта таблица в некоторых случаях отображает информацию с использованием вложенной таблицы, и в этих случаях tableToGrid сворачивается, потому что он не может определить, что td внутренней таблицы не принадлежат внешней таблице, поэтому он добавил во внешнюю таблицу. Результат? Беспорядок. Итак, мой вопрос таков: принимая во внимание ограничения (например, нельзя использовать подсетку, потому что дата уже отображается в html), кто-нибудь из вас знает способ сообщить tableToGrid игнорировать «внутреннюю» таблицу? Я думаю, что ключевым моментом здесь является поиск способа вызова tableToGrid для внешней и внутренней таблиц без вмешательства одного вызова в другой.

С уважением

Ответ №1:

Поскольку вы сказали

способ указать tableToGrid игнорировать «внутреннюю» таблицу

похоже, вы не заинтересованы сохранять и использовать их содержимое (по крайней мере, во время операции преобразования).

Таким образом, вы могли бы просто вставить это перед операцией преобразования:

 $('table table').remove();
  

Очевидно, вам, возможно, придется написать что-то более точное, чем table table , в зависимости от всего контекста.

Ответ №2:

Основной причиной вашей проблемы является использование tableToGrid , который является плагином к jqGrid, созданным много лет назад и почти не изменявшимся и не поддерживаемым. Например, плагин использует addRowData в цикле (см. строку), который работает очень медленно. Источником проблемы, которую вы описываете, является строка кода

 jQuery('td', jQuery(this)).each(function() {
  

которое можно было бы изменить на

 jQuery(this).children('td').each(function() {
  

например, или просто

 jQuery(this.cells).each(function() {
  

(смотрите здесь о cells коллекции every <tr> . Можно просто использовать this.cells[i] для доступа innerHTML к i-й ячейке строки)

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

Код tableToGrid состоит из двух основных частей: первая считывает данные из существующей <table> и сохраняет данные в массиве элементов. Вторая часть создает сетку, используя данные. Если вы знаете структуру ваших существующих таблиц, то вы можете очень легко создать замену tableToGrid . Это то, что я рекомендую вам сделать.