chrome 的分页解决方法 (javascript)
Page break workaround (javascript) for chrome
众所周知,这个很棒的 CSS 属性:
table { page-break-inside:auto }
tr { page-break-inside:avoid; page-break-after:auto }
thead { display:table-header-group }
tfoot { display:table-footer-group }
不适用于 Chrome。所以现在是解决方法。我有这个 table 结构(请注意 JSP 和 EL 语法)
<table class="table resultTable">
<thead class="repeat">
<tr class="head">
<th>XPTO HEADER</th>
<th>XPTO HEADER</th>
</tr>
</thead>
<tbody>
<c:forEach items="${items}" var="t" varStatus="loop">
<tr>
<td class="money">${t.XPTO}</td>
<td class="money">${t.XPTO2}</td>
</tr>
<c:if test="${(loop.index + 1) % 20 == 0}">
<tr class="break-page">
</tr>
</c:if>
</c:forEach>
</tbody>
</table>
需要注意两件事:class "repeat" 在线程上 和 空 tr 与 break-page class 20行后.
所以,检查这个 CSS:
@media print {
.break-page {
display: block; page-break-before: always;
}
}
并检查这个 JS:
var repeat = $('.repeat tr');
$('.break-page').after(repeat.clone());
太棒了 :) 这完全符合我的要求。检查第一页:
第二页,你可以看到header重复了,但是,看看这个巨大的白色space:
就是这样。你们能帮我摆脱那个大白space吗?
如果有人遇到和我一样的麻烦,我也希望这能有所帮助。
谢谢
我所做的只是:使用 div 而不是 table 标签。另外,我在 chrome 的 20 行之后插入了一个 page-break。创建了 javascript hack 以再次添加 header。
注意: 这会为每个浏览器创建不同的页面和数据布局。 Chrome 有 3 页,最后一页 table 有点在中间...而 firefox 只有两页,非常适合。那是我能做的最好的了。
HTML
<div class="divTable">
<div class="divHeading">
<div class="divCell">${i18n.label.initialValue}</div>
<div class="divCell">${i18n.label.additions}</div>
<div class="divCell">${i18n.label.discounts}</div>
<div class="divCell">${i18n.label.finalValue}</div>
</div>
<c:forEach items="${detailedCashFlow.transactions}" var="t" varStatus="loop">
<div class="divCell money">${t.initialValue}</div>
<div class="divCell money">${t.totalAddition}</div>
<div class="divCell money">${t.totalDiscount}</div>
<div class="divCell money">${t.value}</div>
</div>
//THIS IS VERY IMPORTANT
<c:if test="${fn:length(detailedCashFlow.transactions) > (loop.index + 1 ) && (loop.index + 1) % 20 == 0}">
<div class="break-page"></div>
</c:if>
</c:forEach>
</div>
CSS
.divTable
{
display: table;
width: 100%;
margin-top: 20px;
}
.divTitle
{
display: table-caption;
text-align: center;
font-weight: bold;
font-size: larger;
}
.divHeading
{
display: table-row;
font-weight: bold;
text-align: center;
}
.divRow
{
display: table-row;
}
.divCell
{
display: table-cell;
border: solid;
border-width: thin;
padding-left: 5px;
padding-right: 5px;
text-align: center;
font-size: 12px;
}
.divRow:nth-child(even){
background: #aad4ff !important;
}
.divRow:nth-child(odd){
background: #FFF !important;
}
@media print {
.divHeading {
display:table-header-group;
}
.divRow
{
-webkit-column-break-inside: avoid;
webkit-page-break-inside:avoid;
page-break-inside:avoid; page-break-after:auto;
}
.break-page {
page-break-before: always;
}
}
JS 黑客
var is_chrome = window.chrome;
if(is_chrome){
var repeat = $('.divHeading');
$('.break-page').after(repeat.clone());
}
众所周知,这个很棒的 CSS 属性:
table { page-break-inside:auto }
tr { page-break-inside:avoid; page-break-after:auto }
thead { display:table-header-group }
tfoot { display:table-footer-group }
不适用于 Chrome。所以现在是解决方法。我有这个 table 结构(请注意 JSP 和 EL 语法)
<table class="table resultTable">
<thead class="repeat">
<tr class="head">
<th>XPTO HEADER</th>
<th>XPTO HEADER</th>
</tr>
</thead>
<tbody>
<c:forEach items="${items}" var="t" varStatus="loop">
<tr>
<td class="money">${t.XPTO}</td>
<td class="money">${t.XPTO2}</td>
</tr>
<c:if test="${(loop.index + 1) % 20 == 0}">
<tr class="break-page">
</tr>
</c:if>
</c:forEach>
</tbody>
</table>
需要注意两件事:class "repeat" 在线程上 和 空 tr 与 break-page class 20行后.
所以,检查这个 CSS:
@media print {
.break-page {
display: block; page-break-before: always;
}
}
并检查这个 JS:
var repeat = $('.repeat tr');
$('.break-page').after(repeat.clone());
太棒了 :) 这完全符合我的要求。检查第一页:
第二页,你可以看到header重复了,但是,看看这个巨大的白色space:
就是这样。你们能帮我摆脱那个大白space吗? 如果有人遇到和我一样的麻烦,我也希望这能有所帮助。
谢谢
我所做的只是:使用 div 而不是 table 标签。另外,我在 chrome 的 20 行之后插入了一个 page-break。创建了 javascript hack 以再次添加 header。
注意: 这会为每个浏览器创建不同的页面和数据布局。 Chrome 有 3 页,最后一页 table 有点在中间...而 firefox 只有两页,非常适合。那是我能做的最好的了。
HTML
<div class="divTable">
<div class="divHeading">
<div class="divCell">${i18n.label.initialValue}</div>
<div class="divCell">${i18n.label.additions}</div>
<div class="divCell">${i18n.label.discounts}</div>
<div class="divCell">${i18n.label.finalValue}</div>
</div>
<c:forEach items="${detailedCashFlow.transactions}" var="t" varStatus="loop">
<div class="divCell money">${t.initialValue}</div>
<div class="divCell money">${t.totalAddition}</div>
<div class="divCell money">${t.totalDiscount}</div>
<div class="divCell money">${t.value}</div>
</div>
//THIS IS VERY IMPORTANT
<c:if test="${fn:length(detailedCashFlow.transactions) > (loop.index + 1 ) && (loop.index + 1) % 20 == 0}">
<div class="break-page"></div>
</c:if>
</c:forEach>
</div>
CSS
.divTable
{
display: table;
width: 100%;
margin-top: 20px;
}
.divTitle
{
display: table-caption;
text-align: center;
font-weight: bold;
font-size: larger;
}
.divHeading
{
display: table-row;
font-weight: bold;
text-align: center;
}
.divRow
{
display: table-row;
}
.divCell
{
display: table-cell;
border: solid;
border-width: thin;
padding-left: 5px;
padding-right: 5px;
text-align: center;
font-size: 12px;
}
.divRow:nth-child(even){
background: #aad4ff !important;
}
.divRow:nth-child(odd){
background: #FFF !important;
}
@media print {
.divHeading {
display:table-header-group;
}
.divRow
{
-webkit-column-break-inside: avoid;
webkit-page-break-inside:avoid;
page-break-inside:avoid; page-break-after:auto;
}
.break-page {
page-break-before: always;
}
}
JS 黑客
var is_chrome = window.chrome;
if(is_chrome){
var repeat = $('.divHeading');
$('.break-page').after(repeat.clone());
}