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>