【发布时间】:2012-04-12 16:37:41
【问题描述】:
我正在构建一个单页 javascript 应用程序,当应用程序启动时,我使用单个 javascript 文件即时加载我需要的所有其他文件。当我点击刷新时,根据萤火虫,我的 HTML 页面以及 javascript 页面将加载一个 304 Not Modified 错误并且我的 javascript 停止工作。
我知道这是由于浏览器缓存造成的,但我该如何避免呢?我使用单个脚本调用加载初始 HTML 页面
<script src="js/config.js" type="text/javascript"></script>
然后继续从该脚本中动态加载其余部分
window.onload = function () {
var scripts = ['http://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.7.1.min.js', 'js/core.js', 'js/sandbox.js']; //Application scripts
var loaded = 0;
//Callback is executed after all scripts have been loaded.
var callback = function () {
if (loaded + 1 == scripts.length) {
//Create Modules
CORE.loader("js/modules/Login.js", function () {
CORE.createModule('loginForm', Login);
});
//Create HTML bindings.
CORE.createBinding('appContainer', '#Login', 'login.html');
CORE.bindHTML(window.location.hash); //Loads hash based page on startup
} else {
loaded++;
loadScript(scripts[loaded], callback);
}
};
loadScript(scripts[0], callback);
function loadScript(scriptSrc, callback) {
var script = document.createElement('script');
script.type = 'text/javascript';
script.async = true;
script.src = scripts[loaded];
if (script.readyState) {
script.onreadystatechange = function () {
if (script.readyState == 'loaded' || script.readyState == 'complete') {
script.onreadystatechange = null;
callback();
}
};
} else {
script.onload = function () {
callback();
};
}
document.getElementsByTagName('head')[0].appendChild(script);
}
};
我知道 Gmail 使用 cookie 来防止这种情况。有谁知道如何采用这种方法?我是否应该在服务器上设置 cookie,然后在每个页面加载/刷新时使用 JS 检查它,如果 cookie 告诉我页面是从缓存加载的,则使用 window.location.refresh() 之类的东西?
【问题讨论】:
-
不要刷新页面,而是重新加载。
-
我不能指望应用程序的用户知道不刷新。这是一个需要解决的错误,而不是在浏览器中解决。
-
304 Not Modified不是错误。 -
不重新请求 JavaScript 文件并不重要。它们仍然会被加载。您是否正在收听正确的事件来重新初始化您的页面?
标签: javascript html caching browser-cache page-refresh