Internet Explorer 9 неправильно отображает ячейки таблицы

Мой сайт всегда работал гладко с IE8, IE7, FF, Chrome и Safari. Сейчас я тестирую его на IE9 и испытываю странную проблему: на некоторых страницах некоторые табличные данные отображаются неправильно.

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

Используя инструмент F12 IE, структура таблицы выглядит корректно, после TD, содержащего M08000007448, не должно быть пустого TD, но все равно он выглядит так.

Более того, если я использую инструмент F12 с инструментом "выбрать элемент по клику" на панели инструментов и пытаюсь щелкнуть пустое пространство между M08000007448 и 19, он выбирает TR, а не "скрытый тд".

У меня эта проблема рендеринга таблицы также в другой таблице приложения, кто-нибудь испытывает что-то подобное? Это происходит только в IE9:(

Я не знаю, важно ли это, но страница сделана с помощью ASPNET (веб-формы) и использует Jquery и некоторые другие плагины JS.

Я пытался сохранить страницу (с изображениями) и открыть ее локально с помощью IE9, но проблема не возникает. (Конечно, я проверил всю структуру таблицы, и все в порядке. Заголовок и все строки имеют одинаковое количество TD, а при необходимости - правильное число colspan).

14 ответов

У меня точно такая же проблема. вы можете прочитать эту https://connect.microsoft.com/IE/feedback/details/649949/innerhtml-formatting-issues-on-very-large-tables

Вы можете удалить пробел между td с помощью javascript, если ваш html возвращается из ajax, а затем из ответа вы заменяете его на

response_html = response_html.replace(/td>\s+<td/g,'td><td');
$('#table').html(response_html);

У меня была та же самая проблема с заполнением таблицы с помощью шаблонов jquery. Я продолжал иметь "призрак" <td>На больших наборах данных (300+) только в IE9. Эти <td>Это подтолкнет внешние столбцы за пределы моей таблицы.

Я исправил это, делая что-то действительно глупое; удаляя все пробелы между <td> начальный и конечный теги и оставленный, оправдывающий разметку HTML, относящуюся к моей таблице. По сути, вы хотите, чтобы все ваши <td></td> на той же строке, без пробелов.

Пример:

<table>
<tr class="grid_customer_normal">
<td>${primary}</td>
<td>${secondary}</td>
<td>${phone}</td>
<td>${address}</td>
</tr>
</table>

Решение, данное @Shanison, помогает только частично, но проблема сохраняется, если между любыми другими элементами есть пробелы, которые могут быть частью модели содержимого таблицы, такой как thead, th и т. Д.

Вот лучшее из правил, разработанное моим руководителем на работе.

if (jQuery.browser.msie && jQuery.browser.version === '9.0')
{
    data = data.replace(/>\s+(?=<\/?(t|c)[hardfob])/gm,'>');
}

охватывает все элементы таблицы, заголовка, группы, столбца, текста, текста, элементов tfoot, tr, td, th.

Примечание: jQuery.browser был удален в jQuery 1.9 и доступен только через плагин jQuery.migrate. Пожалуйста, попробуйте вместо этого использовать функцию обнаружения.

Я исправил эту проблему, удалив пробелы:

var expr = new RegExp('>[ \t\r\n\v\f]*<', 'g');
var response_html_fixed = data.replace(expr, '><'); //A disgusting hack for ie9. Removes space between open and close <td> tags
$('#treegrid-data').replaceWith(response_html_fixed);

IE Blog упоминает о новом инструменте, называемом сегодня скриптом Compat Inspector, для устранения проблем несовместимости IE 9. Это может помочь устранить проблему.

http://blogs.msdn.com/b/ie/archive/2011/04/27/ie9-compat-inspector.aspx

Найден очень полезный скрипт для предотвращения нежелательных ячеек в вашей HTML-таблице при рендеринге.

function removeWhiteSpaces()
{
   $('#myTable').html(function(i, el) {
      return el.replace(/>\s*</g, '><');
   });
}

Эта функция Ja vaScript, которую вы должны вызывать при загрузке страницы (т.е. событие onload)

У меня тоже была эта проблема.

Мне пришло в голову, что атрибут width в тегах td/th вызывает эту проблему.

Поменял его на style="width: XXpx" и проблема решена:)

