在IE6中为新打开的窗口设置OnLoad事件

3

我需要为新弹出的窗口设置onload属性。以下代码适用于Firefox:

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

然而,当我在IE中尝试这样做时,会出现错误 -“printwindow.document.body null or not defined”

目标是弹出一个新窗口,并在打开后调用该窗口的打印对话框。

有什么提示可以让这个工作起来吗? 重要的是不要在目标页面的其他地方使用javascript,因为我无法控制它。所有功能必须包含在我上面发布的链接中。

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();

这个问题在这里有更详细的讨论。


1

除非两个页面在同一个域上,否则这是不可能的。你的代码在FF中无法工作,而是打印当前页面。如果这些页面在同一个域上,那么你应该写:

printwindow=window.open('/mypage.html');
printwindow.onload = function() {
  printwindow.focus();
  printwindow.print();
}

0

尽管 HTML 属性可能会让你产生这样的想法,但 onload 是 window 对象的属性,而不是 body 元素的属性。以下是参考文献:

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”将不起作用。浏览器安全模型防止父窗口访问子窗口的窗口对象,除非它们都驻留在相同的域名下。


谢谢您简明扼要的回答。 这对于Firefox有效,但不幸的是在IE或Safari中无法使用。就好像printwindow.onload不是那些浏览器访问onload函数的正确方式一样。 您有其他建议吗? - SocialCensus

0
你现在依赖于"printwindow.document.body.onload=self.print();"这行代码在子文档完成加载前被执行,我不认为你能保证它的执行。

有一个思路:准备一个包含iframe中唯一需要打印的页面的HTML或页面。这个页面将拥有body.onload=self.print()。


不幸的是,我只有这个链接可以使用。我理解你的观点。 我尝试过 "setTimeout('printwindow.print()',3000);",但是当我这样做时,它声称 printwindow 未定义。有什么想法吗? - SocialCensus

0

将jQuery添加到页面超出了此问题的范围。 - SocialCensus

-1
最终(虽然很差)适用于所有浏览器的解决方案是使用setTimeout并以这种方式调用print(),而不是修改onload属性:
<a onclick="self.printwindow=window.open('print.html');setTimeout('self.printwindow.print()',3000);return false;" href='print.html'>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接