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

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

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

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

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

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

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

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


person fgpx78    schedule 27.04.2011    source источник
comment
любой код? может у вас где-то есть несовпадающий тег?   -  person Naftali aka Neal    schedule 27.04.2011
comment
Можете ли вы проверить HTML с помощью инструментов IE9 F12? Сообщает ли IE9, в каком режиме выполняется рендеринг? Quirks Mode, стандарты IE 7, IE 8, IE 9 (по умолчанию) и т. Д.   -  person Dan Sorensen    schedule 27.04.2011
comment
В блоге IE сегодня упоминается новый инструмент, помогающий устранить несовместимость с IE 9: blogs.msdn.com/b/ie/archive/2011/04/27/   -  person Dan Sorensen    schedule 27.04.2011
comment
Код действительно длинный, не думаю, что проблема в этом. С инструментом F12 ошибок не обнаружено, а режим рендеринга - IE9. Я пробую Инспектор совместимости и сообщаю вам;) Я также проверил, нет ли ошибок в тегах (первое, что я сделал), но не повезло   -  person fgpx78    schedule 28.04.2011
comment
Кстати, я обнаружил проблему: похоже, что какой-то код javascript перед тегом HEAD вызывал проблему. IE9, похоже, не справляется с этим ... это проблема, поскольку я решил проблему MVC, делая это ... Я вернулся к старому :) Спасибо всем.   -  person fgpx78    schedule 29.05.2011
comment
К вашему сведению: есть скрипка, которая воспроизводит эту проблему на ie9: jsfiddle.net/kiranmn/ kYRnV / 4 / встроенный / результат   -  person mkoryak    schedule 08.11.2012
comment
дублирует ie9-table-has-random-rows -which-are-offset-at-random-columns   -  person Ravi Kadaboina    schedule 31.01.2013
comment
Эта проблема аналогична stackoverflow.com/questions/8474678/ie9-strange- стол-выпуск   -  person Sandeep    schedule 20.09.2013


Ответы (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);
person Shanison    schedule 15.08.2011
comment
Это решение устранило мою проблему. Прежде чем я нашел это решение, у меня возникла загадка. - person Bearwulf; 28.10.2011
comment
Ссылка больше не доступна. - person Mason240; 15.03.2013
comment
Он все еще доступен. Вы должны войти в систему, чтобы просмотреть содержимое. Я только что сделал скриншоты. Вы можете найти скриншот в моем ответе - person Shanison; 15.03.2013
comment
Я также добавил в пустые ячейки. - person Bakudan; 25.07.2013
comment
что, если вы возвращаетесь не из ajax, а через частичное представление - person leora; 11.01.2014
comment
@leora Если это не ajax, вы можете снова заменить всю таблицу html после того, как документ будет готов. - person Shanison; 14.01.2014
comment
@shanison. У меня проблема при добавлении строк таблицы внутри getjson. иногда два ряда объединяются. Я попытался использовать ваш код замены, но не устранил проблему в firefox! Не могли бы вы помочь мне исправить это? Var newRowContent = '‹tr› ‹td›' + count + ')' + this.gsx $ name. $ T + '‹/td› ‹td›' + this.gsx $ category. $ T + '‹/Td› ‹/tr› \ n'; $ (# tblEntAttributes tbody) .append (newRowContent); - person user1788736; 02.10.2015

У меня была такая же проблема с заполнением таблицы с использованием шаблонов 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>
person Jorge    schedule 02.07.2011
comment
Спасибо, попробую, если проблема повторится. Приятно знать, что это не только у меня;) - person fgpx78; 03.07.2011
comment
какие? (это была моя первая реакция). Но это сработало! Большое спасибо! - person Filipa Lacerda; 15.02.2013
comment
Работал у меня Большое спасибо! +1 для вас - person Saurabh Bayani; 13.11.2013
comment
Вы сэр, вы молодец! :-) - person Satya; 10.09.2014
comment
Спасибо вам большое за это! Удаление всех пробелов между начальным и конечным тегами ‹td› действительно сработало. - person Frankie Loscavio; 20.04.2015

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

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

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

охватывает все элементы table, caption, colgroup, col, tbody, thead, tfoot, tr, td, th.

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

person Ravi Kadaboina    schedule 30.01.2013

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

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);
person Will Liska    schedule 09.04.2012

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

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

person Dan Sorensen    schedule 27.04.2011
comment
Не удалось найти ничего с помощью инструмента. Просто большая проблема с проверкой из-за рендеринга движка aspnet (отсутствует конец / для некоторых мета-тегов и тегов ссылок в заголовке). - person fgpx78; 28.04.2011

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

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

Изменил его на style = "width: XXpx", и проблема решена :)

person TAURI    schedule 30.06.2011

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

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

<td>gibberish</td>

пытаться:

<td><span>gibberish</span></td>
person user1207607    schedule 22.03.2012
comment
Мне нравится это решение. Это проще, чем убирать пробелы между всеми элементами. Более того, у меня это сработало :-) - person R. Schreurs; 27.01.2015

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

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

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

person Rish    schedule 16.06.2016

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

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

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

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

Казалось, это решило проблему!

person anneleenw    schedule 23.04.2015

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

person Vikas Pawar    schedule 21.11.2012

У меня была аналогичная проблема с 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.

person Arun Pratap Singh    schedule 06.03.2014

Имеется такая же проблема форматирования с ie9 и новая проблема в ie11, где он форматируется правильно, но для визуализации таблицы из примерно 400 строк и 9 столбцов требуется 25-40 секунд. У него та же причина - пробелы внутри тегов 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 строк требуется немного времени, но менее секунды, что для моих целей достаточно.

person Tom Regan    schedule 03.03.2015

У меня иногда возникала эта проблема на таблицах, созданных 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;
}
person Homer    schedule 17.07.2015

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

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

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

person dfsq    schedule 25.04.2014