JavaScript 打印被 Chrome 阻止,解决方法
JavaScript print blocked by Chrome, Workaround?
我知道之前已经在这里讨论过,但我没有找到任何实用的解决方案/解决方法,我希望是否有人知道如何解决这个问题!
这是:
如果您尝试在谷歌浏览器中的单个页面中频繁调用window.print()
方法(就像用户单击打印按钮一样(,浏览器会在控制台中抛出一条警告消息,指出:
忽略对 print(( 的过于频繁的调用
什么也没发生!几秒钟后,一切恢复正常,并在您再次调用命令时出现打印对话框window.print()
!更糟糕的是,优秀的Chrome人员对调用print命令的页面使用指数级等待时间,这意味着用户点击按钮进行打印的次数越多,他就越需要等待打印对话框出现!
这个问题已经在 chrome 中存在了很长一段时间(14 个后续版本(,并且被确认为Area-UI
错误,我昨天再次为谷歌团队发布了它,希望 Chrome 团队的某个人可以验证这个令人难以置信的烦人功能何时会被修复!
在这里寻找的是解决此问题的方法,我能做些什么来解决这个问题吗?我的公司正在开发一个高度交易性的财务系统,其中包含许多需要打印的报告,而仅由于这一个小故障,整个项目都有在我最喜欢的谷歌Chrome浏览器中运行的风险!
更新:
这是 Chrome 浏览器中导致此功能的代码,看起来在有人再次调用 print 命令之前至少需要 2 秒,因此 UI 中间隔 2 秒的计时器可能会阻止进入无限等待回调! 还有其他想法吗?
您可以有条件地替换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;
}
}
})();
}
您可以使用内部安全计时器/包装器,而不是使用外部安全计时器/包装器。 只需添加它,window.print
就可以在 Chrome 和其他任何地方安全地运行。 (另外,关闭意味着realPrintFunc
、interval
和nextAvailableTime
是新window.print
私有
如果需要协调多个框架页面之间的window.print
调用,则可以在父页面而不是闭包中设置nextAvailableTime
,以便所有框架都可以使用 window.parent.nextAvailableTime
访问共享值。
同样的问题,对我来说最直接的解决方案是创建一个新窗口,写下我需要的东西,关闭它,然后打印它。自从我将其更改为以这种方式工作以来,我就不必处理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();
我的解决方案是降低调用window.print()
的频率。您可以尝试将window.print()
包装到您自己的方法中,并设置在再次执行window.print()
之前必须经过的最小时间间隔。您可以在 UI 中进行某种更改/动画,以指示正在完成工作。
"工作">
除非您认为每秒/每隔几秒钟多次按下打印按钮会有所帮助?我的意思是,如果window.print()
操作需要那么长时间,那不是您的代码错误,无论如何,UI 中都应该有一个"等待并耐心等待"指示器。
如果所有打印机都与网络兼容,则可以更改单击打印按钮时发生的情况。应用程序可以向服务器发送请求,其中包含要打印的页面的 URL 以及有关要打印的打印机的信息,而不是打印页面。
然后,服务器手动启动打印过程,中间将没有浏览器,这可能会阻止您这样做。
我看到提到这个问题的任何地方都建议使用计时器。然而,他们并没有解决问题,我觉得 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 如果你想解决这个问题,那么请去加星标。
不再有变通办法!如果我没记错的话,错误作为 v.23 的一部分修复。
因此,如果发布周期是每 6 周一次,并且 Chrome 22 于 9 月 25 日发布,那么到 11 月 6 日(aprox.(,修复程序将在 Chrome 稳定版中出现
我正在做类似的事情来逃离沙盒。它在Firefox上完美运行,但在Edge/Chrome上则不然。我尝试了许多其他事情。你还记得关于这个话题有什么有用的吗?
print_window= window.open();
print_window.document.write( <...> );
print_window.document.close();
print_window.focus();
print_window.print();
print_window.close();
- 使用JSON序列化图论树的解决方法
- X-Content-Type-Options=nosniff解决方法
- 供应商前缀 CSS 解决方法(引导程序)的速度和大小
- 无法使用HTML5 Web存储保存布尔值的解决方法
- HTML”;文件“/OpenFile对话框解决方法
- 多行链接中引导工具提示的解决方法
- 使用jsonp解决方法进行同步ajax调用
- YQL推特时间线超出速率限制.解决方法
- 嵌套文档.writes和第三方广告在IE中不起作用!!!!任何安全的解决方法
- 加载外部页面的跨域解决方法
- Emberjs - 基于控制器属性进行过滤的奇怪解决方法
- Z 索引绝对定位元素低于父级,具有 z 索引解决方法
- 安卓浏览器触端事件错误解决方法
- 有什么方法可以将类型指定为 self?或解决方法“属性类型不兼容”
- SVG 符号不会触发加载事件(仅在 Firefox 中).我寻找解决方法
- IE10 背景位置 x 的解决方法
- 在 IE11 中添加子项时未更新空选择器的解决方法
- 安卓浏览器上的滚动事件未触发.需要解决方法
- IE8 中 data:uri 的 32KB 限制的任何解决方法
- 溢出-x:可见;不适用于溢出-y:自动;任何解决方法