3

I need to set the onload attribute for a newly popped-up window. The following code works for Firefox:

<a onclick="printwindow=window.open('www.google.com');printwindow.document.body.onload=self.print();return false;" href='www.google.com'>

However, when I try this in IE, I get an error - "printwindow.document.body null or not defined'

The goal is to pop open a new window, and call up the print dialog for that window once it's been opened.

Any clues on how to make this work? It is important not to use javascript elsewhere on the target page, as I do not have control over it. All functionality must be contained in the link I posted above.

4

6 回答 6

4

虽然较早的答案正确地指出新窗口必须来自同一个域,但他们错误地回答了为什么他收到错误“printwindow.document.body null or not defined”。这是因为 IE 不会从 window.open() 返回任何状态,这意味着您可以在 onload 可用之前打开页面并尝试访问它。

出于这个原因,您需要使用 setTimeout 之类的东西来检查。例如:

printwindow = window.open('print.html');
var body;
function ieLoaded(){
    body = printwindow.document.getElementsByTagName("body");
    if(body[0]==null){
        // Page isn't ready yet!
        setTimeout(ieLoaded, 10);
    }else{
        // Here you can inject javascript if you like
        var n = printwindow.document.createElement("script");
        n.src = "injectableScript.js";
        body.appendChild(n);

        // Or you can just call your script as originally planned
        printwindow.print();
    }
}
ieLoaded();

这将在此处进一步讨论

于 2011-03-30T22:28:19.233 回答
1

除非两个页面都在同一个域中,否则这是不可能的。您的代码在 FF 中不起作用,而是打印当前页面。如果页面在同一个域上,那么你会写:

printwindow=window.open('/mypage.html');
printwindow.onload = function() {
  printwindow.focus();
  printwindow.print();
}
于 2008-10-28T23:28:18.500 回答
0

您依赖“printwindow.document.body.onload=self.print();” 在子文档完成加载之前执行的行。我认为你不能保证这一点。

这是一个想法:在 iframe 中准备 HTML 或只有您需要的页面的页面。此页面将有 body.onload=self.print()。

于 2008-10-28T23:02:49.020 回答
0

onload 是 window 对象而不是 body 元素的属性,尽管 HTML 属性可能会让您相信。这是参考:

printwindow.onload

但是,在这种情况下,您不能将 JavaScript 字符串传递给它 - 您需要将函数传递给它。所以,完整的脚本看起来像这样

printwindow.onload=function(){self.print();}

现在,把它们放在一起

<a href="www.google.com" onclick="var printwindow=window.open(this.href,'printwindow');printwindow.onload=function(){self.print();};return false;" >try it</a>

然而!这不适用于 URL “www.google.com”。浏览器安全模型阻止父窗口访问子窗口的窗口对象,除非它们都驻留在同一个域名下。

于 2008-10-28T23:06:14.253 回答
0

检查我们的 jQuery。特别是文档就绪功能。

http://docs.jquery.com/Tutorials:How_jQuery_Works#Launching_Code_on_Document_Ready

于 2008-10-28T23:12:17.533 回答
-1

适用于所有浏览器的最终(诚然,糟糕的)解决方案是使用 setTimeout 并以这种方式调用 print() ,而不是修改 onload 属性:

<a onclick="self.printwindow=window.open('print.html');setTimeout('self.printwindow.print()',3000);return false;" href='print.html'>
于 2008-10-29T18:36:36.107 回答