0

我想打开一个页面,但不是查看它,而是要求用户打印。

Content Disposition这与HTTP 标头的功能非常相似。
当设置为attachment它将询问用户将文件保存在哪里(而不是在浏览器中显示它)。

我有权为用户打开页面,因此我可以使用 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();在其中使用它并不适用于所有情况。

4

2 回答 2

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>7 中工作
请注意,与简单open()(如果工作)一样,这将无法跨站点工作。您不能window在弹出窗口或框架中访问不同域中页面的方法。

于 2013-10-02T04:36:34.697 回答
0

您已经混淆了服务器端语言和客户端语言的作用。

服务器端语言,例如 PHP 或 ASP 在服务器上执行操作,例如在网上商店计算价格。

Content-Disposition: attachment头在这方面有点奇怪,因为它控制客户端而不是服务器。

客户端语言(在本例中为 JavaScript)执行用户浏览器上发生的事情。

打印是客户端功能。您需要使用 JavaScript。

于 2013-10-01T07:48:34.647 回答