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

Печать JavaScript заблокирована Chrome, обходной путь?

Я знаю, что это обсуждалось здесь раньше, но я не нашел практического решения/обходного пути для этого, я надеюсь, если кто-нибудь поймет, как решить эту проблему!

Вот он:

Если вы пытаетесь часто вызывать метод window.print() на одной странице (как если бы пользователь нажимал кнопку печати) в Google Chrome, браузер выдает предупреждающее сообщение в консоли:

Игнорирование слишком частых вызовов для печати()

И ничего не происходит! Через несколько секунд все возвращается к нормальному состоянию, и диалог печати появляется в тот момент, когда вы снова вызываете команду window.print()! Хуже того, хорошие пользователи Chrome используют экспоненциальное время ожидания для страницы, которая вызывает команду печати, что означает, что больше пользователей нажимает кнопку на печать, тем больше он должен ждать появления диалогового окна печати!

Эта проблема была в хроме в течение некоторого времени (14 последующих версий) и подтверждена как ошибка Area-UI, я отправил его снова для команды google вчера, надеясь, что кто-то из команды Chrome сможет проверить, когда эта невероятная раздражающая функция будет исправлена!

Однако то, что я ищу здесь, является обходным решением этой проблемы, есть ли что-либо. Я могу сделать это, чтобы это работало? Моя компания разрабатывает очень транзакционную финансовую систему с большим количеством отчетов, требующих печати, и для всего лишь одного небольшого сбоя весь проект рискует запуском в моем любимом браузере Google Chrome.

Update:

Вот код в браузере Chrome, который вызывает эту функцию, и похоже, что требуется не менее 2 секунд, прежде чем кто-то снова вызовет команду печати, поэтому таймер с интервалом в 2 секунды в пользовательском интерфейсе может помешать войти в бесконечный вызов возврата! любые другие мысли?

4b9b3361

Ответ 1

Вы можете условно заменить функцию window.print():

// detect if browser is Chrome
if(navigator.userAgent.toLowerCase().indexOf("chrome") >  -1) {
    // wrap private vars in a closure
    (function() {
        var realPrintFunc = window.print;
        var interval = 2500; // 2.5 secs
        var nextAvailableTime = +new Date(); // when we can safely print again

        // overwrite window.print function
        window.print = function() {
            var now = +new Date();
            // if the next available time is in the past, print now
            if(now > nextAvailableTime) {
                realPrintFunc();
                nextAvailableTime = now + interval;
            } else {
                // print when next available
                setTimeout(realPrintFunc, nextAvailableTime - now);
                nextAvailableTime += interval;
            }
        }
    })();
}

Вместо использования внешнего таймера/оболочки безопасности вы можете использовать внутренний. Просто добавьте это, и window.print ведет себя безопасно в Chrome и, как правило, везде. (Кроме того, средства закрытия realPrintFunc, interval и nextAvailableTime являются закрытыми для нового window.print

Если вам нужно координировать вызовы window.print между несколькими кадрами, вы можете установить nextAvailableTime на родительской странице, а не в закрытии, чтобы все кадры могли получить доступ к общему значению с помощью window.parent.nextAvailableTime.

Ответ 2

Я столкнулся с одной и той же проблемой, и самым прямым решением для меня было просто создать новое окно, написать, что мне нужно, закрыть его и распечатать. Мне не пришлось иметь дело с ограничением Chrome, так как я изменил его таким образом, и мне не нужно отслеживать.

print_window= window.open();
print_window.document.write(print_css + divToPrint[0].outerHTML+"</html>");
print_window.document.close();
print_window.focus();
print_window.print();
print_window.close();

Ответ 3

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

"Рабочая"

Если вы думаете, что на самом деле думаете, что нажатие кнопки печати более одного раза в секунду/каждые несколько секунд помогает? Я имею в виду, что если операция window.print() требует, чтобы это не было ошибкой ваших кодов, и в любом случае в пользовательском интерфейсе должен быть "ждать и быть терпеливым".

Ответ 4

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

Затем сервер запускает процесс печати вручную, и между ними не будет браузера, что может помешать вам сделать это.

Ответ 5

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

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

Решение Abathur действительно работает намного лучше, чем вы могли ожидать. Я не уверен, буду ли я использовать его, но он работает.

Хорошая новость:

1) Задержка фактически снижена в более поздних версиях Chrome. Теперь он идет: [2, 2, 2, 4, 8, 16, 32, 32, ...].

2) Кто-то поднял вопрос 28 августа: http://code.google.com/p/chromium/issues/detail?id=50186 Если вы хотите, чтобы эта проблема была решена, пожалуйста, перейдите в нее.

Ответ 6

Больше никаких проблем! Ошибка исправлена ​​ как часть v.23, если я не ошибаюсь.

Итак, если цикл выпуска составляет каждые 6 недель, а Chrome 22 был выпущен 25 сентября, то к 6 ноября (aprox.) исправление будет в версии Chrome Stable