【问题标题】:Javascript window.print() not recognizing window objectJavascript window.print() 无法识别窗口对象
【发布时间】:2013-01-17 16:35:22
【问题描述】:

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

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

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

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

window.name

“加入”

window.self

Window {top: Window, window: Window, location: Location, external: Object, chrome: Object…}

window.location

位置{赋值:函数,替换:函数,重新加载:函数,祖先起源: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" />

【问题讨论】:

  • 如果您发布为按钮设置点击处理程序的代码,将会有很大帮助。

标签: javascript


【解决方案1】:

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

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

【讨论】:

  • 哎哟。顺便说一句,这种行为不会被弃用吗?
  • @Kos 也许,但 Chrome 和 Safari 也可以。 Firefox 没有。
  • @Kos:实际上,AFAIK,它最近被标准化了。
  • 我们都希望这种行为被弃用。
  • 当,我以为肯定会是这样,但只是进行了搜索,没有 ID 为“print”的元素。一堆在 ID 名称中有“print”的——比如“print-close”等——但没有一个只是“print”。
【解决方案2】:

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

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

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

祝你好运!

【讨论】:

    【解决方案3】:

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

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

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

    var print = blah blah
    

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

    window.realPrint = window.print;
    

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

    【讨论】:

    • 我应该提到我上面的解决方案是由@Brendan Robert 私下建议的。归功于他!
    猜你喜欢
    • 2021-12-11
    • 1970-01-01
    • 2021-03-28
    • 2020-11-28
    • 1970-01-01
    • 2012-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多