如何解决防止jQuery缓存使用html…函数的AJAX回调过程中加载的资源破坏
如果将服务器设置为正确标识可以和不可以缓存哪些资源,则该cache: false
选项将不是必需的。
另一种选择是在方法上使用a POST
而不是GET
using type: 'POST'
选项ajax
。
解决方法
使用jQuery 1.7.1,我通过AJAX加载了一些HTML片段,这些片段是通过html()
方法注入到DOM中的。
HTML内容本身不能被缓存,但是它可能会加载一些可以缓存的JavaScript资源。
我发现的是,当我在$.ajax
调用中禁用缓存时,当HTML注入DOM时,这会将缓存清除参数添加到所有由jQuery发出的HTTP请求中。这样可以防止浏览器缓存原本静态的JavaScript资源。
我当前的解决方案不是很优雅,在这方面似乎很合情合理。在AJAX调用成功之后,但在处理HTML之前,我基本上翻转了全局缓存选项。
var $dynamic = $('#dynamic');
$.ajax({
url: href,cache: false,dataType: 'html',success: function(data,textStatus,jqXHR) {
// This is hokey,but needed to allow browser to cache
// resources loaded by the fragment
$.ajaxSetup({cache:true});
$dynamic.empty().html(data);
$.ajaxSetup({});
}
});
谁能想到一种更好的方法呢?我是否应该避免<script rel=...>
在加载了AJAX的片段中使用标记,而是使用其他方法加载了JavaScript?
旁注,似乎有一些相关的SO问题,但是其中一个问题的答案不是公认的答案,而另一个问题则表明行为在jQuery 1.4中已更改,因此这可能是某种回归。
编辑
详细地说,上面的jQuery代码段被应用于一个div
元素。整理成这样:
<html>
<head>
// ... load jquery ...
<script type="text/javascript">
$(document).ready(function() {
var $dynamic = $('#dynamic');
$('a').click(function(e) {
e.preventDefault();
var $a = $(this);
var href = $a.attr('href');
$.ajax({
url: href,jqXHR) {
$.ajaxSetup({cache:true});
$dynamic.empty().html(data);
$.ajaxSetup({});
}
});
});
});
</script>
</head>
<body>
<a href="/api/dynamic-content/">Click Here</a>
<div id="dynamic"></div>
</body>
</html>
事件发生时(在这种情况下为单击),处理程序将调用$.ajax
以将text /
html片段加载到#dynamic
div元素中。这是一个这样的片段可能看起来像的示例:
<p>Some dynamic content here...</p>
<script type="text/javascript" src="/static/some.js"></script>
因此,success
AJAX调用的处理程序加载了text / html代码段,并通过jQuery
html(...)
函数将其注入到DOM中。如您所见,text / html片段也可能具有指向外部脚本的链接。
有关的文档html(...)
表明,这种使用模式还不错,并且脚本资源将按照预期的方式加载和执行。
我遇到的问题是text / html片段的内容不可缓存,必须使用缓存清除机制调用。但是,它需要加载的JavaScript资源 是
静态且可缓存的,但是jQuery在加载JS资源时会应用缓存清除,因为最初的AJAX调用是使用cache : false
细分而言,这是事件链:
- 点击处理程序已调用
- AJAX函数执行
HTTP GET /api/dynamic-content/?_=1331829184164
- 成功处理程序调用
$dynamic.empty().html(data);
$dynamic.empty().html(...)
施行HTTP GET /static/some.js?_=1331829184859
我正在寻找一种更优雅的方法来禁用对text / html片段注入DOM后触发的后续或“内部” HTTP请求的缓存清除功能,该请求被触发以加载JS资源。
简而言之,其他所有事情都是正确的,我只是想让它做HTTP GET /static/some.js
,而不是HTTP GET
/static/some.js?_=1331829184859
最后一步。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。