Подтвердить что ты не робот

Chrome window.print() window.close() приводит к ошибке "Предварительный просмотр печати". Решение?

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

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

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

Получаю следующее сообщение из того, что, по моему мнению, является плагином печати chrome: "Не удалось распечатать предварительный просмотр".

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

4b9b3361

Ответ 1

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

Думаю, у вас может быть только два варианта. Кнопка закрытия вручную или некоторая форма задержки с помощью setTimeout.

Ответ 2

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

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

По какой-то причине Chrome не запускает таймер таймаута до тех пор, пока диалог печати не будет закрыт.

Ответ 3

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

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

Чтобы исправить это, убедитесь, что вы добавили return 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

Ответ 4

Аналогичная проблема у меня была.

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

Предыдущая

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).

НОВОЕ решение

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

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

Ответ 5

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

setTimeout(function () {
        mywindow.print();
        mywindow.close();
    }, 1000); 

Ответ 6

добавьте этот script в окно всплывающей печати

<script src="/assets/print_window_close.js" type="text/javascript"></script>

содержимое print_window_close.js

jQuery(document).ready(function() {

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

});

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

Ответ 7

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

То, что я сделал, это создать невидимое текстовое поле и сосредоточиться на нем, используя 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" />

Ответ 8

мой текущий взлом. в основном, сразу после window.print(), я связываю mousemove, click и keypress, чтобы вызвать действие, которое я хочу (window.close() или window.location.href= где-то;). Конечно, действие не происходит, если пользователь делает ничего. Но это работает очень хорошо. (ну, я могу жить до тех пор, пока ошибка не будет исправлена ​​как минимум)

/* 
// alternative to window.print() for dedicated print windows (had issue with <body onload=window.print()...
// not used anymore.
$('<a id="aprint" href="#" onclick="return window.print()" class="invisible"></a>').appendTo('body');
$('#aprint').trigger('click');
*/
$('body, select, input, textarea, button, submit, form').prop('disabled', true);
window.print();
setTimeout(function() {
    $('body').bind('mousemove click keypress', function () {
        window.location.href=home;                      
    });
}, 200);    

Ответ 9

Мое решение:

window.print();
if(/Chrome/.test(navigator.userAgent)){
  $(window).focus(function(){
    window.location = '/print-thank-you';
  });
} else {
  window.location = '/print-thank-you';
}

EDIT: печать в версии Chrome >= 17 работает точно так же, как IE/FF, поэтому убедитесь, что вы также учтите это.

Ответ 10

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

IE: 9.0.8...

FireFox: 15.01

Chrome: 23.0.1271.97 м

Safari: 5.1.7

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

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

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

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

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

Ответ 11

Это отлично работает для меня...

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;