我希望打开一个页面,但不是查看它,而是要求用户打印。
这与Content Disposition
HTTP标头的功能非常相似。
设置为attachment
时,它会询问用户保存文件的位置(而不是在浏览器中显示)。
我有权为用户打开页面,因此我可以use javascript:
var doc = open(url); //open the link for them instead of using an anchor href
doc.print(); //ask them to print it, this is a blocking call until the user is done
doc.close(); //immediately close the window so the user isn't interrupted
但我真的希望有一些可以使用的服务器端标志,是否有这样的事情?
正在打开的页面不一定是HTML文档,因此在其中使用window.print();window.close();
并不适用于所有情况。
答案 0 :(得分:0)
您已经混淆了服务器端和客户端语言的作用。
服务器端语言(如PHP或ASP)在服务器上执行操作,例如计算网上商店的价格。
Content-Disposition: attachment
标题在这方面有点奇怪,因为它控制客户端而不是服务器。
客户端语言 - 在本例中为JavaScript - 执行用户浏览器上发生的事情。
打印是客户端功能。你需要使用JavaScript。
答案 1 :(得分:0)
我决定在Javascript中发布一个答案,因为它实际上并非无足轻重:(
我在问题中所写的内容不适用于浏览器(这次实际上是Firefox,而不是IE!)
问题是,在Firefox中,print()
实际上是非阻塞的,所以在上面的例子中,新的open()
'窗口会在Firefox打印之前关闭!
因此,您可以将窗口保持打开状态,也可以尝试使用隐藏的框架;
function printUrl(url) {
var frame = document.createElement('iframe');
frame.setAttribute('src', url);
//must be in the DOM to work in Firefox/IE
document.body.appendChild(frame);
//since it's in the DOM we need to hide it (lest we ruin our page layout)
//can't use 'display:none' or 'visibility:hidden' because you can't get focus (needed for IE)
//'z-index:-1' & 'opacity:0' wont help if there is no background in the elements above it and someone clicks through to it
frame.style.position = 'absolute';
frame.style.left = '-9999px';
//when it is loaded, print it
function printFrame() {
//have to get focus in IE
frame.contentWindow.focus();
//print!
frame.contentWindow.print();
/* cant remove the element because print() is non-blocking in FF
* (I.e. it would remove the frame before it was printed!)
//cleanup
//document.body.removeChild(frame);*/
};
//if it was cached, it may already be done (onload wont fire, IE8)
if (frame.contentWindow && frame.contentDocument.readyState == 'complete')
printFrame();
else {
if (frame.addEventListener)
//W3C
frame.addEventListener('load', printFrame, false);
else
//IE<9
frame.attachEvent('onload', printFrame);
}
}
经测试可在FF,Chrome和IE中使用&gt; 7
请注意,与简单open()
一样(如果有效),这将不适用于跨站点。您无法在弹出窗口或框架中访问其他域上的window
页面方法。