Большая таблица в iFrame приводит к сбою IE8

У меня есть страница с iFrame, источником которой является страница ashx. Обработчик принимает 3 аргумента через строку запроса и генерирует текстовый/html-ответ, содержащий таблицу. Когда таблица получает> 1700 строк, происходит сбой браузера IE8. Браузер зависает и возвращает ошибку нулевой ссылки.

Если я возьму отображаемый html и помещу его в DIV на странице, он отлично отобразится в IE8. Какие-либо предложения?


person Brian    schedule 02.06.2010    source источник


Ответы (3)


Сбой вызван функцией IE8 под названием SmartScreen. Он не позволяет пользователям переходить на известные вредоносные и фишинговые сайты. Это также непреднамеренная функция, которая не позволяет веб-сайтам извлекать большие объемы данных после рендеринга. Как только эта функция отключена, сбои полностью исчезают.

person Brian    schedule 04.06.2010
comment
Вау, как, черт возьми, ты это понял? - person AMissico; 04.06.2010
comment
Работал напрямую с Microsoft. - person Brian; 08.06.2010

Если я возьму отображаемый html и помещу его в DIV на странице, он отлично отобразится в IE8. Какие-либо предложения?

Обработчик ashx отображает полную html-страницу или только фрагмент таблицы?

Убедитесь, что страница является допустимой html с тегами html, body.

Также таблицы замораживают процесс компоновки в большинстве браузеров. Вы пытались использовать теги div, чтобы увидеть, не приведет ли это к сбою IE 8?

person ggonsalv    schedule 03.06.2010
comment
Мы взяли HTML-код, который отображается, просмотрели его и убедились, что структура таблицы правильная (т. е. правильные теги, конечные теги и т. д.) и что весь HTML-код сформирован правильно. Прогнал его через валидатор HTML, и все было в порядке. Я попробую теги div. - person Brian; 03.06.2010
comment
@Brian: Каков размер отображаемого HTML? - person AMissico; 03.06.2010
comment
Это кажется немного большим. Ладно для развития. Можете ли вы взять этот статический HTML, сохранить его локально и открыть в браузере? Можете ли вы взять этот статический HTML, сохранить его на веб-сервере и открыть в браузере? - person AMissico; 03.06.2010
comment
Да, мы можем взять страницу и открыть ее как локально, так и на сервере разработки. Мы даже можем взять HTML-код таблицы со страницы, отображаемой в iframe, и поместить его в div на той же странице, чтобы он отображался нормально. - person Brian; 04.06.2010
comment
Тогда из поведения Fiddler и результатов использования статического HTML становится очевидно, что проблема заключается в обработчике. Это не размер таблицы или загрузка страницы. На этом этапе я предлагаю включить трассировку страниц для приложения и выяснить, почему Fiddler дает сбой. - person AMissico; 04.06.2010

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

Попробуйте "просмотр совместимости", та же проблема?

Попробуйте уменьшить размер страницы. Например,

  1. удалить ненужные пробелы (сначала это сделать, потому что это проще всего)
  2. временно используйте имена правил css из двух символов для правил, которые вы используете много раз,
  3. временно используйте имена элементов управления и идентификаторы элементов управления из двух или трех символов для элементов управления, которые вы используете в элементах управления, подобных повторителям, таких как списки данных, сетки и т. д.

Примечания

