使用jQuery动态地向页面添加脚本从不使用缓存文件

时间:2011-08-14 03:25:31

标签: javascript jquery

我正在使用jQuery动态地将脚本添加到我的页面并且它可以工作,但是jQuery将“_ = TIMESTAMP”附加到URL,导致浏览器永远不会使用缓存。使用以下代码:

<!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.0 Transitional//EN' 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd'>
<html xmlns='http://www.w3.org/1999/xhtml'>
<head>
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.5/jquery.min.js"></script>
</head>
<body>
    <script type="text/javascript">
        $("head").append('<script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.15/jquery-ui.min.js"></scr' + 'ipt>');
    </script>
</body>
</html>

我可以在firebug中看到所请求的URL是:

https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.15/jquery-ui.min.js?_=1313291978667

有谁知道如何告诉jQuery不要这样做?

由于

3 个答案:

答案 0 :(得分:25)

要回答原始问题,您会看到附加时间戳,因为jQuery by defaultcache: falsescript调用设置了jsonp,这些调用会将时间戳附加到网址。

要避免使用时间戳,您可以执行以下操作:

$.ajaxPrefilter(function( options, originalOptions, jqXHR ) {
  if ( options.dataType == 'script' || originalOptions.dataType == 'script' ) {
      options.cache = true;
  }
});

这会为所有$.ajax次调用设置全局prefilter,包括jQuery在请求script时所做的调用。

我们检查dataType以确保我们不会无意中针对其他ajax调用并明确将cache设置为true。这样可以避免时间戳附加问题。

您现在可以使用原始代码,它将从缓存中提取。

答案 1 :(得分:7)

您可以使用$.ajax来获取脚本,而不是附加脚本标记

$.ajax({
  url: "http://ajax.googleapis.com/ajax/libs/jquery/1.5/jquery.min.js",
  dataType: "script",
  cache: true,//This will decide whether to cache it or no so that it will not add the timestamp along with the request
  success: function(){}//In the success handler you can write your code which uses resources from this js file ensuring the script has loaded successfully before using it
});

答案 2 :(得分:4)

这是适合我的东西

// Backup the jquery ajax cache setting
var jQueryAjaxSettingsCache = jQuery.ajaxSettings.cache;

// Disable the ?_=TIMESTAMP addition
jQuery.ajaxSettings.cache = true;

// Do the cached script inserting ...
$("head").append('<script src="//ajax.googleapis.com/ajax/libs/jqueryui/1.8.15/jquery-ui.min.js"></scr' + 'ipt>');

// Restore the jquery ajax cache setting
jQuery.ajaxSettings.cache = jQueryAjaxSettingsCache;