Javascript Firefox赢得了';除非设置断点,否则无法打印?

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

我有一个方法可以创建一个iframe,将文本框的内容复制到该iframe,打印该iframe,然后删除该iframe:

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中的错误那可能是你唯一的选择