PDFObject:如何使用同一文件的不同副本重新加载容器?
PDFObject: How to reload container with a different copy of the same file?
我有一个生成 PDF 的按钮,然后通过将其所在的容器替换为自身来在浏览器中重新加载 PDF,但使用不同的 link。由于某种原因,新的PDF没有显示出来,旧的无论刷新多少次都还在。我没有使用 iframe 或 object/embed 方法,我使用的是 http://pdfobject.com/
我的 html pdfobject 容器:
<div id="pdfContainer">
<div id="pdfSample"></div>
</div>
我的 Javascript 在 window 加载时启动 src:
<script type="text/javascript">
$(function () {
PDFObject.embed("myInitialPDF.pdf", "#pdfSample");
})
</script>
我的 AJAX 呼叫 PDF-creation/container-refresh:
$('#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
[=34= 的结果] 被浏览器缓存,因为它们之前被获取过。即使它没有被缓存,浏览器也可能永远不会再次获取该文件,因为它从未感知到 src
.
中值的变化。
还在我身边吗?
你可以做的是在 url 的末尾添加一个随机数,这样它就是一个新的 url 并且浏览器将再次获取文件,因为它不知道 [=17] =] 与 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 扩展名)和 return 作为 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>
我有一个生成 PDF 的按钮,然后通过将其所在的容器替换为自身来在浏览器中重新加载 PDF,但使用不同的 link。由于某种原因,新的PDF没有显示出来,旧的无论刷新多少次都还在。我没有使用 iframe 或 object/embed 方法,我使用的是 http://pdfobject.com/
我的 html pdfobject 容器:
<div id="pdfContainer">
<div id="pdfSample"></div>
</div>
我的 Javascript 在 window 加载时启动 src:
<script type="text/javascript">
$(function () {
PDFObject.embed("myInitialPDF.pdf", "#pdfSample");
})
</script>
我的 AJAX 呼叫 PDF-creation/container-refresh:
$('#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
[=34= 的结果] 被浏览器缓存,因为它们之前被获取过。即使它没有被缓存,浏览器也可能永远不会再次获取该文件,因为它从未感知到 src
.
还在我身边吗?
你可以做的是在 url 的末尾添加一个随机数,这样它就是一个新的 url 并且浏览器将再次获取文件,因为它不知道 [=17] =] 与 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 扩展名)和 return 作为 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>