jQuery版本1.5 - ajax - <script>标签时间戳问题

13
如果我使用ajax(jQuery)加载一些内容,并且其中包含一个脚本标签,jQuery 1.5会将时间戳添加到脚本标签的src URL中。请参见以下示例。
示例: 使用ajax加载的内容:
<div>text1</div>
<script type="text/javascript" src="/js/abc-xyz.js?r=1.1"></script>

这是插入前一个内容后加载脚本代码的源URL:

.../js/abc-xyz.js?r=1.1&_=1297892228466

有人知道为什么会发生这种情况吗?它只在使用jQuery 1.5时发生,而在jQuery 1.4.4中则没有。

代码示例:

$.ajax({
    url: content.html,
    type: 'GET',
    data: someDataObject,
    success: function(data) {
        // some code here

    },
    error: function(data) {
        // some code here
    }
});
感谢。

如果我必须猜测的话,我会说它添加了获取参数来防止从缓存加载js文件。目前我想不出其他的原因了。但这不应该破坏任何功能。 - Michael
你能展示一下你的Javascript代码吗? - lonesomeday
我添加了JavaScript代码示例。 - Norbert Tamas
2个回答

10

以下是我从jQuery团队得到的答案。票号#8298:http://bugs.jquery.com/ticket/8298

答案:

在检查了您的报告和代码样本后,我得出结论,这不是一个错误。我还制作了此测试用例。jQuery 1.4+(直到1.5)存在一个错误,导致缓存选项未默认为false,并且该错误(请参见#7578)已在1.5中修复。 现在你可能知道也可能不知道的是,当进行DOM操作时,jQuery会特殊处理脚本标记(以防止IE中的某些错误)。它会过滤掉它们并通过ajax请求它们。这就解释了为什么即使是“普通”的内联脚本标记也会突然使用附加的URL参数进行请求。 如果这对您产生了意想不到的副作用,有几种方法可以解决。

  1. 在适当的情况下使用$.ajaxSetup({cache:true})

  2. 对于脚本请求,使用预过滤器,例如检查您不想添加随机参数的URL,并在这些URL的预过滤器中设置cache:true

  3. 例如,在成功调用中自己处理脚本标记,通过执行以下操作之类的操作:

..行:

var elems = $(htmlwithscripttags);
elems.filter("script") //now do whatever with the scripts
elems.filter(":not(script)").appendTo("body"); //e.g.

2
2 对我很有效: $.ajaxPrefilter('script',function(options){ options.cache = true; }); - Blaise

7

迈克尔在他的评论中是正确的,如果你想要禁用它,请在ajax请求中使用:cache: true。要启用,请使用cache: false(我认为这是默认设置)。

禁用时间戳:

$.ajax({
    url: content.html,
    cache: true,
    type: 'GET',
    data: someDataObject,
    success: function(data) {
        // some code here

    },
    error: function(data) {
        // some code here
    }
});

我知道如何控制缓存。我的问题是广告将时间戳添加到使用 AJAX 加载的脚本 src URL 中。 - Norbert Tamas
我们工作项目中的这个问题是由于在被调用的插件中添加了 $.ajaxSetup({cache:false}) 导致的。 - theblang
这种方法并不是最好的,因为$.ajaxSetup适用于所有请求。 - lmcarreiro

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接