【问题标题】:Setting OnLoad event for newly opened window in IE6在 IE6 中为新打开的窗口设置 OnLoad 事件
【发布时间】:2011-03-31 07:37:24
【问题描述】:

我需要为新弹出的窗口设置 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 或未定义”

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

关于如何进行这项工作的任何线索? 重要的是不要在目标页面的其他地方使用 javascript,因为我无法控制它。所有功能都必须包含在我上面发布的链接中。

【问题讨论】:

    标签: javascript internet-explorer onload


    【解决方案1】:

    虽然之前的答案正确地指出新窗口必须来自同一个域,但他们错误地回答了为什么他收到错误“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();
    

    这将进一步讨论here

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

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

        这是一个想法:在 iframe 中准备 HTML 或除了您需要的页面之外什么都没有的页面。此页面将有 body.onload=self.print()。

        【讨论】:

        • 不幸的是,我只需要使用这个链接。不过我明白你的意思。我试图做一个“setTimeout('printwindow.print()',3000);”,但是,当我这样做时,它声称 printwindow 是未定义的。有什么想法吗?
        【解决方案4】:

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

        【讨论】:

        • 感谢您简洁的回答。这适用于 Firefox,但不幸的是不适用于 IE 或 Safari。就好像 printwindow.onload 不是访问这些浏览器的 onload 功能的正确方法。您还有其他建议吗?
        【解决方案5】:

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

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

        【讨论】:

        • 在页面中添加jQuery超出了这个问题的范围。
        【解决方案6】:

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

        <a onclick="self.printwindow=window.open('print.html');setTimeout('self.printwindow.print()',3000);return false;" href='print.html'>
        

        【讨论】:

          猜你喜欢
          • 2010-11-20
          • 2011-03-03
          • 1970-01-01
          • 1970-01-01
          • 2014-03-24
          • 2011-07-08
          • 2013-11-01
          • 1970-01-01
          相关资源
          最近更新 更多