如何恢复重写javascript打印方法

时间:2014-10-08 20:22:39

标签: 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><body>' + data + '</body></html>');

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

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

  

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

当然我收到了错误:&#34;太多的递归:window.print();&#34;

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

2 个答案:

答案 0 :(得分:1)

修改:好的,在某些浏览器中,print似乎是window的自有属性,而在其他浏览器中则不是。{1}}。因此,只需缓存window.print

的值
var printWindow = window.print;

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

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

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

<强>原始

尝试:

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

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

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

答案 1 :(得分:0)

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

编辑:您还需要将新的print功能专门定义为window.print = function(){...}而不是function print(){...},以便能够访问原始版本 - 请参阅答案包含很好的链接herehere。这不会对您调用方法产生任何影响。

&#13;
&#13;
window.originalPrint = window.print;

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

<button onclick="window.print('hello')">print('hello')</button>
<button onclick="window.print()">print()</button>
&#13;
&#13;
&#13;