我正在尝试提供一个按钮,用于在窗口上打开浏览器级别的打印对话框。我首先尝试了window.print();在<input>
上使用内联“onclick”,然后使用jQuery在输入上使用click()函数,并且在单击时都会出现相同的错误:
TypeError:对象[object global]的属性'print'不是函数
我应该指出这是一个弹出窗口,但我不会认为除了在父页面上使用window.print()的任何形式都可以正常工作之外。
看起来像某个窗口对象必须发生某些事情,所以我在控制台中执行了以下操作:
window.name
“加入”
window.self
Window {top:Window,window:Window,location:Location,external:Object,chrome:Object ...}
window.location的
位置{assign:function,replace:function,reload:function,ancestorOrigins:DOMStringList,origin:“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" />
答案 0 :(得分:9)
如果您的元素ID为print
,则会发生这种情况。
元素ID成为window
(全局对象)的属性,隐藏任何具有相同名称的现有成员
答案 1 :(得分:3)
我认为SLaks正在发挥作用。如果它不是DOM元素,您可以尝试坚持使用setter函数来捕获可能定义全局变量的任何错误的javascript。在任何其他javascript之前,在页面顶部粘贴这样的东西:
window.__defineSetter__(
"print",
function(){alert("GOTCHA!"); debugger;}
);
在您的javascript调试器处于活动状态时打开该页面,它应该停止任何将window.print更改为其他内容的内容。上呼叫堆栈找到有罪的一方。
祝你好运!
答案 2 :(得分:2)
解决。不像@SLaks建议的那样,但它让我们走上正轨:
冉
window.__defineSetter__("print", function(){alert("GOTCHA!"); debugger;});
早期,发现远上游的脚本定义了print:
var print = blah blah
所以我们使用print()方法别名:
window.realPrint = window.print;
然后用它。这很麻烦,但它会暂时起作用,直到我们能够更彻底地解决上游问题。无论如何,认为这种调试方法和小黑客可能对其他人有用。