JavaScript打印被Chrome阻止,解决方法?

toiithl6  于 2023-05-27  发布在  Java
关注(0)|答案(7)|浏览(477)

我知道之前已经在这里讨论过了,但是我没有找到实际的解决方案/变通办法,我希望有人有任何想法如何解决这个问题!
就是这样
如果你在google Chrome中的一个页面中频繁调用window.print()方法(就像用户点击打印按钮一样),浏览器会在控制台中抛出一条警告消息:
忽略对print()过于频繁的调用
什么都没发生!几秒钟后,一切恢复正常,再次调用window.print()命令时会出现打印对话框!更糟糕的是,优秀的Chrome用户对调用打印命令的页面使用指数等待时间,这意味着用户点击按钮打印的次数越多,他就必须等待打印对话框出现的时间越长!
这个问题已经在chrome中存在了相当长的一段时间(14个后续版本),它被确认为是一个Area-UI错误,我昨天posted it again for google team希望Chrome团队的人可以验证这个令人难以置信的恼人功能何时会被修复!
然而,我在这里寻找的是解决这个问题的方法,有没有什么我可以做的事情可以让这个工作?我的公司正在开发一个高度交易的财务系统,有很多需要打印的报告,而仅仅是这个小故障,整个项目就有在我最喜欢的谷歌Chrome浏览器中运行的风险!
更新:
Here's the code in Chrome browser导致此功能,并且看起来在某人再次调用print命令之前至少需要2秒,因此UI中2秒间隔的计时器可能会阻止进入无限等待回调!还有别的想法吗

sxissh06

sxissh061#

您可以有条件地替换window.print()函数:

// detect if browser is Chrome
if(navigator.userAgent.toLowerCase().indexOf("chrome") >  -1) {
    // wrap private vars in a closure
    (function() {
        var realPrintFunc = window.print;
        var interval = 2500; // 2.5 secs
        var nextAvailableTime = +new Date(); // when we can safely print again

        // overwrite window.print function
        window.print = function() {
            var now = +new Date();
            // if the next available time is in the past, print now
            if(now > nextAvailableTime) {
                realPrintFunc();
                nextAvailableTime = now + interval;
            } else {
                // print when next available
                setTimeout(realPrintFunc, nextAvailableTime - now);
                nextAvailableTime += interval;
            }
        }
    })();
}

您可以使用内部安全定时器/ Package 器,而不是使用外部安全定时器/ Package 器。只要添加这个,window.print就可以在Chrome和其他任何地方安全运行。(另外,闭包意味着realPrintFuncintervalnextAvailableTime对于新的window.print是私有的
如果你需要在多个框架页面之间协调对window.print的调用,你可以在父页面中设置nextAvailableTime,而不是在闭包中,这样所有的框架都可以使用window.parent.nextAvailableTime访问一个共享值。

r6hnlfcb

r6hnlfcb2#

我也遇到过同样的问题,对我来说,最直接的解决方案就是创建一个新窗口,在其中写入我需要的内容,然后关闭它,然后打印出来。自从我改变了Chrome的工作方式后,我就不必处理Chrome的限制了,我也不需要做任何跟踪。

print_window= window.open();
print_window.document.write(print_css + divToPrint[0].outerHTML+"</html>");
print_window.document.close();
print_window.focus();
print_window.print();
print_window.close();
xesrikrc

xesrikrc3#

我的解决方案是减少调用window.print()的频率。您可以尝试将window.print() Package 到自己的方法中,并在再次执行window.print()之前设置必须经过的最小时间间隔。您可以在UI中进行某种更改/动画,以指示工作正在完成。
“工作”
除非你认为它真的认为按下打印按钮超过一次/每隔几秒钟帮助?我的意思是,如果window.print()操作需要很长时间,这不是你的代码故障,应该有一个“等待和耐心”-在UI指示器无论如何。

8iwquhpp

8iwquhpp4#

如果您的所有打印机都是网络兼容的,您可以更改单击打印按钮时发生的情况。您的应用程序可以向服务器发送一个请求,其中包含要打印的页面的URL以及要打印的打印机的信息,而不是打印页面。
然后服务器手动启动打印过程,其间没有浏览器,这可能会阻止您这样做。

h7appiyu

h7appiyu5#

无论我在哪里看到提到这个问题,都建议使用计时器。然而,他们并没有解决这个问题,我觉得Kamyar是唯一一个真正阅读来源并理解问题的人,所以我想知道为什么他接受了他所做的回答。
主要的问题是,Chrome中的延迟时间是指数级的,所以为了让这些计时器工作,它们的延迟也必须在每次使用时增加,这当然会很快变得非常烦人。Chrome实际上只在取消打印请求后应用延迟,但我们无法检测打印是否成功。
Abathur的解决方案实际上比你想象的要好得多。我不确定我是否会使用它,但它确实有效。
好消息是:
1)在最近的Chrome版本中,延迟实际上有所减少。现在是:[2, 2, 2, 4, 8, 16, 32, 32, ...]
2)8月28日,有人提出了这个问题:http://code.google.com/p/chromium/issues/detail?id=50186如果你想解决这个问题,那么请去星星它。

eeq64g8w

eeq64g8w6#

没有更多的变通办法!错误fixed作为v.23的一部分,如果我没有错。
因此,如果发布周期是每6周,并且Chrome 22是在9月25日发布的,那么到11月6日(大约),修复程序将在Chrome稳定版本中

kuhbmx9i

kuhbmx9i7#

我正在做一些类似的事情来逃离沙箱..它在Firefox上运行得很好,但在Edge/Chrome上却不行。我试过很多其他方法。你还记得关于这个主题的任何有用的东西吗?

print_window= window.open();
print_window.document.write( <...> );
print_window.document.close();
print_window.focus();
print_window.print();
print_window.close();

相关问题