#javascript #google-chrome
#javascript #google-chrome
Вопрос:
У меня есть страница печати, которая открывается в новой вкладке или окне. Результирующая страница открывает диалоговое окно печати. После того, как пользователь сделает выбор в диалоговом окне печати, страница закрывает вкладку / окно.
window.print();
window.close();
Раньше это отлично работало в основных браузерах, но одна из последних версий Chrome нарушает это (т.Е. 14.0.835.202).
Я получаю следующее сообщение от того, что, как я полагаю, является плагином Chrome print: «Ошибка предварительного просмотра».
У кого-нибудь есть решение закрыть вкладку / окно Chrome после печати?
Комментарии:
1. Я бы также попытался использовать обработчик, который вы получили от
window.open
Ответ №1:
Мне только что удалось найти решение, которое мне подходит. Я начал с ответа из Перу, но не хотел использовать jQuery в этом решении.
window.onload = function () {
window.print();
setTimeout(function(){window.close();}, 1);
}
По какой-то причине Chrome не запускает таймер ожидания, пока диалоговое окно печати не будет закрыто.
Комментарии:
1. Это сработало для меня в IE, Chrome и Firefox. Я не тестировал ни в каких других браузерах.
2. Но когда я нажимаю ctrl P перед диалоговым окном предварительного просмотра. Вкладка закрывается. Есть ли какое-либо обходное решение
Ответ №2:
Этот вопрос является популярным в Google, поэтому я подумал, что добавлю то, что нашел, хотя это не совсем отражает вашу ситуацию. Если у вас есть ссылка, которая вызывает window.print()
, то ее обработчик onclick должен возвращать false, иначе вы получите ошибку. Это верно, даже если ссылка является хэшем и никуда не ведет!
Печать недоступна, поскольку страница, которую вы пытались распечатать, была закрыта
Чтобы исправить это, убедитесь, что вы добавили return false к ссылке.
<a href="#" onclick="window.print(); return false;" >Print</a>
Вот ошибка Chromium, которая устраняет эту проблему. Он помечен как исправленный для Chrome 17 (еще не выпущен), и я проверил исправление в Chrome 18.
Ответ №3:
Я не думаю, что существуют какие-либо стандартизированные события печати. В IE есть пара, но я понимаю, что это не поможет вам для Chrome.
Я думаю, у вас может остаться только два варианта. Кнопка закрытия вручную или какая-либо форма задержки setTimeout
.
Комментарии:
1. Ранее у меня были: window.print(); setTimeout(‘window.close()’, 1000); Раньше это работало с Chrome, но перестало работать в последней версии. Chrome сообщает: «Печать недоступна, поскольку страница, которую вы пытались распечатать, была закрыта». Если кто-то оспаривает, что кнопка закрытия является единственным вариантом, пожалуйста, дайте мне знать! Спасибо!
Ответ №4:
У меня была аналогичная проблема.
К ВАШЕМУ СВЕДЕНИЮ, НАЧИНАЯ С ВЕРСИИ 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 и вам нужно закрыть страницу после того, как ваш элемент / что-либо напечатано, просто добавьте событие наведения курсора мыши в теле этой страницы (или во внутреннем html), которое закрывает окно. Затем, когда вы выбрали метод печати и нажали печать, он напечатает и закроет диалоговое окно, оставив вам это раздражающее окно. Просто наведите курсор мыши на стрелку и АЛЬТ! раздражающее всплывающее окно ИСЧЕЗЛО!
Комментарии:
1. Это единственное решение, которое я нашел, которое действительно работает. Слава вам, сэр.
Ответ №5:
Все вышеприведенные решения не решают мою проблему, использование этого кода решило мою проблему
setTimeout(function () {
mywindow.print();
mywindow.close();
}, 1000);
Ответ №6:
добавьте этот скрипт во всплывающее окно печати
<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 вызывается только тогда, когда документ сфокусирован, что происходит только при закрытии диалогового окна overlay print. следовательно, это работает точно так же, как вы хотели.
Ответ №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, щелчок и нажатие клавиши, чтобы запустить нужное мне действие (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';
}
РЕДАКТИРОВАТЬ: печать в Chrome версии> = 17 работает так же, как IE / FF, поэтому убедитесь, что вы учитываете и это
Ответ №10:
После дня исследований и благодаря ответу @SpYk3HH я нашел решение, которое работает в версиях, которые я использую в настоящее время:
IE: 9.0.8…
FireFox: 15.01
Chrome: 23.0.1271.97 m
Safari: 5.1.7
При подготовке HTML-кода для отображения на странице, предназначенной для печати, включите проверку на
if (oWindow == null || oWindow.closed || typeof(oWindow) == "undefined")
а затем уведомите пользователя о временном включении всплывающих окон. Чтобы разрешить открытие вашей страницы, отобразите диалоговое окно печати и закройте при закрытии диалога печати, добавьте эту функцию в функцию загрузки для тела окна:
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;
Ответ №12:
Протестировано сегодня работает для IE, FF, Chrome (включая исправление предварительного просмотра для Chrome)
setTimeout(function () { window.print(); }, 500);
window.onfocus = function () { setTimeout(function () { window.close(); }, 500); }
Ответ №13:
Теперь у нас есть это событие: WindowEventHandlers.onafterprint (https://developer.mozilla.org/en-US/docs/Web/API/WindowEventHandlers/onafterprint ).
С помощью этого события вы можете выполнить следующие действия:
window.onafterprint = function() {
window.close();
};
window.print();