用于打印URL的链接

时间:2013-10-01 07:41:09

标签: javascript html http printing http-headers

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

这与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();并不适用于所有情况。

2 个答案:

答案 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页面方法。