2010-09-01 2 views
1

Когда пользователь выбирает «Файл> Печать» в браузере, такие как Firefox или Internet Explorer, или нажимает на ссылку, которая работает ниже JavascriptПроверьте, если пользователь выбрал для печати с помощью JavaScript

window.print(); 

Есть ли способ условно проверить этот режим и отключить НЕКОТОРЫЙ javascript.

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

EDIT: Unrelated плагиной есть изменения стиля, сделанные с помощью JavaScript, который используется для создания закладок пользовательского интерфейса, и я сделал печать отдельных CSS, чтобы переопределить стиль и она прекрасно работает, когда я использую веб-разработчик Firefox панель инструментов> CSS> Отображать CSS по типу мультимедиа> Печать .. но когда я распечатываю его, он не работает, javascript берет верх и меняет стиль. Если я полностью отключу javascript, тогда печать, очевидно, отлично работает.

Благодаря

+1

Почему вы не можете просто отображать: нет в специальной таблице стилей печати? –

+0

Я уже пробовал, узлы не являются стандартными, а дисплей: none! Important; css ничего не изменил. – Pricey

+0

@Pricey: у вас, вероятно, нет этой проблемы, но я думал, что дам вам знать, что современные браузеры имеют лучшее решение. Подробнее см. Мой ответ ниже. –

ответ

3

Вы можете сделать:

window.old_print=window.print 
window.print=function() { 
    alert('doing things'); 
    window.old_print(); 
} 

, но это будет только поймать звонки на print() изнутри страницы JavaScript.

Вы пытались положить !important в таблицу стилей для печати?

+0

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

19

Существует универсальное решение для этого, а также немного хакеров для старых браузеров. Вы можете переопределить метод print() во всех браузерах:

(function (oldPrint) { 
    window.print = function() { 
     document.getElementById("hideThis").style.display = 'none'; 
     oldPrint(); 
    } 
})(window.print); 

Проблема здесь состоит в том, что он не будет срабатывать для пользователей клавиш Ctrl + P или доступ к меню файлов для печати. Internet Explorer имеет решение по пути onbeforeprint события:

if ("onbeforeprint" in window) { 
    var hideEl = document.getElementById("hideThis"); 
    window.onbeforeprint = function() { 
     hideEl.style.display = 'none'; 
    } 
    window.onafterprint = function() { 
     hideEl.style.display = ''; 
    } 
} 

Что касается других браузеров, вы можете добавить прослушиватель событий для печати MediaQueryList в detailed by TJ VanToll in another answer:

if (window.matchMedia) { 
    var mqList = window.matchMedia("print"), 
     hideEl = document.getElementById("hideThis"); 

    mqList.addListener(function (mql) { 
     hideEl.style.display = mql.matches ? 'none' : ''; 
    }); 
} 

И положить все это вместе:

(function() { 
    var hideEl = document.getElementById("hideThis"); 

    // HTML5 spec, IE 5.5+, Firefox 6.0+ 
    if ("onbeforeprint" in window) { 
     window.onbeforeprint = function() { 
      hideEl.style.display = 'none'; 
     } 
     window.onafterprint = function() { 
      hideEl.style.display = ''; 
     } 
    } 

    // Chrome 9+, Opera 12.1+, Safari 5.1+ 
    else if (window.matchMedia) { 
     var mqList = window.matchMedia("print"); 

     mqList.addListener(function (mql) { 
      hideEl.style.display = mql.matches ? 'none' : ''; 
     }); 
    } 

    // Your fallback method, only working for JS initiated printing 
    else {  
     (function (oldPrint) { 
      window.print = function() { 
       hideEl.style.display = 'none'; 
       oldPrint(); 
      } 
     })(window.print); 
    } 
})(); 
+0

См. Обходной путь для других браузеров [в этом новом SO-ответе] (http://stackoverflow.com/a/11060206/71650) – Nathan

+0

@Nathan: Спасибо, я обновил ответ и зачислил ваш источник. –

+0

Прохладный, я впечатлен, как всегда. – Nathan

Смежные вопросы