【问题标题】:Prevent caching linked resources within XHR calls防止在 XHR 调用中缓存链接资源
【发布时间】:2012-05-01 22:42:13
【问题描述】:

这个问题不是关于 IE 缓存 XHR 调用的问题,我已经解决了缓存问题,并且从我的 XHR 调用中得到了正确的结果(即改变了)。但是:在我的 XHR 响应(即 HTML)中,不仅 HTML 发生了变化,而且 HTML 所引用的图像也发生了变化。虽然 HTML 正确更改,但此图像不会更改,仅当我完全刷新页面时。

因此,XHR 调用本身没有被缓存,但链接的资源似乎被缓存了。这意味着任何专注于 XHR 调用的解决方案都不起作用(例如向 URL 添加额外参数或设置标头)。似乎浏览器(我尝试过 Safari 和 Firefox)决定使用它们的缓存来帮助 XHR 调用它的链接资源。事实上,开发工具只显示 XHR 的传输,没有其他文件。

如何强制浏览器正确加载(请求)来自 XHR 调用的图像?

我正在使用 PHP 服务器端(也提供标头)和 MooTools 来处理 XHR 调用。脚本永远不会被缓存,图像会检查“if-modified”标头(尽管我也尝试过从不缓存这些)。

【问题讨论】:

    标签: php ajax caching http-headers mootools


    【解决方案1】:

    您可以在响应上运行此 JavaScript 代码...

    var container = document.createElement('div'),
        date = +new Date;
    
    container.innerHTML = htmlReturnedFromXHR;
    
    [].forEach.call(container.querySelectorAll('img[src]'), function(img) {
        img.src += '?' + date;
    });
    

    或者,如果您必须支持旧版浏览器,请将上面的循环替换为...

    var img = container.getElementsByTagName('img');
    
    for (i = 0, length = img.length; i < length; i++) {
        img[i].src += '?' + date;
    }
    

    执行上述操作的 MooTools 代码:

    var container = document.createElement('div'),
        date = +new Date
        imgs = container.getElements('img');
    
    imgs.each(function(img) {
        img.src = img.src + '?' + date;
    }
    

    【讨论】:

    • 那么,通过添加参数来缓存图像吗?
    • 是的,这似乎有效。我已经用 PHP 完成了,因为 HTML 是由 PHP 脚本生成的。所以我在&lt;img&gt; 标签的src 中添加了&amp;nocache=' . (microtime(true) * 10000)。我要再测试一些,看看这是否一直有效。
    • @kasimir 它会起作用,如果 URL 发生变化,浏览器总是会再次请求它。
    • 感谢您的解决方案。我在 PHP 中应用了这个想法(如我之前的评论中所述)并且效果很好。但是,也许您能详细说明为什么只要 src 相同,即使标题等另有说明,XHR 也不会获取链接资源?
    • @kasimir 我认为标题可能没有像您认为他们正在做的事情。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多