Javascript 在iPad上打印完整日历

Javascript 在iPad上打印完整日历,javascript,ipad,angularjs,mobile-safari,fullcalendar,Javascript,Ipad,Angularjs,Mobile Safari,Fullcalendar,我断断续续地做这项工作已经有一段时间了,试图找到一个最佳的解决方案(除了告诉用户禁用弹出窗口阻止),但我被难住了 它的基本工作原理是这样的(我省略了代码,因为有很多it和礼仪信息): 我有一个angular应用程序,以angular实现,并利用fullcalendar.js来打印我想要打印的内容。在我的angular控制器中,我有一个管理日历本身的jQuery(请不要用尺子碰我的手指:) 当我想要打印日历时,我需要一组特定的样式,因此我有一个指令准备所有要移植的内容,然后使用一个统一的角度工厂,

我断断续续地做这项工作已经有一段时间了,试图找到一个最佳的解决方案(除了告诉用户禁用弹出窗口阻止),但我被难住了

它的基本工作原理是这样的(我省略了代码,因为有很多it和礼仪信息):

我有一个angular应用程序,以angular实现,并利用fullcalendar.js来打印我想要打印的内容。在我的angular控制器中,我有一个管理日历本身的jQuery(请不要用尺子碰我的手指:)

当我想要打印日历时,我需要一组特定的样式,因此我有一个指令准备所有要移植的内容,然后使用一个统一的角度工厂,用于所有打印活动。这个统一工厂打开一个新窗口,其中包含我想要的所有新样式,并通过回调“清理”HTML,在我的例子中,我使用它将日历的HTML内容移植到新窗口

所以流程基本上是这样的:用户单击打印按钮->调用日历打印指令中的单击事件,该指令调用工厂。->Factory打开一个新窗口,并通过来自指令的回调来导入内容,然后调用JavaScript的print()来打印窗口

我遇到的问题是: 在PC和Mac上打印效果很好,但在iOS safari上,窗口不会弹出。我发现这个问题是因为iOS Safari要求所有新窗口弹出窗口都位于单击事件中

为了解决这个问题,我想我应该对统一工厂进行一些修改以适应我的情况:我将在指令的click事件中打开一个新窗口,然后将该窗口的引用传递到工厂中,然后工厂可以使用该引用将html内容添加到其主体中。这给iOS Safari带来了另一个问题,即如果子窗口打开,它会暂停父窗口的javascript执行,因此一旦新窗口打开,HTML的生成和工厂的调用就会暂停,直到用户切换回父选项卡。这就是我被难住的地方。有什么办法可以解决这些问题吗?或者我会告诉用户禁用弹出窗口阻止吗

一旦新窗口打开,HTML和 工厂的电话中断了

在打开新窗口之前,是否可以更改以生成HTML和工厂调用?否则,听起来您需要避免弹出窗口

如果要在同一窗口中显示另一个视图,请使用。 您可以选择切换ngInclude的路径以交换HTML,也可以选择与组合以在用户单击时显示和隐藏正确的部分

听起来像是将工厂用作父范围,如果是,则应将其转换为控制器,作为不同视图上方的全局范围

如果这是在正确的轨道上,我可以作出一个砰的一声了

此外,如果您想采用最佳实践,请查看预制指令


祝你好运

在一个月的时间里,我经历了3次这样的反复,终于明白了

在准备打印内容的指令中,我生成一个新日历,然后调用document.ready中的其余代码(包括打开新窗口的工厂)。将代码放在就绪检查中似乎会导致iOS Safari认为它不再直接放在单击事件中,因此它有时会阻止新窗口弹出。删除document.ready检查似乎使其正常工作,并且对其他浏览器没有不良影响


我决定在指令中为工厂调用创建一个函数,并在文档中调用。如果不是iOS,就准备好了,否则就调用它,保留桌面浏览器的功能。

您确定需要新窗口吗?在父页面中有一个导航栏和其他按钮/选项,我不想在打印页面中包含这些按钮/选项。我还需要一套单独的样式应用于打印。例如,在日历中,事件具有全彩色背景,但在打印样式表中,它只是一个彩色轮廓,以减少打印墨水的使用。我还使用了另一个窗口作为排序的“预览”,这就是为什么我没有采取诸如隐藏容器div之类的方法?没有多少用户会以任何方式使用它。我仍然需要看到人们使用iOS设备打印任何东西。我知道这听起来可能是一个愚蠢的建议,但作为工程师,我不认为我们应该为0.05%的用户疯狂。你不应该需要一个新窗口。我在最近的一个项目中做了类似的事情
@媒体打印
显示混合:无打印时不想显示的任何内容都应该足够了。我刚刚解决了我的特殊问题,但我肯定会查看fullcalendar ui,使其更加“角度化”。为了一个好的建议,对你的答案投赞成票。