如何恢复覆盖的javascript打印方法

如何恢复覆盖的javascript打印方法,javascript,Javascript,我以前的同事重写window.print方法: 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>&l

我以前的同事重写window.print方法:

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();
}
功能打印(数据){
var window_print=window.open(“”,'my div','height=768,width=1024');
窗口打印文件写入(“Пчаааа”+数据+”;
window_print.print();
window_print.close();
}
我的意图是使用该函数的默认行为:只打印当前页面,并添加:

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

当然,我收到了错误:“太多的递归:window.print();”


我的问题是如何调用默认的行为窗口.print()?

Edit:好的,在某些浏览器中,
print
似乎是
window
的自有属性,而在其他浏览器中则不是。因此,只需缓存
窗口的值。打印

var printWindow = window.print;

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

// then later:
printWindow.call(window);
注意:如果您在全局范围内执行所有这些操作,那么您需要使用函数表达式(
var print=…
)而不是函数声明(
function print(data){…}
)来定义新的
print
,因为函数声明会被提升到其范围的顶部,因此,
打印
重新定义将在您有机会缓存它之前发生。如果您没有在全局范围内执行此操作,那么这并不重要,因为新的
打印
不会覆盖
窗口。无论如何定义打印

原件

尝试:

print
似乎不是
window
的自有属性,这意味着新定义的
print
只是在原型链的后面隐藏了一些东西。通过使用
Object.getPrototypeOf
向上移动原型链,可以绕过此阴影


您还需要使用
调用
,以便
打印
方法为
接收正确的值。您需要在定义自己的
打印()之前,将原始打印方法作为另一个属性存储在窗口中

EDIT:您还需要将新的
print
函数具体定义为
window.print=function(){…}
而不是
function print(){…}
,以便能够访问原始文件-请参阅带有精美链接和链接的答案。这不会对调用方法的方式产生任何影响

window.originalPrint=window.print;
window.print=函数(数据)
{
如果(数据)
{
document.getElementById('foo').innerHTML=data;
}
其他的
{
window.originalPrint();
}
}

打印('你好')

print()
@yonishepelev啊,它看起来像是
print
firefox
中窗口的一个自有属性。看起来您必须先缓存
print
的值,然后再定义新值,并使用缓存的引用。@BYossarian遗憾的是,您的编辑与我的原始答案相同。非常感谢@BYossarian占用您的时间。好的,我了解了发生的情况,自己也学到了一些东西:)并更新了我的答案
Object.getPrototypeOf(window).print.call(window);