如何使用样式表打印 iFrame?

Posted

技术标签:

【中文标题】如何使用样式表打印 iFrame?【英文标题】:How to print an iFrame with stylesheet? 【发布时间】:2017-12-06 16:46:25 【问题描述】:

我创建了这段代码来打印 iFrame 中的数据

function (data) 
    var frame = $("<iframe>", 
        name: "iFrame",
        class: "printFrame"
    );

    frame.appendTo("body");

    var head = $("<head></head>");

    _.each($("head link[rel=stylesheet]"), function (link) 
        var csslink = $("<link/>",  rel: "stylesheet", href: $(link).prop("href") )
        head.append(csslink);
    ;);

    frame.contents().find("head")
        .replaceWith(head);

    frame.contents().find("body")
        .append(this.html());

    window.frames["iFrame"].focus();
    window.frames["iFrame"].print();

这将创建一个 iFrame,在其中设置该网站所需的所有 css 链接的位置添加一个头部。然后它创建身体。

麻烦的是,样式不会应用于打印,除非我在 frame.contents().find("head").replaceWith(head) 行中断,这意味着该部分中的某些内容正在异步运行。

问题是,我能否以某种方式让代码在运行该行之前等待片刻,或者是否有其他方法可以做到这一点?不幸的是,我对 iFrame 不是很熟悉,所以我不知道它在那里试图做什么。

【问题讨论】:

***.com/questions/9616426/… @SagarSinha 通过链接该页面不确定您想要什么。您能否进一步解释或评论您要引用该线程的哪一部分? 【参考方案1】:

结果证明这是一个真正的麻烦。我一直不太愿意使用 iframe,但由于有很多资源说使用 iframe 打印的内容比屏幕上的内容多,所以我们想尝试一下。

这个问题是通过将数据放在一个隐藏的 div 中来解决的,然后在 window.print() 之前显示该 div。同时,页面上的所有其他元素都被赋予了一个“hidden-print”类,这是我们已经用来隐藏打印元素的类。

这对用户来说可能不那么优雅(div 将在用户退出打印对话框之前短暂显示),但它是一种更简单的代码使用和管理方式。

【讨论】:

【参考方案2】:

我认为您可以/应该将最后一个 focus() 和 print() 调用移动到 iframe 的 onload 处理程序,以便在加载和应用样式后发生。

【讨论】:

您能解释一下如何对 iframe 进行加载处理吗?更准确地说,如何真正让 iframe 获取此处理程序而不是整个文档。 举个例子就好了【参考方案3】:

我刚刚遇到了同样的问题并做了以下操作:

setTimeout(() => 
  window.frames["iFrame"].focus();
  window.frames["iFrame"].print();
, 500)

这似乎已经为我整理好了。我讨厌使用超时,而且长度充其量只是猜测工作,但由于它不是系统关键,所以我现在可以运行它。

【讨论】:

以上是关于如何使用样式表打印 iFrame?的主要内容,如果未能解决你的问题,请参考以下文章

如何将外部样式表和 javascript 导入 iframe

如何打印隐藏 iframe 的内容?

如何跨域更改 iframe 内容的样式?

如何使用 jquery 从 IFrame 本身更改 IFrame 样式?

Fancybox iframe 内容 - 如何从父级访问 CSS?

如何使用外部图像 url 打印 iframe 内容