Chrome window.print () window.close () приводит к «предварительному просмотру печати не удалось».Решение? - PullRequest
13 голосов
/ 04 октября 2011

У меня есть страница для печати, которая открывается в новой вкладке или окне.Полученная страница открывает диалоговое окно печати.После того, как пользователь делает выбор в диалоговом окне печати, страница закрывает вкладку / окно.

window.print();
window.close();

Раньше это прекрасно работало в основных браузерах, но одна из последних версий Chrome ломает это (т.е. 14.0.835.202).

Я получаю следующее сообщение от плагина Chrome Print: «Ошибка предварительного просмотра печати».

У кого-нибудь есть решение закрыть вкладку / окно Chrome после печати?

Ответы [ 12 ]

31 голосов
/ 23 августа 2013

Мне только что удалось найти решение, которое подходит мне.Я начал с ответа из Перу, но не хотел использовать jQuery в этом решении.

window.onload = function () {
  window.print();
  setTimeout(function(){window.close();}, 1);
}

По какой-то причине Chrome не запускает таймер тайм-аута, пока не закроется диалоговое окно печати. ​​

10 голосов
/ 08 ноября 2011

Этот вопрос пользуется наибольшим спросом в Google, поэтому я подумал, что добавлю то, что нашел, хотя это не совсем отражает вашу ситуацию.Если у вас есть ссылка, которая вызывает window.print(), то ее обработчик onclick должен вернуть false или вы получите ошибку.Это верно, даже если ссылка является хешем и никуда не денется!

Печать недоступна, поскольку страница, которую вы пытались распечатать, была закрыта

Чтобы исправить это, выполнитеобязательно добавьте возвращаемое значение false для ссылки.

<a href="#" onclick="window.print(); return false;" >Print</a>

Вот ошибка Chromium, которая устраняет эту проблему.Он помечен как исправленный для Chrome 17 (еще не выпущен), и я проверил исправление в Chrome 18.

http://code.google.com/p/chromium/issues/detail?id=92107

6 голосов
/ 05 октября 2011

Я не думаю, что есть какие-либо стандартизированные события печати. В IE есть пара , но я понимаю, что это не поможет вам в Chrome.

Я думаю, у вас могут остаться только два варианта.Ручная кнопка закрытия или некоторая форма задержки с использованием setTimeout.

5 голосов
/ 10 февраля 2012

Подобная проблема у меня была.

FYI ДЛЯ ВСЕХ ОТ VER 17+ Я использовал плагин jquery, printElement и нашел способ отредактировать его, чтобы я мог закрыть окно, даже в Chrome ... затем они обновились до этой новой вещи для печати! У меня есть решение еще раз.

Предыдущий

Chrome used to open a seperate window containing just the element i wanted 
printed and its relative css.  That window then spawned the .print command 
which opened another window containing print preview. By adding a simple 50 
millisecond timeout i was able to close the previous window without hurting 
the print preview.

НОВАЯ проблема

Chrome no longer opens a new window for their print preview. Instead it 
opens a "dialog with overlay" in the current page to be printed (aka, our 
new blank page containing just the element for print). Thus, when my timer 
kicked in, it wouldn't close the page immediately, but as soon as the dialog 
code closed.  The problem was, it closed so fast, the print command never 
made it to its service and thus nothing was printed to pdf 
(what our clinic uses).

Новое решение

Я знал, что увеличение таймера не поможет, так как он просто закроется в конце и все еще может остановить печать диалога. Вместо этого я добавляю ссылку на скрипт к последней сборке jquery в заголовок новой страницы about, а затем добавляю указатель мыши на тело страницы для печати. При наведении ... ЗАКРЫТЬ !!! И угадайте, что ... Это работает ОТЛИЧНО !!!

В общем, если вы используете пустую страницу для печати в Chrome и вам нужно закрыть страницу после того, как ваш элемент / все, что напечатано, просто добавьте событие hover в тело этой страницы (или во внутренний html), которое закрывает окно Затем, когда вы выбрали метод печати и нажали «Печать», он распечатает и закроет диалоговое окно, оставив вам это раздражающее окно. Просто двигай мышкой скучу и виолу! надоедливое всплывающее окно исчезло!

3 голосов
/ 01 декабря 2015

Все приведенные выше решения не решили мою проблему, использование этого кода решило мою проблему

setTimeout(function () {
        mywindow.print();
        mywindow.close();
    }, 1000); 
2 голосов
/ 23 ноября 2012

добавить этот скрипт в ваше всплывающее окно печатидиалоговое окно печати наложения закрыто.следовательно, это работает точно так же, как вы хотели.

1 голос
/ 03 июня 2016

Для меня я не мог найти решение, поэтому я создал его.

Я создал невидимое текстовое поле и сфокусировался на нем, используя setInterval каждые 50 мс после вызова window.print (). Также я связал событие onfocus с текстовым полем, и когда оно запускается, я закрываю окно. Это проверено на Chrome, Firefox и Internet Explorer.

window.print();
setInterval(function () {
  document.getElementById("focustext").focus();
}, 50);
document.getElementById("focustext").onfocus = function () { window.close(); }
#focustext {
  border: none;
  height: 0px;
  width: 0px;
}
<input id="focustext" type="text" />
0 голосов
/ 01 марта 2016

Проверено сегодня работает для IE, FF, Chrome (включая исправление предварительного просмотра для Chrome)

    setTimeout(function () { window.print(); }, 500);
    window.onfocus = function () { setTimeout(function () { window.close(); }, 500); }
0 голосов
/ 06 июля 2015

у меня нормально работает ...

var newWin = window.open('', '');
//htmlPage is your html content 
setTimeout(newWin.document.write(htmlPage),1000);
// newWin.document.body.innerHTML = htmlPage;
newWin.document.close();
newWin.focus();
setTimeout(newWin.print(), 10000);
newWin.document.close();
newWin.close();
return false;
0 голосов
/ 12 января 2013

После полудня исследований и благодаря ответу @ SpYk3HH я нашел решение, которое работает в версиях, которые я сейчас использую:

IE: 9.0.8 ...

FireFox: 15.01

Хром: 23,0.1271,97 м

Safari: 5.1.7

При подготовке html для отображения на определенной странице для печати включите проверку для

if (oWindow == null || oWindow.closed || typeof(oWindow) == "undefined")

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

function PrintPage()
{
    self.print();
    self.onmouseover = (function() { window.close(); }
}

Причина, по которой это работает, заключается в том, что в основном мы все еще имеем дело с объектами и событиями. Браузеры могут вести себя по-разному в некоторых вещах, но у них всех есть общие интересы. Мы надеемся, что простое событие onmouseover всегда будет происходить, когда окно приобретает фокус, и, надеюсь, этот код не потеряет своей актуальности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...