2013-10-01 104 views
0

我想打開一個頁面,但不要查看它,它會要求用戶打印。打印URL的鏈接

這非常類似於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

可能的重複[我們可以使打印按鈕沒有JavaScript?](http://stackoverflow.com/questions/1720013/can-we-make-print-button-without-javascript) –

+0

HTTP不是HTML,但是看起來好像你的回答顯示HTTP沒有好的東西, – Hashbrown

+0

也是,我想這個問題是指打印它當前所在的頁面。不鏈接到其中將出現打印對話的文檔*。 – Hashbrown

回答

0

您已經混淆了服務器端和客戶端語言的功能。

服務器端語言(如PHP或ASP)在服務器上執行某些操作,例如計算網上商店的價格。

Content-Disposition: attachment標題在這方面有些古怪,因爲它控制的是客戶端而不是服務器。

客戶端語言(本例中爲JavaScript)執行用戶瀏覽器上發生的操作。

打印是客戶端功能。你需要使用JavaScript。

+0

正好。我正在釣更多的這些古怪,如果他們存在 – Hashbrown

+0

@Hashbrown沒有什麼可打印的。 –

0

我決定張貼在Javascript的答案,因爲它實際上不是小事:(
我在這個問題寫過將無法正常工作跨瀏覽器(它實際上是火狐,IE不是這一次!)

問題是,在Firefox,print()實際上是非阻塞的,所以我在上面的例子中,之前的Firefox打印了新open()「d窗口將關閉!

所以,你可以離開窗口打開,或者你可以嘗試使用隱藏幀;

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不同域上的頁面方法,無論是在彈出窗口還是在框架中。