我有一个生成PDF的按钮,然后通过用自身替换它所在的容器来在浏览器中重新加载PDF,但使用不同的链接。由于某种原因,新的PDF没有显示,旧的PDF无论刷新多少次都仍然存在。我没有使用 iframe 或对象/嵌入方法,我使用的是 http://pdfobject.com/
我的 html pdfobject 容器:
<div id="pdfContainer">
<div id="pdfSample"></div>
</div>
我的Javascript在窗口加载时启动src:
<script type="text/javascript">
$(function () {
PDFObject.embed("myInitialPDF.pdf", "#pdfSample");
})
</script>
我对 PDF 创建/容器刷新的 AJAX 调用:
$('#genPDF').click(function () {
$.ajax({
url: "mergePDF.php",
data: str,
cache: false,
success: function (result) {
$("#pdfobject").attr("src", "newPDF.pdf");
var container = document.getElementById("pdfContainer");
var content = container.innerHTML;
container.innerHTML = content;
}
});
});
每次单击带有 ID genPDF 的按钮时,都会生成一个名为"newPDF.pdf"的新 PDF,容器应将以前分配的 src 路径替换为新 PDF 的新源路径(与以前同名)。我不明白是否是缓存阻止了这一点。 我错过了什么吗?
您指定cache: false
这意味着success: function (result) {
传递了一个未缓存的result
。然后,您继续从不使用它,而是将对象的src
更改为原来的样子,因此获取该 src
url 的结果由浏览器缓存,因为它们之前被提取过。即使它没有缓存,浏览器也可能永远不会再次获取该文件,因为它从未感知到src
值的变化。
还和我在一起吗?
您可以做的是在 url 的末尾添加一个随机数,使其成为一个新的 url,浏览器将再次获取该文件,因为它不知道newPDF.pdf?number=random1
是否与 newPDF.pdf?number=random2
相同。更好的是,你可以添加一个数字,你知道每次尝试时都会有所不同,比如当前时间(以秒为单位)。
再次是您的代码,稍作调整:
$('#genPDF').click(function () {
$.ajax({
url: "mergePDF.php",
data: str,
cache: false,
success: function (result) {
var t = new Date.getTime();
$("#pdfobject").attr("src", "newPDF.pdf?"+t);
var container = document.getElementById("pdfContainer");
var content = container.innerHTML;
container.innerHTML = content;
}
});
});
我想补充一点重要一点:这不是一个足够好的解决方案,即使它回答了你的问题。更好的解决方案是生成一个以时间戳命名的文件(当然带有pdf扩展名)并将其作为result
返回并在$("#pdfobject").attr("src", result);
中使用它。确保清理任何以非常旧的时间戳命名的文件,例如超过一个小时、一天或一周,具体取决于您认为正确的内容。这将确保没有人通过几乎同时触发新的PDF创建来争夺文件名,但也确保您没有大量过时的PDF文件存档。
我遇到了同样的问题。我通过禁用 .htaccess 中 pdf 文件的缓存来设置它添加这个:
<FilesMatch ".(txt|pdf)$">
ExpiresActive On
ExpiresDefault A1
Header set Cache-Control "max-age=0, no-store, must-revalidate"
</FilesMatch>