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

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

程序流程如下所示:

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

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

非常感谢你的帮助

看起来像jQuerys的evalScriptfunction搞砸了你……

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,其中包含以下内容:

 Content 

然后调用你的回调函数,它可能看起来像这样:

 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  

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

如果您有任何疑问,请告诉我。

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

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

见http://api.jquery.com/jQuery.ajaxPrefilter/

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

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

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