Javascript - 在window.print()之前动态切换打印样式表

时间:2016-01-11 20:59:17

标签: javascript jquery html css printing

我想实现一个按钮,只打印我页面的某个div,同时让用户可以打印整个页面。我使用此代码的打印样式表到目前为止工作正常:Print <div id=printarea></div> only?

现在我正在做的是包含一个单独的样式表,它只包含此处建议的打印配置:https://stackoverflow.com/a/18497062/5775547,并在我的按钮的onclick函数中切换包含@media print的样式表:

function handlePrintRouteInstructionsClick() {
    routeInstructions.show();
    $('link[id="printCss"]').prop("href", "css/printRouteInstructions.css");
    window.print();
    $('link[id="printCss"]').prop("href", "");
}

css包含如下:

<link rel="stylesheet" type="text/css" href="" id="printCss" media="print"/>

现在当我按下按钮时,它仍会打印整个页面。有趣的是,当第二次按下按钮时,它按预期工作,只打印指定的div。 Ctrl + P触发的对话仍然会打印整个页面。 任何想法为什么这在第一次按钮推动时无法正常工作?

3 个答案:

答案 0 :(得分:0)

您是否尝试使用setTimeout()在样式表更改和触发打印功能之间引入延迟?可能只需要几百毫秒或更短的时间。这听起来像是一个时间问题。我尝试过这样的事情:

function handlePrintRouteInstructionsClick() {
    routeInstructions.show();
    $('link[id="printCss"]').prop("href", "css/printRouteInstructions.css");
    setTimeout(window.print(), 200);
    $('link[id="printCss"]').prop("href", "");
}

答案 1 :(得分:0)

我设法找到了解决方案。我想问题是该文件尚未加载但window.print()已被调用。然后在第二次单击时,文件仍然在缓存中,因此更改足够快。我设法使用$(document).ready及其success属性来解决此问题:

function handlePrintRouteInstructionsClick() {
    $.ajax({
        url:"css/printRouteInstructions.css",
        success:function(data){
            var style = $("<style />", {
                id  : 'printCss',
                type: 'text/css',
                html: data
            }).appendTo("head");
            routeInstructions.show();
            window.print();
            style.remove();
        }
    });
}

所以基本上我正在加载文件,等待它被加载,在标题中添加它作为样式,打印然后再次删除样式。 可能既不好也不高效,但似乎工作正常。

答案 2 :(得分:0)

我会将媒体查询与<link>的禁用功能结合起来。

  • 创建样式表指定用户单击按钮时的打印样式,默认情况下,它将被禁用:<link id="print-css-special" disabled="disabled" ... />
  • 用户点击&#34;打印某个区域&#34;后,启用样式表,打印,然后禁用样式表

<强>代码

button.addEventListener(e => {
   var printStyleSheet = document.getElementById('print-css-special');
   printStyleSheet.removeAttribute('disabled');               
   window.print(); 
   printStyleSheet.setAttribute('disabled', 'disabled')
});