javascript - jquery .js 加载长延迟

标签 javascript jquery performance

使用 jquery.load() 替换 div 的内容一切正常,但是存在一个主要的性能问题。加载到 div 中的页面包含一些外部 JavaScript 文件并使用 HttpWatch 我观察到以下内容:

0   0   GET (Cache) text/javascript <host>/js/file1.js
0   0   GET (Cache) text/javascript <host>/js/file2.js
0   0   GET (Cache) text/javascript <host>/js/file3.js
...
etc.

再往下一点(在相同的 load() 期间):

571 129862  GET 200 text/javascript <host>/js/file1.js?_=1263399258240
569 26439   GET 200 text/javascript <host>/js/file2.js?_=1263399258365
572 14683   GET 200 text/javascript <host>/js/file3.js?_=1263399258396
...
etc.

由于某种原因,相同的脚本似乎又被加载了。更糟糕的是,就在再次获取文件之前,浏览器似乎卡住了。

我可以阻止 jQuery 再次加载文件吗?整个问题导致我的页面延迟大约 5 秒。另外,_=1263399258240 是什么意思?

最佳答案

jQuery 具有三种不同的缓存选项。默认的 null 允许缓存所有请求除了脚本和 json 请求,而 truefalse 适用于所有请求.据我所知,您不能在 load() 方法中提供选项参数,因此您需要更改全局 jQuery ajax 选项。

我在下面给出了执行此操作的不同方法。

  1. 在您的请求完成后第一次尝试保留之前的全局选项(但确实有其缺点)。
  2. 第二个忽略默认设置,只设置选项,这样您总是允许缓存用于 ajax 结果(如果这对您来说不是问题,我建议这个,因为它是最简单的,没有隐藏的陷阱)和
  3. 第三个例子是如果你想允许缓存脚本,但不允许其他 ajax 请求。

示例 1:

我的第一个例子展示了如果你想在 load() 请求后恢复到正常设置时如何做到这一点:

    //first store defaults (we may want to revert to them)
 1: var prevCacheVal = $.ajaxSettings.cache; 
    //then tell jQuery that you want ajax to use cache if possible
 2: $.ajaxSetup({cache: true}); 
    //then call the load method with a callback function 
 3: $(myDiv).load(myURL,function(){
      /* revert back to previous settings. Note that jQuery makes 
         a distinction between false and null (null means never
         cache scripts, false means never cache anything). so it's
         important that the triple-equals operators are used, to
         check for "false" and not just "falsey" */
 4:   if (prevCacheVal === false) $.ajaxSetup({cache: false})
 5:   else if (prevCacheVal !== true) $.ajaxSetup({cache: null});
      //else prev was true, so we need not change anything
 6: });

重要说明,在执行上述操作时,您需要小心,一次只发送一个请求,因为每次存储和切换“默认值”都可能导致竞争条件。如果您需要上述功能发送并行请求的能力,您最好为jQuery.ajax() 方法编写自己的包装器,这样您就可以传入cache 选项基于每个请求。这将类似于下面安德烈斯建议的方法,但我建议使用修复程序指定 cache: true 并使用 jQuery.html(); 而不是 内部 HTML。然而,它变得比这更复杂,因为在内部,jQuery.html(); 使用全局选项请求脚本,因此您还需要覆盖函数调用深处的一些内部功能html(); 使 - 不是可以轻松完成的事情,但肯定是可能的。

示例 2:(推荐给原始提问者)

现在,如果您不关心恢复默认设置,并且希望为所有 ajax 请求启用缓存,您可以简单地调用$.ajaxSetup({cache: true}) ; 并像以前一样调用 load():

 $.ajaxSetup({cache: true}); 
 $(myDiv).load(myURL);

示例 3:

如果您希望 myURL 从缓存中加载(假设它是动态的),但确实想要缓存脚本,您需要添加对 myURL 的独特/随机查询,例如:

 $.ajaxSetup({cache: true}); 
 $(myDiv).load(myURL + "?myuniquetime=" + Date.getTime()); 
 /* getTime() is milliseconds since 1970 - should be unique enough, 
    unless you are firing of many per second, in which case you could
    use Math.random() instead. Also note that if myURL already includes
    a URL querystring, you'd want to replace '?' with '&' */

关于javascript - jquery .js 加载长延迟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2064070/

相关文章:

javascript - 在 jQuery 中添加和删除多个类

javascript - 找不到名称 'require' 。 Angular 2

javascript - 当屏幕宽度改变时,CSS 属性不适用。同时使用 css 和 jQuery

javascript - Select 查询是否使用 Firestore 上的所有文档大小?

javascript - 从 service worker 返回带有 JSON 的 Response 对象

java - 如何将列表值传递给jqplot以获取堆积条形图

javascript 函数运行到死循环

python - 如何有效地按元素评估整个 Python 函数列表?

python - 为什么 JAX 的 `split()` 第一次调用这么慢?

python - 这是解决子集和的更好方法吗?