问题是浏览器使用容器iframe的宽度来确定如何缩放该框架的内容以进行打印。因此,帧需要明确确定其宽度。
不幸的是,动态计算出打印宽度非常棘手,涉及到一些骇客。你可能会更好,只需构造一个固定宽度的组件页面并对iframe宽度进行硬编码即可。
但是,如果你真的需要动态大小它们,你可以运行下面的代码文件加载之后(在Chrome测试):
var iframes = document.getElementsByTagName("iframe");
for(var i = 0; i < iframes.length; ++i) {
var curFrame = iframes[i];
var curBody = curFrame.contentDocument.body;
curBody.innerHTML = '<div id="iframe-print-content" style="display:inline-block; overflow:hidden; white-space: nowrap;">'
+ curBody.innerHTML + '</div>';
var printContent = curFrame.contentDocument.getElementById("iframe-print-content");
var curWidth = printContent.offsetWidth + printContent.offsetLeft;
iframes[i].style.width=(curWidth + "px");
}
运行之后,就可以正常打印或致电window.print()
或者做任何你想做的事情。
注:此方法将在IE6还是IE7不大的工作,因为他们不支持inline-block
。 (还有一些其他的老浏览器也没有)。你可以,当然,尝试
display:-moz-inline-stack; display:inline-block; zoom:1; *display:inline; overflow:hidden; white-space: nowrap;
相反,这可能会照顾大多数情况下,但我不作任何承诺,对旧版浏览器。
祝你好运,很抱歉听到你被这些页面上的代码卡住了。
编辑:将上述溶液是在Firefox有点靠不住。
解决方案适用于Firefox(测试&在Firefox 5个):
var iframes = document.getElementsByTagName("iframe");
for(var i = 0; i < iframes.length; ++i) {
var curFrame = iframes[i];
var curBody = curFrame.contentDocument.body;
var oldHTML = curBody.innerHTML;
curBody.innerHTML = '<div id="iframe-print-content" style="display:inline-block; overflow:hidden;">' + oldHTML + '</div>';
var printContent = curFrame.contentDocument.getElementById("iframe-print-content");
var curWidth = printContent.offsetWidth + printContent.offsetLeft + 25;
var curHeight = printContent.offsetHeight + printContent.offsetTop + 25;
curBody.innerHTML = oldHTML;
iframes[i].style.width=(curWidth + "px");
iframes[i].style.height=(curHeight + "px");
}
对于为什么这个一般方法的工作原理的完整说明,请参见上面我的回答。
与上述解决方案有什么不同,为什么?
首先,Firefox的细节:
有几个关键的不同。第一个是注意到Firefox处理display: inline-block
和white-space: nowrap
与用于固定宽度元素的Chromium/WebKit不同的方式(这就是为什么一个文档看起来非常不符合前面的代码)。接下来就是注意到Firefox喜欢在iframe中留出一点余量。我对Firefox的代码并不是很熟悉(花费我的时间去研究Chromium),但是我通常的解决方案(除了避免使用框架外)只是在边距上增加了25px。像这样的一笔钱似乎是解决这类问题的一种流行手段。
现在,代码实际上是更好的部件:
首先,这表现在存储老的身体,抬起身到一个div进行测量,然后恢复旧体。这应该避免不灵活的CSS问题,并应保证更可预测的行为。其次,它现在对宽度的高度做了同样的事情(我之前的假设是硬编码的宽度不起作用,并且这是一个更灵活的解决方案)。
为什么这仍然不好?
拿走white-space: nowrap
将使文本在Chromium/WebKit上打印。它仍然打印良好,但它不完全正确,因为一些额外的文本将包装。为了使这是一个真正可行的解决方案,您仍然必须执行浏览器检测代码。
此外,我建议使用此代码快速找出合适的宽度和高度,然后测试并硬编码每个浏览器的正确尺寸。这是一个丑陋的解决方案,但它最终是这种情况下唯一真正强大的解决方案。
500!看起来不错!你能否把这些文件用zip压缩并在这里发布链接?肯定会试一试! – Tarun
下面是一个文件的zip文件:http://dl.dropbox.com/u/291229/print-test.zip – Kevin
抱歉无法修复它。最好的建议是尝试通过ajax而不是使用iframe加载内容。 – Tarun