5

我正在尝试提供一个按钮来在窗口上打开浏览器级别的打印对话框。我首先尝试了 window.print(); 在 an 上使用内联“onclick” <input>,然后在使用 jQuery 的输入上使用 click() 函数,并且在单击时都给出相同的错误:

TypeError:对象[对象全局]的属性“打印”不是函数

我应该指出这是一个弹出窗口,但我认为这并不重要,除非在父页面上使用 window.print() 的任何形式都可以正常工作。

似乎某处的窗口对象必须发生某些事情,所以我在控制台中执行了以下操作:

窗口名称

“加入”

窗口.self

窗口{顶部:窗口,窗口:窗口,位置:位置,外部:对象,镀铬:对象...}

窗口位置

位置{分配:函数,替换:函数,重新加载:函数,祖先起源:DOMStringList,起源:“http://local.xxx.xxx:8080”…}

所以它看起来像窗口对象在那里并按预期定义。

我什至可以在同一个窗口对象上运行其他方法,如 close()、confirm()、alert()、scrollTo() 等,它们工作正常。那么为什么不打印()?

页面的内容似乎并不重要,我还要说我们没有使用 iFrame 或框架。我确实将弹出窗口的所有内容替换为

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head></head>
<body>Foo</body>
</html>

结果相同。所以我相当肯定我们的其他代码都没有干扰。

编辑

我用来触发 print() 的代码:

$('.foobar').click(function(){
    window.print();
});

现在我只是在控制台中进行操作。

按钮

<input type="button" class="foobar" value="Print" />
4

3 回答 3

9

如果您有一个 id 为 的元素,就会发生这种情况print

元素 ID 成为window(全局对象)的属性,隐藏任何现有的同名成员

于 2013-01-17T16:37:32.867 回答
3

我认为 SLaks 正在做某事。如果它不是 DOM 元素,您可以尝试使用 setter 函数来捕获任何可能定义全局变量的错误 javascript。在任何其他 javascript 之前在页面顶部粘贴这样的内容:

window.__defineSetter__(
    "print",
    function(){alert("GOTCHA!"); debugger;}
);

在您的 javascript 调试器处于活动状态的情况下打开页面,它应该会在任何将 window.print 更改为其他内容时停止。向上调用堆栈查找有罪的一方。

祝你好运!

于 2013-01-17T17:11:50.800 回答
2

解决。不是@SLaks 建议的确切方式,但它使我们走上了正确的轨道:

window.__defineSetter__("print", function(){alert("GOTCHA!"); debugger;});

早些时候,发现上游的一个脚本正在定义打印:

var print = blah blah

所以我们给 print() 方法起了别名:

window.realPrint = window.print;

并使用它。这很 hacky,但在我们能够更彻底地解决上游问题之前,它会暂时起作用。无论如何,认为这种调试方法和小技巧可能对其他人有用。

于 2013-01-17T17:11:50.493 回答