Public Class SearchPage
    Inherits System.Web.UI.Page

    'NOTE
    'short names for variables, controls, and so on, are specifically to reduce file size.

    'used 69,106 records for 
    '       testing/development (this will increase by 10,000 per month)
    'limited to 10,000 records for production (customer rarely will have more than 10,000 and only a few will always have 10,000+)

    Private Const DefaultResultLimit As Integer = 10000
    Private Const CheckPoint As Integer = 100


    Private Sub PopulateSearchResults(ByVal oResults As DataTable)
        Dim iCount As Integer

        For Each oRow As DataRow In oResults.Rows

            AddTableRow(tblBOM, New BomInfo(oRow))

            iCount += 1
            If (iCount Mod CheckPoint) = 0 Then
                If Not Me.Response.IsClientConnected Then
                    Exit For
                End If
            End If
            If iCount > Me.ResultLimit Then
                'limit results
                Exit For
            End If
        Next

    End Sub


    Private Sub AddTableRow(ByVal table As Table, ByVal bom As BomInfo)

        'NOTE
        'short names for variables, controls, and so on, are specifically to reduce file size.

        Dim oRow As New TableRow

        oRow.CssClass = "btr"

        oRow.Cells.Add(CreateCell(New HighlightControl(bom.ManufacturerName, _searchTerm, "sv"), "btc"))
        oRow.Cells.Add(CreateCell(New HighlightControl(bom.Mpn, _searchTerm, "sv"), "btc"))
        oRow.Cells.Add(CreateCell(New HighlightControl(bom.PartDescription, _searchTerm, "sv"), "btc"))
        oRow.Cells.Add(CreateCell(New HighlightControl(bom.Markings, _searchTerm, "sv"), "btc"))

        oRow.Cells.Add(CreateCell(bom.IcLength, "btc cntr"))
        oRow.Cells.Add(CreateCell(bom.IcWidth, "btc cntr"))
        oRow.Cells.Add(CreateCell(bom.PackageType, "btc cntr"))
        oRow.Cells.Add(CreateCell(bom.PinCount, "btc cntr"))
        oRow.Cells.Add(CreateCell(FormatCurrency(bom.ComponentPrice), "btch cr"))
        oRow.Cells.Add(CreateCell(FormatCurrency(bom.ComponentTotal), "btc cr"))
        oRow.Cells.Add(CreateCell(bom.Quantity, "btc cntr"))
        oRow.Cells.Add(CreateCell(bom.ReleaseDate, "btc cr"))
        oRow.Cells.Add(CreateCell(bom.ModelInfo, "btc"))
        oRow.Cells.Add(CreateCell(bom.ComponentFunction, "btc"))

        table.Rows.Add(oRow)

Конец сабвуфера

    '...
    ElseIf oResults.Rows.Count > Me.ResultLimit Then
        'only display the records up to the limit
        'then notify user
        __recordLimitWarning.Text = " " + String.Format(Me.ResultLimitText, Me.ResultLimit.ToString("N0"))
        __recordLimitWarning.Visible = True

    End If
    '....
person AMissico    schedule 02.06.2010
comment
Режим совместимости вызывает ту же проблему. Единственная проблема с небольшим уменьшением размера заключается в том, что нам нужно обрабатывать количество строк более 8k. Я знаю, что это кажется непригодным для использования объемом данных, но у нас есть случаи использования в бизнесе, где это имеет смысл. - person Brian; 02.06.2010
comment
У меня тоже было это требование. Используя описанные выше методы, я смог использовать DataGrid с 10 000 строк и загрузкой страницы 5 МБ. (Я не помню цифр, но это дает вам представление о размере, с которым я имел дело.) Мне пришлось ограничиться 10 000 строк из возможных 110 000+ строк. Исходная загрузка страницы составляла 26 МБ. Вы значительно сэкономите место, удалив пробелы, компрессор jscript, компрессор css и так далее. Сначала зачистите пробел, посмотрите, сможете ли вы получить >1700. Если вы можете, то вы знаете, что это загрузка страницы. Если нет, то, возможно, проблема в данных. - person AMissico; 02.06.2010
comment
Я только что удалил iframe и вытащил только html для таблицы из веб-сервиса и поместил его во внутренний html div. Это по-прежнему вызывало IE8. - person Brian; 03.06.2010
comment
Вы получили пропуск ›1700 строк? Какова загрузка страницы в КБ? Вы используете встроенные стили или классы CSS? - person AMissico; 03.06.2010
comment
IE8 зависает? Вы запустили диспетчер задач SysInternal и проверили процесс? IE8 просто не отвечает? - person AMissico; 03.06.2010
comment
Вы использовали Fiddler для проверки ответа сервера, прежде чем он попадет в браузер на клиенте? - person AMissico; 03.06.2010
comment
-В настоящее время на странице используется сочетание встроенных стилей и классов css. -IE8 на самом деле просто закрывается и перезагружается. -Fiddler действительно показывает ответ, возвращая его, а затем фактически вылетает. - person Brian; 03.06.2010
comment
IE8 на самом деле просто закрывается и перезагружается. Я верю, что вы можете отключить это. - person AMissico; 03.06.2010
comment
Показывает ли Fiddler код ответа? Вы можете видеть, что это было до крушения? - person AMissico; 03.06.2010
comment
Вы не можете получить пропуск 1700+. Что произойдет, если вы начнете с 16:00? Сможете ли вы преодолеть отметку 1600+100 = ›1700+? - person AMissico; 03.06.2010