2010-09-01 39 views
1

打印当用户选择“文件>打印”上的浏览器如Firefox或Internet Explorer,或链接的点击运行下面的JavaScript检查,当用户选择使用javascript

window.print(); 

有没有一种方法来有条件地检查这种模式并禁用某些JavaScript。

我想这样做,因为我有一个插件添加了它自己的自定义标记为圆形的边界,甚至在打印特定的样式表我不能覆盖这些样式,我不想在打印时出现边框离开页面。

编辑:无关的插件,还有一些用于创建一个选项卡式用户界面通过javascript实现风​​格的变化,我已经做了打印特定CSS覆盖的造型,当我使用Firefox的Web开发人员能正常工作工具栏> CSS>按媒体类型显示CSS>打印..但是当我打印出来它不工作,JavaScript接管并改变样式..如果我完全禁用JavaScript,然后打印显然再次正常工作。

感谢

+1

为什么不能在打印特定的样式表中显示:none? – 2010-09-01 15:20:52

+0

我已经试过了,节点不标准,显示:none!important; css什么也没变。 – Pricey 2010-09-01 15:24:42

+0

@Pricey:你可能没有这个问题了,但我想我会让你知道现代浏览器有更好的解决方案。详情请参阅下面的答案。 – 2013-01-15 21:43:00

回答

3

你可以这样做:

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

但这只会赶上从页面的JavaScript里面print()电话。

您是否尝试将!important放在特定于打印的样式表上?

+0

两个答案都很清楚,我无法覆盖每一个案例,所以我陷入了一片腌制。谢谢您的帮助。 – Pricey 2010-09-01 15:34:25

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 2013-01-15 21:01:25

+0

@Nathan:谢谢,我已经更新了答案并记录了您的来源。 – 2013-01-15 21:41:43

+0

酷,我一如既往的印象深刻。 – Nathan 2013-01-15 22:37:16