如何阻止jquery在通过ajax调用的脚本中附加唯一的id?

时间:2009-10-08 10:48:32

标签: javascript jquery ajax

我正在使用jquery的ajax函数来抓取页面片段并在页面的一部分中显示 - 这个片段包含html和对外部js文件的引用。

程序流程如下:

主页调用 - >片段页面调用 - >各种大型js文件通过脚本标签。

我在初始ajax调用时打开了缓存选项,以便缓存fragement页面(没有附加到url的唯一ID),但是当加载片段时,似乎jquery重写脚本URL以包含一个unix时间戳,以便浏览器每次都下载脚本的新副本。我正在调用的脚本大约250kb缩小了,这真的会损害用户体验,因为浏览器在被调用时会锁定。这是jquery的理想行为吗?有没有办法禁用网址重写?

非常感谢你的帮助

3 个答案:

答案 0 :(得分:11)

这个解决方案不像默多克的解决方案那么糟糕:

$.ajaxPrefilter('script', function(options) {
    options.cache = true;
});

请参阅http://api.jquery.com/jQuery.ajaxPrefilter/

答案 1 :(得分:4)

看起来jQuerys的evalScript功能让你搞砸了......

jQuery的第543行:

function evalScript( i, elem ) {
    if ( elem.src )
        jQuery.ajax({
            url: elem.src,
            async: false,
            dataType: "script"
        });

   else
        jQuery.globalEval( elem.text || elem.textContent || elem.innerHTML || "" );

   if ( elem.parentNode )
       elem.parentNode.removeChild( elem );
}

以下是发生的情况的细分: 主页的JS调用:

$.ajax({
    url:"frag.htm",
    type:"GET",
    success:callBackFunction
})

和GETs frag.htm包含这样的内容:

<html><head><script src="test.js"></script></head><body>Content</body></html>

然后调用你的回调函数,它可能如下所示:

function callBackFunction(data){
    $("#ajaxContent").html(data); // <- this is the beginning of your problems...
}

当调用jQuery的html(数据)函数时,通过删除任何脚本标记来“清除”HTML,然后在每个脚本标记上调用evalScript。 正如您所看到的,evalScript没有指定“cache:true”,因此当它通过$ .ajax时,cache为null。当cache为null且dataType为“script”时,jQuery设置cache = false。

因此,为了避免这个问题,试试这个:

function callBackFunction(data){
    var tempAJAX = $.ajax; // save the original $.ajax
        $.ajax=function(s){ // wrap the old $.ajax so set cache to true...
            s.cache=true;
            tempAJAX(s); // call old $.ajax
        }
        $("#ajaxContent").html(data); // insert the HTML and download the <script>s
        $.ajax = tempAJAX; // reset $.ajax to the original.
    }
}

在我们将新的HTML从“frag.htm”插入主页面之前,我们拦截所有对$ .ajax的调用,修改对象以包含cache = true,然后在加载脚本后插入HTML。

如果您有任何问题,请与我们联系。

答案 2 :(得分:0)

  1. 强制网络服务器为将来的过期日期提供服务。

  2. 如果您使用dataType =“script”作为jquery ajax的选项,默认情况下将禁用缓存,请参阅http://docs.jquery.com/Ajax/jQuery.ajax#options,尝试将其手动设置为“html”。

  3. $.ajax({
      type: "GET",
      url: "test.js",
      dataType: "html" // if not set jquery will guess what type it is and disables caching when matching "script"
    });