我有一个按钮,它生成一个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,容器应该用新PDF的新源路径(与以前相同的名称)替换以前分配的src路径。我不明白是否是缓存阻止了这一切。我是不是遗漏了什么?
发布于 2016-04-21 21:02:02
您指定了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文件存档。
发布于 2018-04-27 07:56:36
我也有同样的问题。我通过禁用.htaccess中pdf文件的缓存来设置它,添加如下:
<FilesMatch "\.(txt|pdf)$">
ExpiresActive On
ExpiresDefault A1
Header set Cache-Control "max-age=0, no-store, must-revalidate"
</FilesMatch>https://stackoverflow.com/questions/36780174
复制相似问题