【问题标题】:how to restore overriden javascript print method如何恢复覆盖的javascript打印方法
【发布时间】:2014-12-03 15:14:42
【问题描述】:

我以前的同事重写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() }

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

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

【问题讨论】:

    标签: javascript


    【解决方案1】:

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

    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,无论它是如何定义的。

    原创

    试试:

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

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

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

    【讨论】:

    • @yonishepelev 啊,看起来printfirefox 中窗口的一个自己的属性。看起来您必须在定义新值之前缓存 print 的值,并使用缓存的引用。
    • @BYossarian 不幸的是,您的编辑与我的原始答案相同。
    • 非常感谢@BYossarian 的宝贵时间。
    【解决方案2】:

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

    编辑:您还需要将新的 print 函数专门定义为 window.print = function(){...} 而不是 function print(){...} 以便能够访问原始文件 - 使用漂亮的链接查看答案 @987654321 @ 和 here。这不会对您调用该方法的方式产生任何影响。

    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>

    【讨论】:

    • 好的,我弄清楚了发生了什么,并且自己学到了一些东西:)并更新了我的答案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-24
    • 2017-01-23
    • 1970-01-01
    • 2017-09-18
    • 2011-10-16
    相关资源
    最近更新 更多