PDFObject:如何使用同一文件的不同副本重新加载容器



我有一个生成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>

最新更新