【问题标题】:Javascript - toggle print stylesheet dynamically before window.print()Javascript - 在 window.print() 之前动态切换打印样式表
【发布时间】:2016-01-11 20:59:17
【问题描述】:

我想实现一个按钮来仅打印页面的某个 div,同时让用户可以打印整个页面。我正在将此代码用于打印样式表,到目前为止效果很好:Print <div id=printarea></div> only?

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

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 触发的对话仍然会打印整个页面,因为它应该。 任何想法为什么这在第一次按下按钮时无法正常工作?

【问题讨论】:

  • 为什么不直接使用 CSS 媒体查询? developer.mozilla.org/en-US/docs/Web/CSS/Media_Queries/…
  • 我想我只是没有理由制作单独的样式表并交换它们。打印媒体查询将仅在打印页面时处于活动状态。
  • 是的,这就是问题所在。在用户按下按钮以打印该特定容器(routeInstructions)后,我需要它处于活动状态。但当用户尝试打印整个页面时,它不应该处于活动状态。我会看看你的链接,谢谢。
  • 您是否有指向您正在尝试此操作的页面的链接?
  • 仅适用于最新的稳定版本 - openrouteservice.org 。我目前正在使用本地服务器。

标签: javascript jquery html css printing


【解决方案1】:

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

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

【讨论】:

  • 马特,谢谢你的回答。是的,这可能是时间问题。请看下面我的回答。异步 ajax 函数对我来说似乎比 setTimeout 更可靠
  • @HLeuschn 我对$(document).ready 在您的解决方案中所做的工作非常感兴趣。在单击按钮之前不会触发handlePrintRouteInstructionsClick()。我敢说,如果用户单击一个按钮,则文档已完成加载,据我所知,不再需要 $(document).ready
  • @Matt,你是对的,不需要它。感谢您的提示。
【解决方案2】:

我设法找到了解决方案。我猜问题是该文件尚未加载,但 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();
        }
    });
}

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

【讨论】:

  • 我的解决方案预先加载 CSS 并保持禁用状态,check it out
【解决方案3】:

我会将媒体查询与&lt;link&gt; 的禁用功能结合起来。

  • 创建样式表指定用户单击按钮时的打印样式,默认禁用:&lt;link id="print-css-special" disabled="disabled" ... /&gt;
  • 一旦用户单击“打印某些区域”,您就启用样式表,打印,然后禁用样式表

代码

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

【讨论】:

  • 这看起来可行,但它对我不起作用。样式表一直处于启用状态,尽管我像这样添加它&lt;link id="printCss" disabled="disabled" rel="stylesheet" type="text/css" href="css/printRouteInstructions.css" /&gt; 并按照您的建议实现按钮单击。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-20
  • 2011-01-21
相关资源
最近更新 更多