我以前的同事重写了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()?
答案 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(){...}
,以便能够访问原始版本 - 请参阅答案包含很好的链接here和here。这不会对您调用方法产生任何影响。
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;