AngularJS中如何在$window.print()对话框关闭后调用函数?
嘿,刚好对这个场景很熟悉!先直接给你答案:$window.print()本身不会返回回调函数或Promise——它是一个同步阻塞的调用,浏览器会暂停所有JS执行直到打印对话框关闭,但这个方法本身没有提供内置的钩子来通知你对话框关闭的事件。不过别担心,我们有可靠的解决方案!
解决方案1:使用标准的
afterprint事件(推荐) 现代浏览器都支持afterprint事件,它会在打印对话框关闭(不管用户选择了打印、取消还是关闭)时触发。在AngularJS里,你可以通过$window来绑定这个事件,用完记得移除监听避免内存泄漏:
angular.module('myApp').controller('PrintController', function($window) { // 定义打印完成后要执行的逻辑 function handleAfterPrint() { console.log('打印对话框已经关闭啦!'); // 在这里放置你需要执行的代码,比如重置页面状态、发送统计请求等 // 移除事件监听,防止重复触发 $window.removeEventListener('afterprint', handleAfterPrint); } // 先绑定事件监听 $window.addEventListener('afterprint', handleAfterPrint); // 触发打印对话框 $window.print(); });
需要注意的是:
- 这个事件在所有现代浏览器(Chrome、Firefox、Edge、Safari)都能正常工作
- 旧版IE(IE11及更早)支持
onafterprint属性,你可以用$window.onafterprint = handleAfterPrint来兼容,但推荐用addEventListener的标准方式
解决方案2:焦点轮询(备选,仅特殊场景使用)
如果因为某些原因不能使用afterprint事件(比如兼容极旧的浏览器),可以尝试通过轮询页面焦点来判断打印对话框是否关闭——打印时页面会失去焦点,关闭后会重新获得焦点:
angular.module('myApp').controller('PrintController', function($window, $timeout) { var printCheckTimer; function checkPrintStatus() { // 检查页面是否重新获得焦点 if ($window.document.hasFocus()) { console.log('打印对话框已关闭!'); // 执行你的逻辑 $timeout.cancel(printCheckTimer); // 清除定时器 } else { // 每隔500ms检查一次 printCheckTimer = $timeout(checkPrintStatus, 500); } } // 启动轮询 printCheckTimer = $timeout(checkPrintStatus, 500); // 触发打印 $window.print(); });
⚠️ 这种方法的缺点很明显:如果用户在打印对话框打开时切换到其他应用窗口,也会触发这个逻辑,准确性不如afterprint事件,所以只建议作为最后备选。
总结
优先使用afterprint事件,这是浏览器提供的标准解决方案,最可靠也最符合规范。在AngularJS里通过$window绑定事件即可,记得在事件处理完成后移除监听,避免不必要的内存占用。
内容的提问来源于stack exchange,提问作者vaibhav
相关产品推荐
相关产品推荐

