我需要为新弹出的窗口设置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或not defined'
目标是弹出一个新窗口,并在打开该窗口时调出该窗口的打印对话框。
有关如何使这项工作的任何线索? 重要的是不要在目标页面上的其他地方使用javascript,因为我无法控制它。所有功能必须包含在我上面发布的链接中。
答案 0 :(得分:4)
虽然之前的答案正确地说明了新窗口必须来自同一个域,但他们错误地回答了为什么他收到错误'printwindow.document.body null或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
答案 1 :(得分:1)
除非两个页面位于同一个域中,否则这是不可能的。您的代码在FF中不起作用,而是打印当前页面。如果页面位于同一个域中,那么您可以写:
printwindow=window.open('/mypage.html');
printwindow.onload = function() {
printwindow.focus();
printwindow.print();
}
答案 2 :(得分:0)
您依赖“printwindow.document.body.onload = self.print();”在子文档完成加载之前执行的行。我认为你不能保证这一点。
这是一个想法:准备HTML或只包含iframe所需页面的页面。该页面将包含body.onload = self.print()。
答案 3 :(得分:0)
onload是一个属性,如果是窗口对象,而不是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>
无论其!这对于“www.google.com”网址不起作用。浏览器安全模型阻止父窗口访问子窗口的窗口对象,除非它们都驻留在相同的域名中。
答案 4 :(得分:0)
检查我们的jQuery。特别是文档就绪功能。
http://docs.jquery.com/Tutorials:How_jQuery_Works#Launching_Code_on_Document_Ready
答案 5 :(得分:-1)
适用于所有浏览器的最终(不可否认,差)解决方案是使用setTimeout并以这种方式调用print(),而不是修改onload属性:
<a onclick="self.printwindow=window.open('print.html');setTimeout('self.printwindow.print()',3000);return false;" href='print.html'>