Ошибка window.matchMedia('print') в Firefox и IE

У меня есть кнопка печати, которая запускает функцию печати на любой веб-странице. Кнопка скрывается, как только пользователь нажимает на нее, и показывает, завершил ли пользователь печать или нажал кнопку закрытия в окне печати. Он отлично работает в Chrome, но не работает в Firefox и IE.

<input type="button" onclick="launchPrint()" value= "Print me" />


function launchPrint(){
$(".print-box").hide();
window.print();
}

(function() {
    if (window.matchMedia) {
        var mediaQueryList = window.matchMedia('print');
        mediaQueryList.addListener(function(mql) {
            if (!mql.matches) {
                $(".print-box").show();
            }
        });
    }
}());

Любые предложения, что я могу пропустить?

2 ответа

К сожалению, у меня та же проблема, что и у вас, и я провел небольшое исследование. На данный момент кажется, что ошибка существует в последних версиях FF и IE до сих пор, и она не была исправлена.

Вы можете проверить эту ошибку для Firefox: https://bugzilla.mozilla.org/show_bug.cgi?id=774398

Я обнаружил, что у другого человека возникла та же проблема, что и у нас, и у него нет действительно удовлетворительного ответа: https://social.technet.microsoft.com/Forums/office/en-US/bc3ca05e-b4ef-425b-8bbd-d3f700a8c85e/windowmatchmedia-not-firing-for-print-in-ie?forum=ieitprocurrentver

Если я когда-нибудь найду решение, я отредактирую это.

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

function printUpdate() {
    jQuery.each(Highcharts.charts, function(index, value){
        value.reflow();
    });
};
var mediaQueryList = window.matchMedia('print');
if(navigator.appVersion.indexOf("MSIE 8.")!==-1)//For IE8
{
    document.attachEvent(function (mql){printUpdate();}, mediaQueryList);
}
else
{
    if (window.matchMedia) {
        mediaQueryList.addListener(function (mql) {
            if (mql.matches)
            {
                printUpdate();
            }
        });
    }
}

window.onbeforeprint = printUpdate;

Это прекрасно работает в Chrome. Но FF и IE11 не сработают.

Возможно, вы захотите посмотреть на событие onafterprint. По крайней мере, это запускается Firefox и IE, поэтому с потенциальной защитой (чтобы событие не срабатывало несколько раз) для вашего варианта использования вы можете прослушать оба matchMedia("print") и onafterprint событие.

Другие вопросы по тегам