我想实现一个按钮,只打印我页面的某个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触发的对话仍然会打印整个页面。 任何想法为什么这在第一次按钮推动时无法正常工作?
答案 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" ... />
<强>代码强>
button.addEventListener(e => {
var printStyleSheet = document.getElementById('print-css-special');
printStyleSheet.removeAttribute('disabled');
window.print();
printStyleSheet.setAttribute('disabled', 'disabled')
});