Я столкнулся с этой проблемой, и я понял, что это произошло, когда я непосредственно помещал текст в <td> элементы. Я не уверен, стандарт это или нет, но после переноса текста в <span> элементы, проблемы рендеринга исчезли.

Так что вместо:

<td>gibberish</td>

пытаться:

<td><span>gibberish</span></td>

Поздний ответ, но, надеюсь, я могу помочь кому-то с этим. Я столкнулся с той же проблемой при отладке в IE9. Решением было удаление всех пробелов в коде HTML. Вместо

<tr> <td>...</td> <td>...</td> </tr>

Я должен был сделать

<tr><td>...</td><td>...</td></tr>

Это казалось, чтобы решить проблему!

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

jQuery.fn.htmlClean = function() {
    this.contents().filter(function() {
        if (this.nodeType != 3) {
            $(this).htmlClean();
            return false;
        }
        else {
            this.textContent = $.trim(this.textContent);
            return !/\S/.test(this.nodeValue);
        }
    }).remove();
    return this;
}

У меня была похожая проблема с ie-9 при рендеринге динамической таблицы.

var table = $('<table><tr><td style="width :100"></td></tr></table>');

при визуализации переводится в...

<table><tbody><tr><td style="width :100px"></td></tr></tbody></table>

это прекрасно работает в ie=10 Chrome Safari...

 //   but for ie-8 it renders to... with a style attr in my case

 <table><tbody><tr><td ></td></tr></tbody></table>

тебе нужно написать 100px вместо 100,

Это очень серьезная ошибка в IE9. В моем случае удаление только пробелов между разными td было недостаточно, поэтому я также удалил пробелы между различными tr. И это работает нормально.

Имеет ту же проблему форматирования с ie9, и новую проблему в ie11, где он корректно форматирует, но занимает 25-40 секунд, чтобы отобразить таблицу из 400 строк и 9 столбцов. У него та же причина - пробелы внутри тегов tr или td.

Я отображаю таблицу, которая создается путем рендеринга частичного представления из вызова AJAX. Я решил использовать BFH на сервере, удалив пробелы из визуализированного частичного представления, используя метод, размещенный здесь: http://optimizeasp.net/remove-whitespace-from-html

Это его решение, скопированное in-toto:

    private static readonly Regex RegexBetweenTags = new Regex(@">(?! )\s+",     RegexOptions.Compiled);
    private static readonly Regex RegexLineBreaks = new Regex(@"([\n\s])+?(?<= {2,})<", RegexOptions.Compiled);
    private static string RemoveWhitespaceFromHtml(string html)
    {

        html = RegexBetweenTags.Replace(html, ">");
        html = RegexLineBreaks.Replace(html, "<");
        return html.Trim();

    }

А вот метод, который возвращает частичное представление в виде строки, украденной из другого ответа SO:

public string RenderPartialViewToString(string viewName, object model)
    {
        this.ViewData.Model = model;
        try
        {
            using (StringWriter sw = new StringWriter())
            {
                ViewEngineResult viewResult = ViewEngines.Engines.FindPartialView(this.ControllerContext, viewName);
                ViewContext viewContext = new ViewContext(this.ControllerContext, viewResult.View, this.ViewData, this.TempData, sw);
                viewResult.View.Render(viewContext, sw);
                return RemoveWhitespaceFromHtml(sw.ToString());
            }
        }
        catch (Exception ex)
        {
            //logger here
        }
    }

Требуется немного времени, но меньше секунды, чтобы отобразить таблицу из 400 строк, что для моих целей вполне достаточно.

У меня была такая же проблема с сеткой KendoUI в IE10. Я смог заставить IE перерисовать отсутствующие ячейки таблицы с помощью этого хака:

htmlTableElement.appendChild(document.createTextNode(''));

Добавление пустого textNode заставляет IE перерисовывать всю таблицу.

Другие вопросы по тегам