【问题标题】:print content of <iframe> which exceeds one page<iframe> 的打印内容超过一页
【发布时间】:2019-03-09 00:20:46
【问题描述】:

在我的反应应用程序中,我有一个iframe,它加载了 HTML 文档,其内容超过了 1 页。按Ctrl+p我想分几页打印,但打印预览只显示一页。

识别iframe的内容不止一个A4页面应该如何处理?

chrome devtool 中的 DOM 看起来像

<div class="article-container">
  <iframe style="">#document
   /* hundreds of <p> tags */
  </iframe>
</div>

react 应用中的结构是这样的

   <div className="article-container">
      <FrameText content={content} status={!this.state.editStatus} />
   </div>

和 FrameText

class FrameText extends React.Component<Props> {
  iframe: HTMLIFrameElement;
  compinentDidMount(){
    window.addEventListener('beforeprint',(e)=>{console.log(e);})
  }
  /* other stuff*/
  render() {
      const { status } = this.props;
      return <iframe ref={(ref) => (this.iframe = ref!)} style={!status ? { display: 'none' } : {}} />;
  }

因此,当按下ctrl+p 时,我得到了事件,并且 iframe 文档在事件中。另外,我在当地也有 iframe 的内容。

我找不到任何地方,当触发此事件时,我可以用它做什么来操纵或以某种方式告诉打印预览内容很长。

另外,css是

@media print {
  .article-container {
    background-color: white;
    height: 100%;
    width: 100%;
    position: fixed;
    top: 0;
    left: 0;
    margin: 0;
    padding: 15px;
    font-size: 14px;
    line-height: 18px;
  }
}

【问题讨论】:

  • 有点脏但可能就足够了:如果您知道大约页数,您可以估计 iFrame 必须以像素为单位的高度,并将其设置在 print-css 中,例如 4000px 或东西。

标签: javascript iframe media-queries dom-events printing-web-page


【解决方案1】:

您的打印媒体查询不适用于 iframe 内部内容,这是打印时忽略 iframe 大小的原因如果您想将特定的打印样式应用于 iframe,那么您必须通过适当的方法从外部引用(无论是 js 还是 html)我正在编写一个示例以将样式引用到 iframe,可能存在其他实现方式来

let cssLink = document.createElement("link");
cssLink.href = "style.css"; 
cssLink.rel = "stylesheet"; 
cssLink.type = "text/css"; 
frames['iframe1'].document.head.appendChild(cssLink);

【讨论】:

  • 嗨,感谢您的提示,但是显示内容高度/长度的自定义 js 或 css 的内容应该是什么?
  • 制作一个只有一个类的css文件 @media print { iframe { height: 100%;宽度:100%;位置:固定;顶部:0;左:0;边距:0;填充:15px;字体大小:14px;行高:18px; } }
  • 如果你看到它在 iframe 标签上的类而不是在封闭的 div 上,则不完全是
【解决方案2】:

我能够通过捕获 CTRL P 事件在 iframe 中打印多个页面,将焦点放在 iframe 上,然后在 iframe 上启动打印。

<iframe id="iframe" name="iframe" src="2.html"></iframe>


<script src="https://code.jquery.com/jquery.min.js"></script>

<script>

    $(document).bind("keyup keydown", function (e) {
        if (e.ctrlKey && e.keyCode === 80) {
            window.frames["iframe"].focus();
            window.frames["iframe"].print();
            return false;
        }
        return true;
    });

</script>

【讨论】:

  • 我已经尝试过了,但还是一样,当然没有 JQuery。我不想使用 JQuery,因为只有一个功能
  • @Amir-Mousavi 您是否至少尝试过使用 JQuery,只是为了至少看看这个概念是否有效?我用 4 页 iframe 试了一下,它正确打印(到 PDF)。
  • 不,我没有,实际上可以在 componentDidMount 上应用同样的事情,为 es6 添加事件列表器 onBeforePrint() 但是因为我已经向 iframe 添加了其他侦听器,例如 onload、cancel 或 print当打印预览窗口关闭时,这些listneres 返回 null 并且应用程序崩溃。所以我认为即使是 JQuery 也不会帮助我。除此之外,是否添加新库是项目经理的决定:)
猜你喜欢
  • 2011-01-14
  • 2013-01-27
  • 1970-01-01
  • 1970-01-01
  • 2012-03-20
  • 2012-03-25
  • 1970-01-01
  • 2015-04-03
  • 2020-05-16
相关资源
最近更新 更多