如何恢复重写javascript打印方法

how to restore overriden javascript print method

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

1
2
3
4
5
6
7
8
9
function print(data){

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

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

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

我的意图是使用该功能的默认行为:只打印当前页面,我添加:

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

当然我收到错误:"太多的递归:window.print();"

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


编辑:好的,在某些浏览器中,print似乎是window的自有属性,而在其他浏览器中则不然。因此,只需缓存window.print的值:

1
2
3
4
5
6
7
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重新定义将在您有机会缓存??之前发生。如果您没有在全局范围内执行此操作,则无关紧要,因为新的print不会覆盖window.print,无论它是如何定义的。

原版的:

尝试:

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

print似乎不是window的自有属性,这意味着新定义的print仅仅会影响原型链上的某些内容。您可以使用Object.getPrototypeOf向上移动原型链来绕过此阴影。

您还需要使用call,以便print方法接收this的正确值。


您需要将原始打印方法作为另一个属性存储在窗口中,就在您自己的print()定义之前。

编辑:您还需要将新的print函数专门定义为window.print = function(){...}而不是function print(){...}以便能够访问原始文件 - 请在此处和此处查看带有不错链接的答案。这对您调用方法的方式没有任何影响。

1
2
3
4
5
6
7
8
9
10
11
12
13
window.originalPrint = window.print;

window.print = function(data)
{
    if(data)
    {
        document.getElementById('foo').innerHTML = data;
    }
    else
    {
        window.originalPrint();
    }
}
1
2
<button onclick="window.print('hello')">print('hello')</button>
<button onclick="window.print()">print()</button>