Javascript Firefox赢得了';除非设置断点,否则无法打印?
我有一个方法可以创建一个iframe,将文本框的内容复制到该iframe,打印该iframe,然后删除该iframe:Javascript Firefox赢得了';除非设置断点,否则无法打印?,javascript,iframe,printing,Javascript,Iframe,Printing,我有一个方法可以创建一个iframe,将文本框的内容复制到该iframe,打印该iframe,然后删除该iframe: function CentralPrint(controlID) { var frameSet = document.createElement('iframe'); frameSet.name = "frameSet"; frameSet.id = "ErrorReportPrintingFrame"; frameSet.style.posi
function CentralPrint(controlID)
{
var frameSet = document.createElement('iframe');
frameSet.name = "frameSet";
frameSet.id = "ErrorReportPrintingFrame";
frameSet.style.position = "absolute";
frameSet.style.top = "-1000000px";
document.body.appendChild(frameSet);
var frameDoc = frameSet.contentWindow ? frameSet.contentWindow : frameSet.contentDocument.document ? frameSet.contentDocument.document : frameSet.contentDocument;
frameDoc.document.open();
var content = document.getElementById(controlID).value.replace(/\n/gi, '<br>');
frameDoc.document.write('<html><head><title></title><table><tr><td>');
frameDoc.document.write(' <style type="text/css"> table tr td { font-family: Arial,Helvetica,sans-serif; } </style> </head><body>');
frameDoc.document.write(content);
frameDoc.document.write('</td> </tr> </table> </body></html>');
frameDoc.document.close();
var iframe = document.getElementById("ErrorReportPrintingFrame");
var result = iframe.contentWindow.document.execCommand("print", false, null);
if (!result)
{
iframe.contentWindow.print();
}
document.body.removeChild(frameSet);
return false;
}
函数中心打印(controlID)
{
var frameSet=document.createElement('iframe');
frameSet.name=“frameSet”;
frameSet.id=“ErrorReportPrintingFrame”;
frameSet.style.position=“绝对”;
frameSet.style.top=“-1000000px”;
document.body.appendChild(frameSet);
var frameDoc=frameSet.contentWindow?frameSet.contentWindow:frameSet.contentDocument.document?frameSet.contentDocument.document:frameSet.contentDocument;
frameDoc.document.open();
var content=document.getElementById(controlID.value.replace(/\n/gi,
);
frameDoc.document.write(“”);
frameDoc.document.write('table tr td{font-family:Arial,Helvetica,sans-serif;}');
frameDoc.document.write(内容);
frameDoc.document.write(“”);
frameDoc.document.close();
var iframe=document.getElementById(“ErrorReportPrintingFrame”);
var result=iframe.contentWindow.document.execCommand(“print”,false,null);
如果(!结果)
{
iframe.contentWindow.print();
}
document.body.removeChild(框架集);
返回false;
}
这适用于IE 11、Chrome,如果我设置一个断点并逐步完成代码,它也适用于Firefox
我不认为这有什么关系,但当我在IE和Chrome中逐步实现这一点时,result
是true
而在Firefox中,result
是false
不过,除非在Firefox中设置断点,否则我不会弹出选择打印设备的窗口
你知道是什么原因造成的吗?我找到了一个解决方案,但我无法理解为什么它能解决这个问题:
function CentralPrint(controlID)
{
// New variable
var isFirefox = typeof InstallTrigger !== 'undefined';
var frameSet = document.createElement('iframe');
frameSet.name = "frameSet";
frameSet.id = "ErrorReportPrintingFrame";
frameSet.style.position = "absolute";
frameSet.style.top = "-1000000px";
document.body.appendChild(frameSet);
var frameDoc = frameSet.contentWindow ? frameSet.contentWindow : frameSet.contentDocument.document ? frameSet.contentDocument.document : frameSet.contentDocument;
frameDoc.document.open();
var content = document.getElementById(controlID).value.replace(/\n/gi, '<br>');
frameDoc.document.write('<html><head><title></title><table><tr><td>');
frameDoc.document.write(' <style type="text/css"> table tr td { font-family: Arial,Helvetica,sans-serif; } </style> </head><body>');
frameDoc.document.write(content);
frameDoc.document.write('</td> </tr> </table> </body></html>');
frameDoc.document.close();
// Use a timeout function instead of just issuing the command immediately
setTimeout(function ()
{
var iframe = document.getElementById("ErrorReportPrintingFrame");
if (isFirefox != true)
iframe.contentWindow.document.execCommand("print", false, null);
else
iframe.contentWindow.print();
document.body.removeChild(frameSet);
}, 500);
return false;
}
函数中心打印(controlID)
{
//新变量
var isFirefox=typeof InstallTrigger!=“未定义”;
var frameSet=document.createElement('iframe');
frameSet.name=“frameSet”;
frameSet.id=“ErrorReportPrintingFrame”;
frameSet.style.position=“绝对”;
frameSet.style.top=“-1000000px”;
document.body.appendChild(frameSet);
var frameDoc=frameSet.contentWindow?frameSet.contentWindow:frameSet.contentDocument.document?frameSet.contentDocument.document:frameSet.contentDocument;
frameDoc.document.open();
var content=document.getElementById(controlID.value.replace(/\n/gi,
);
frameDoc.document.write(“”);
frameDoc.document.write('table tr td{font-family:Arial,Helvetica,sans-serif;}');
frameDoc.document.write(内容);
frameDoc.document.write(“”);
frameDoc.document.close();
//使用超时函数,而不是立即发出命令
setTimeout(函数()
{
var iframe=document.getElementById(“ErrorReportPrintingFrame”);
if(isFirefox!=true)
iframe.contentWindow.document.execCommand(“打印”,false,null);
其他的
iframe.contentWindow.print();
document.body.removeChild(框架集);
}, 500);
返回false;
}
我想这一定是一个奇怪的问题,在print命令执行它所需要的操作之前,元素被删除了。这种问题称为
竞争条件。您正在尝试在元素完成加载之前获取它
您可以将onLoad
事件侦听器添加到frameSet
,而不是使用超时
frameSet.onload = function() {
var iframe = document.getElementById("ErrorReportPrintingFrame");
...
};
或者,如果您喜欢超时,您很可能可以将其减少到0
,它仍然可以工作。我看到了这个答案:。也许有帮助。@joselus是的,这就是我得到结果的原因。如果为false,那么我调用print()
而不是上一个要点中提到的execCommand
。哦,对不起!!:-(这对我不起作用。我尝试将其分配给frameDoc
,但也没有。我还移动了document.body.appendChild(frameSet)
line是在尝试打印之前执行的最后一件事,认为可能是在内容实际写入之前尝试打印。控制台告诉我TypeError:frameSet.contentDocument为null
FireFox有一些竞争条件错误,通常可以通过setTimeout 0解决。如果是bro中的错误那可能是你唯一的选择