Почему эта печать на основе JavaScript заставляет Safari обновить страницу? - PullRequest
27 голосов
/ 13 февраля 2012

На странице, над которой я работаю, есть функция javascript, выполняемая для печати частей страницы.По какой-то причине печать в Safari заставляет окно как-то обновляться.Я говорю как-то, потому что он на самом деле не обновляется, как при перезагрузке страницы, а скорее запускает «рендеринг» страницы с начала, то есть прокручивает вверх, флэш-анимация начинается с 0 и т. Д.

Эффект воспроизводится этой скрипкой: http://jsfiddle.net/fYmnB/

Нажатие на кнопку печати и завершение или отмена печати в Safari заставляют экран «побелеть» на секунду, что на моем реальном веб-сайте проявляется какчто-то "как" перезагрузка.Запуская кнопку печати с, скажем, Firefox, просто открывает и закрывает диалог печати, не затрагивая страницу скрипта.

Есть ли что-то в моем способе вызова метода печати в браузерах, которое вызывает это, иликак это можно объяснить - и желательно, чтобы избежать?

PS: На моем реальном сайте то же самое происходит с Chrome.В примере скрипта Chrome, похоже, не демонстрирует того же поведения, что и Safari.

Редактировать: Я также пытался установить кнопку печати на другом теге, чем привязка a, например span или button, но это не помогло с проблемой.

Редактировать: я столкнулся с этой проблемой с Safari 5.1.2 на Mac OS 10.6.8.В примере с jsfiddle поведение отображается в виде белого «мерцания», которое покрывает весь браузер после нажатия кнопки печати и закрытия (либо печати, либо прерывания) диалога печати. ​​

Редактировать: только что началось вознаграждение заэтот вопрос, поскольку я все еще ищу объяснение этому поведению браузера.Я более чем готов дать более подробную информацию по этому вопросу.Исходя из моего опыта в SO, не рекомендуется размещать ссылки на онлайн-страницы, однако я чувствую, что проблему действительно трудно воспроизвести.Я думаю, что "мерцание и повторный рендеринг", который я испытываю с размещенным jsfiddle, является, надеюсь, результатом той же проблемы.

Редактировать: Как объяснено в комментариях, открытие нового окна, содержащего текущее состояние приложениязатем печать и закрытие этого окна может быть исправлением, но я не считаю его достаточным ответом на имеющуюся проблему.

Ответы [ 5 ]

4 голосов
/ 15 февраля 2012

Если вы не можете найти способ решить проблему, вы можете получить быстрое решение следующим образом: var win=window.open() на той же странице, на которой вы находитесь затем win.print() это, затем win.close(). Надеюсь, это поможет.

3 голосов
/ 22 февраля 2012

К сожалению, у меня нет решения. но так как я смог воспроизвести это в Safari и Webkit с помощью скрипки, я подумал, что по крайней мере предложу свои наблюдения:

  1. Потеря света не произойдет, если вы сразу нажмете кнопку диалога Print. Вам нужно подождать несколько секунд, прежде чем нажать «Печать», чтобы увидеть белый цвет. На OSX 10.6.8 я вижу порог, отмеченный появлением вращающегося пляжного мяча.
  2. Когда мышь остается неподвижной после нажатия кнопки «Печать», страница остается белой , пока вы снова не переместите мышь (пляжный мяч все еще вращается).

Надеюсь, это как-нибудь поможет.

2 голосов
/ 02 марта 2012

Я не уверен, что это решит вашу проблему, но я недавно нашел очень хороший плагин Jquery для печати только определенной части вашей веб-страницы.

Вы должны попробовать его :) У него есть некоторыеочень крутые параметры, чтобы настроить его в соответствии с вашими потребностями.

Взгляните здесь .

Почему ваша страница обновляется?Вот мой ответ на это.Функция window.print () напечатает весь контент вашей страницы.Так как я прочитал, что вы хотите напечатать только часть страницы, я думаю, что вы используете какую-то функцию для удаления всего нежелательного контента со страницы на очень короткий момент, затем вы вызываете функцию window.print () и после этогоВы снова помещаете весь оригинальный контент на экран.В результате получается очень короткая флэш-память, которая выглядит так, как будто ваша страница обновляется и загружает все части флэш-памяти снова.

У меня вчера была такая же проблема, и этот плагин jquery действительно помог мне.Я надеюсь, что это вам тоже поможет.

Хорошего дня!

2 голосов
/ 22 февраля 2012

Поскольку кажется, что window.print() не является частью какого-либо стандарта , браузеры могут применять его любым способом, который они выберут.

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

0 голосов
/ 17 февраля 2012

Попробуйте это в вашей функции:

document.write("<script type='text/javascript'>window.print()</script>");

Я ссылаюсь на этот стек:

После window.open не может печатать в Safari для Mac

Обновление, Попробуйте:

document.writeln("<script type='text/javascript'>window.print()</script>");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...