2014-10-08 35 views
0

我以前的同事改寫window.print方法:如何恢復被覆蓋的JavaScript的打印方法

function print(data){ 

    var window_print = window.open('', 'my div', 'height=768, width=1024'); 

    window_print.document.write('<!DOCTYPE html><html><head><title>Печать</title></head><body>' + data + '</body></html>'); 

    window_print.print(); 
    window_print.close(); 
} 

我的目的是使用該功能的默認行爲:只打印當前頁面,我說:

if(data) {....} else { window.print() }

當然我收到錯誤:「太多的遞歸:window.print();」

我的問題是如何調用默認行爲window.print()?

回答

1

編輯:好吧,看來printwindow在某些瀏覽器的自己的財產,而不是別人。因此,只是緩存的window.print值:

var printWindow = window.print; 

// define your new print function here 
var print = function(data) { ... }; 

// then later: 
printWindow.call(window); 

注意:如果你正在做的這一切都在全球範圍內,那麼你需要使用函數表達式(var print = ...)來定義新的print而不是函數聲明(function print(data) { ... }),因爲函數聲明被提升到其作用域的頂部,因此在您有機會緩存​​它之前將會發生重定義。如果您沒有在全球範圍內執行此操作,則無關緊要,因爲新的print不會覆蓋window.print,無論它是如何定義的。

原始

嘗試:

Object.getPrototypeOf(window).print.call(window); 

print似乎並不爲自己的window財產,這意味着新定義print只是陰影的東西進一步上漲的原型鏈。您可以通過使用Object.getPrototypeOf向上移動原型鏈來繞過此陰影。

您還需要使用call,以便print方法接收到this的正確值。

+0

@yonishepelev啊,它看起來像'print'是窗口的'firefox'了自己的財產。看起來您必須在定義新值之前緩存'print'的值,並使用緩存的引用。 – BYossarian 2014-10-08 21:00:41

+0

@Byossarian不幸的是,你的編輯與我原來的答案一樣。 – Rhumborl 2014-10-09 08:18:19

+0

@Rhumborl嗯,我應該更加明確。謝謝。 – BYossarian 2014-10-09 10:38:47

0

您需要將原始打印方法作爲另一個屬性存儲在窗口中,就在您自己定義的print()之前。

編輯:您還需要明確定義新的print功能window.print = function(){...}而非function print(){...}爲了能夠訪問原始 - 看到答案漂亮鏈接herehere。這對您調用方法的方式沒有任何影響。

window.originalPrint = window.print; 
 

 
window.print = function(data) 
 
{ 
 
    if(data) 
 
    { 
 
     document.getElementById('foo').innerHTML = data; 
 
    } 
 
    else 
 
    { 
 
     window.originalPrint(); 
 
    } 
 
}
<div id="foo"></div> 
 

 
<button onclick="window.print('hello')">print('hello')</button> 
 
<button onclick="window.print()">print()</button>

+0

好的我計算了一下發生了什麼,並自己學到了一些東西:)並更新了我的回答 – Rhumborl 2014-10-09 08:27:07

+0

非常感謝@Rhumborl!是工作! – yonishepelev 2014-10-09 13:24:26