2014-01-22 49 views
7

我知道調用瀏覽器的「打印」對話框中的兩個方法(我使用的搜索,當然):打印(的一部分)的網頁使用Javascript

  • document.print()
  • document.execCommand('print',false,null)

他們之間有什麼區別?支持跨瀏覽器?論文,文檔或標準?哪個更正確的使用?

另一個問題:什麼是最直接的方式來打印給定的網頁部分?我知道我們可以創建新窗口或iframe來調用上面兩種打印方法中的任何一種。哪一個有較少的陷阱?

+1

一個新窗口在大多數情況下,您可以使用document.print()。查看document.execCommand的文檔:https://developer.mozilla.org/en-US/docs/Web/API/document.execCommand –

+1

@ HarveyA.Ramer鏈接不會記錄任何'print'命令。 – 2016-02-03 11:46:59

+0

@torazaburo這裏有一個很好的GitHub打印可能性,包括execCommand('print')的例子:https://gist.github.com/Rast1234/8598949它看起來像使用這個jQuery插件:https:/ /github.com/jasonday/printThis –

回答

13

我測試過的打印跨瀏覽網頁的一部分不同的方式: 瀏覽器,火狐,歌劇(12和新的),IE11,10,9和8我試圖創造新的window,新iframe,或在頁面上使用existing iframe。然後嘗試.print().execCommand('print')

注:請記住,.PRINT()調用窗口,並.execCommand()調用文件。用於測試

代碼可以發現here

糾正我,如果我的測試代碼是錯誤的,我只是想找個做這個工作最清晰的方式。我的結論:

  • 歌劇院12無法打印網頁的一部分
  • IE的不print() I幀和窗口,除了當前窗口(?)。
  • documents上調用print()內部iframe或IE中創建的窗口在當前document上打破print()。小心!
  • jQuery插件printThis使用IE的技巧來完成這項工作,它只是工作。唯一的例外是Opera 12.順便說一句,這個插件使用print()
  • execCommand('print')幾乎可以在任何地方以任何方式工作(iframe,窗口)。儘管它不支持Firefox。
  • execCommand()回報false如果呼叫不成功,所以如果你不想使用插件和魔術,創建窗口或iframe,請撥打execCommand('print')如果返回false,叫print()

一件事:

創建iframe是棘手:您無法直接訪問其窗口文件(是的,你有ContentDocument屬性,跨瀏覽器的行爲不同)。你應該名稱它,然後撥打window.frames[name]得到窗口對象從該iframe。不要嘗試撥打window.frames(id) - 它會返回iframe

+2

在Android瀏覽器上,'window [iframeName] .document.execCommand('print')似乎打印整個頁面。你見過嗎? – 2016-02-03 11:48:41

+0

請注意,根據http://caniuse.com/#feat=document-exec命令,Android 5-6(Lollipop-Marshmallow)不支持此功能。 – 2016-02-03 11:58:58

+0

@torazaburo不,我的興趣只是桌面上的交叉。 – Rast

2

,在接受的答案提到的最後一個方法,那麼,最終看起來像這樣:

iframe = document.getElementById('iframe-id'); 
var printed = iframe.contentWindow.document.execCommand('print', false, null); 

if (!printed) window.print(); 

替代:

try { 
    iframe = document.getElementById('iframe-id'); 
    iframe.contentWindow.document.execCommand('print', false, null); 
} 
catch(e) { 
    window.print(); 
} 

通過printThis使用類似的方法

if (document.queryCommandSupported("print")) { 
    $iframe[0].contentWindow.print();        $iframe[0].contentWindow.document.execCommand("print", false, null); 
} else { 
    $iframe[0].contentWindow.focus(); 
    $iframe[0].contentWindow.print(); 
} 
0

你可以使用window.open和execComand的組合(saveas 例如:

<script type= "text/javascript"> 
function saveas() { 
    var oPrntWin = window.open("","_blank","width=1,height=1,left=1,top=1,menubar=yes,toolbar=yes,resizable=yes,location=no,scrollbars=yes"); 
    oPrntWin.document.open(); 
    oPrntWin.document.write(editeur.innerHTML); 
    oPrntWin .document.execCommand("SaveAs",true,"C:\\My Documents\\Saved Content.html"); 
oPrntWin.document.close(); 
} 
</script> 

editeur.html是我的文檔的一部分 你可以爲你的框架 做相同的替換書面方式由物業「SRC」爲體

+1

這個問題是關於發送一個頁面到打印機,而不是保存爲一個文件 – Rast