当 TABLE 跨越多个页面时,如何使第一页上的 TFOOT 显示“继续...”?

Posted

技术标签:

【中文标题】当 TABLE 跨越多个页面时,如何使第一页上的 TFOOT 显示“继续...”?【英文标题】:When a TABLE spans multiple pages, how can I make the TFOOT on the first page say "continued..."? 【发布时间】:2020-04-25 01:01:04 【问题描述】:

在一个由模板引擎构建的 html 文档中,我有一个会计数据表——行数不定,底部有一个“总计”。有时该表会溢出到另一页。当它这样做时,对于用户来说,另一个页面上还有更多数据并不明显,除非他正在寻找总数并且找不到它。

所以,我将总行放在TFOOT 中,这样它就会打印在每一页上。即使用户漏掉了一些订单项,他也可以在报告的第一页看到总权利。

我想做的不是打印总数,而是在第一页的底部打印类似“(接下页)”的内容(TFOOT 由浏览器动态插入)并具有总计行仅打印在表格跨越的最后一页上。

是否可以使用 HTML、CSS 或 Javascript 在多页表格跨越的每个页面的末尾插入“(续...)”消息? p>

【问题讨论】:

只是检查:当您说表格溢出到另一个页面时,您所说的“页面”究竟是什么意思?你的意思是表格有一定数量的可见行和分页系统? 【参考方案1】:

不,据我所知这是不可能的,至少不能仅使用 CSS。

直观地说,解决方案可能是这样的:

@media print 
  tfoot:not(:last-child) span::after 
    content: "\2014 continued\2026";
  
<table>
  <tfoot>
    <tr>
      <th><span>Footer</span></th>
    </tr>
  </tfoot>
  <tbody>
    <tr>
      <td><span>A</span></td>
    </tr>
  </tbody>
</table>

但即使在打印包含 &lt;table&gt; 的 HTML 页面太长而无法在单个页面上放置时,它也会分布在多个页面上,并且每个页面上都会重复 &lt;tfoot&gt;(和/或 &lt;thead&gt;) . HTML 文档中仍然只有一个实际的&lt;tfoot&gt; 元素,据我所知,CSS 不允许选择特定的出现。因此,只能修改所有的重复(而不是在我们的例子中,除了最后一个之外的所有)。

【讨论】:

【参考方案2】:

如果您知道数据表,这是可能的。数据表是您页面的一个 jquery 插件,它将插入分页和您的模板/表包含的页面总数。这将有助于用户正确了解您拥有多少条记录。最后一行使用 colspan,您可以随时显示总数。您将能够显示总记录数,而不是插入“继续..”。

请查看数据表文档以供参考:https://datatables.net/

【讨论】:

【参考方案3】:

您是否尝试过使用onbeforeprint? 根据MDN:

...这些事件在打印对话框窗口打开之前引发... 允许页面在打印开始前更改其内容...

所以像这样一般的东西应该可以工作:

window.onbeforeprint = (event) => 
  const footers = document.querySelectorAll('tfoot');
  for (var i=0; i < footers.length; i++) 
    footers[i].innerHTML = 'continue...';
  
  document.querySelector('table:last-of-type tfoot').innerHTML = 'last one';  
;
<h1>Hit conrtol+p or any other method for printing</h1>
<table><tfoot></tfoot></table>
<table><tfoot></tfoot></table>
<table><tfoot></tfoot></table>
<table><tfoot></tfoot></table>
<table><tfoot></tfoot></table>
<table><tfoot></tfoot></table>
<table><tfoot></tfoot></table>
<table><tfoot></tfoot></table>

【讨论】:

投反对票的人能解释一下原因吗?似乎它实际上按照OP的要求找到了每个tfoot,更改了内容(使用可以切换到任何其他方法的innerHTML)并将最后一个更改为其他内容(OP没有放他的代码,所以我放了一些通用字符串)。 原来的问题是关于一张长表分布在多页上,所以有一个&lt;tfoot&gt;多次显示。此答案基于多个表。 @sinoroc 我以为 OP 说他在每个页面上都显示了相同的字符串(“total... etc”)tfoot,他想将其更改为“继续”... 是的,这是在打印 HTML 页面时自动发生的事情。如果单个&lt;table&gt; 分布在多个页面上,则&lt;tfoot&gt;&lt;thead&gt; 在每个页面上重复。所以 HTML 文档中只有一个,但它们出现了多次。据我所知,CSS 不允许选择特定的重复项,因此只能修改所有重复项(在我们的例子中,除了最后一个重复项之外的所有重复项)。【参考方案4】:

您可以先创建一个包含您的打印样式的媒体查询,然后使用content 添加“(继续...)”消息。

@media print 
  tfoot::after 
    content: " continued...";
  

当然,困难的部分是在最后一页将其删除。您可以使用Prince 来完成此操作。具体来说,检查Two-Pass Solution。

【讨论】:

以上是关于当 TABLE 跨越多个页面时,如何使第一页上的 TFOOT 显示“继续...”?的主要内容,如果未能解决你的问题,请参考以下文章

如何管理一页上的许多查询?

mpdf - 第一页上的文本延伸到第二页,与页眉重叠

如何在 Laravel 的一页上拥有多个 Yajra 数据表?

在第一页上单击按钮时播放声音到第二个网页

由于某种原因,第一页上的背景颜色不正确

仅在第一页页眉上的图像