IE8 зависает после нажатия кнопки «печать» в диалоге печати браузера при рендеринге содержимого, собранного с помощью javascript через iframe

#javascript #jquery #iframe #printing #internet-explorer-8

#javascript #jquery #iframe #печать #internet-explorer-8

Вопрос:

Я работаю над этой проблемой уже пару недель и не могу ее решить. О проблеме сообщает только небольшое подмножество пользователей IE8. Я попытался воспроизвести проблему, запустив виртуальную машину Windows xp, IE8 (ту же версию, о которой сообщают пользователи), и синхронизировал настройки безопасности браузера. Несмотря на это, я не могу воспроизвести проблему для себя. Воспроизведение было бы здорово, но в конечном итоге все, что имеет значение, — это обнаружение источника проблемы.

Способ работы функции печати:

  1. Пользователь нажимает ссылку на странице, которая запускает функцию javascript.
  2. Javascript выполняет некоторую логику для получения содержимого подраздела страницы (на основе которого была нажата ссылка для печати).
  3. «Для элементов exCanvas установлено значение display: none», потому что я обнаружил, что они вызвали ошибки печати. 4. Элемент печатается с использованием слегка измененной версии «Print Element», найденной здесь: http://projects.erikzaadi.com/jQueryPlugins/jQuery.printElement /

Затем пользователю предлагается диалоговое окно печати из IE. Когда пользователь нажимает кнопку «печать», IE зависает и может быть отключен только путем завершения процесса. Если пользователь нажимает «отмена», IE не зависает, и пользователь может продолжить свои дела.

Пользователь может использовать функцию печати по умолчанию для печати всей страницы без проблем. Зависает браузер только тогда, когда они использовали мою функцию печати на основе javascript.

Я попросил пользователя запустить IE8 без добавления, просмотреть их журнал событий Windows и отключить некоторые распространенные проблемы в IE8.

Я действительно озадачен тем, где в процессе может возникнуть эта ошибка. Кажется, это указывает на мой javascript, но меня ставит в тупик, что ошибка возникает после нажатия кнопки печати диалога печати браузера. Я бы ожидал, что ошибка возникнет до того, как функция window.print() будет вызвана в сфокусированном iframe.

Буду признателен за любую помощь, поскольку эта ошибка вызвала у меня немало разочарований.

Спасибо.

Редактировать—————————————-

Я использую стандартную библиотеку печати jquery выше со слегка настраиваемой функцией _getMarkup, как показано ниже:

     function _getMarkup(element, opts) {
    var $element = $(element);
    var elementHtml = _getElementHTMLIncludingFormElements(element);

    var html = new Array();
    html.push('<html><head><title>'   opts["pageTitle"]   '</title>');
    if (opts["overrideElementCSS"]) {
        if (opts["overrideElementCSS"].length > 0) {
            for (var x = 0; x < opts["overrideElementCSS"].length; x  ) {
                var current = opts["overrideElementCSS"][x];
                if (typeof (current) == 'string')
                    html.push('<link type="text/css" rel="stylesheet" href="'   current   '" >');
                else
                    html.push('<link type="text/css" rel="stylesheet" href="'   current["href"]   '" media="'   current["media"]   '" >');
            }
        }
    }
    else {
        $("link", document).filter(function () {
            return $(this).attr("rel").toLowerCase() == "stylesheet";
        }).each(function () {
            html.push('<link type="text/css" rel="stylesheet" href="'   $(this).attr("href")   '" media="'   $(this).attr('media')   '" >');
        });
    }
    //Ensure that relative links work
    html.push('<base href="'   _getBaseHref()   '" />');
    html.push(hieviews.getPrintCSS($("head").html()));
    html.push('</head><body style="'   opts["printBodyOptions"]["styleToAdd"]   '" class="'   opts["printBodyOptions"]["classNameToAdd"]   '">');

    var contentStr = $('<div></div>');
    $(contentStr).append($('#disclaimer').html());
    $(contentStr).append($('#nav').html());
    $(contentStr).append("<hr/><h3 class='table-header'>" $(".title",$(element).parent().parent().children(":first")).text()  "</h3>");
    $(contentStr).append('<div>'   elementHtml   '</div>');

    var refTable = "";
    var total = $(".show-tooltip-text, .hidden_report",contentStr).each(function(index){
        if(index == 0){
            refTable  = "<h3>Reference Table</h3><table class="dataTable" id="cite"><thead><tr><th>ref</th><th>Content</th></tr></thead><tbody>";
        }
        //if($(this).is(":hidden")){
        if($(this).css("display") != "block"){
            $(this).parent().append("<sup>*ref: #" index "</sup>");
            refTable  = "<tr><td>" index "</td><td>" $(this).html() "</td></tr>";
        }
        if(index == total){
            refTable  = "</tbody></table>";
        }
    }).length;
    $(contentStr).append(refTable);
    html.push($(contentStr).html());

    html.push('<script type="text/javascript">function printPage(){focus();window.print();'   ((!$.browser.opera amp;amp; !opts["leaveOpen"] amp;amp; opts["printMode"].toLowerCase() == 'popup') ? 'close();' : '')   '}</script>');
    html.push('</body></html>');
    return html.join('');
};
  

Комментарии:

1. «Когда пользователь нажимает кнопку «печать», IE зависает и может быть отключен только путем завершения процесса». — Это действительно похоже на проблему ОС. И если вы не можете воспроизвести проблему или предоставить какой-либо код для проверки, мы мало что можем сделать, кроме как дать вам указания по устранению неполадок … тогда мы не по теме.

2. Я думал о чем-то в этом роде, но тот факт, что они могут просто перейти на мою страницу и перейти «файл -> печать», и это работает нормально, заставляет меня думать, что это как-то связано с javascript или моим процессом печати. Что касается проверки кода, я использую библиотеку, упомянутую выше. Я также добавил изменения, которые я внес в вышеприведенный пост, которые довольно минимальны. Я также буду рад любым советам по устранению неполадок, поскольку чувствую, что исчерпал свой арсенал.

3. У меня были похожие проблемы со страницей, где содержимое отображалось в JS, и имел CSS, который скрывал большинство элементов на странице. Страница была в основном обычной страницей с другим CSS. Обычная версия работала нормально, но как только была введена новая таблица стилей, начались проблемы. Итак, мое лучшее предположение заключалось в том, что тяжелое скрытие CSS и тяжелое отображение JS (map) было слишком сложным для IE8.