我正在使用jquery的ajax函数来抓取页面片段并在页面的一部分中显示 - 这个片段包含html和对外部js文件的引用。
程序流程如下:
主页调用 - >片段页面调用 - >各种大型js文件通过脚本标签。
我在初始ajax调用时打开了缓存选项,以便缓存fragement页面(没有附加到url的唯一ID),但是当加载片段时,似乎jquery重写脚本URL以包含一个unix时间戳,以便浏览器每次都下载脚本的新副本。我正在调用的脚本大约250kb缩小了,这真的会损害用户体验,因为浏览器在被调用时会锁定。这是jquery的理想行为吗?有没有办法禁用网址重写?
非常感谢你的帮助
答案 0 :(得分:11)
这个解决方案不像默多克的解决方案那么糟糕:
$.ajaxPrefilter('script', function(options) {
options.cache = true;
});
答案 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)
强制网络服务器为将来的过期日期提供服务。
如果您使用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"
});