window.location.reload();上传成功自动刷新页面

本文介绍了一种在上传文件后自动刷新页面的方法,通过在上传成功的回调中使用`window.location.reload();`代码实现了即时更新页面显示的效果。

遇到的问题:导入的表格,上传成功后只弹窗显示‘上传成功’,但不显示数据,只有手动刷新,才显示导入的数据

解决思路:因导入功能没有问题,便想着加个自动刷新的功能

实施:不擅长写前端,便在网上找自动刷新的代码,但看到的多半是隔几秒刷新,或者是什么表单刷新,并不是我想要的在上传之后再刷新,但功夫不负有心人,终于:

window.location.reload();

 这行代码写在上传的回调中,便可实现上传成功后对当前页面进行自动刷新,具体代码:

layui.use('upload', function(){
        var upload = layui.upload;
      //执行上传
        var uploadInst = upload.render({
            elem: '#upload' //绑定元素
            ,url: prefix + "/importAdmin" //上传接口
            ,method: 'POST'
            ,accept: 'file'
            ,before: function(obj){
                layer.load();
            }
            ,done: function(res){//上传完毕回调
                layer.closeAll('loading');
                layer.msg('上传成功');
                window.location.reload();

            }
            ,error: function(){//请求异常回调
                layer.closeAll('loading');
                layer.msg('网络异常,请稍后重试!');
            }
        });
	})

 其实只是个简单的自动刷新的实现,但是我认为值得记录

<think>我们被要求使用JavaScript验证window.location.reload清除缓存是否成功。根据引用内容,我们知道: - `window.location.reload(true)` 会强制刷新,忽略缓存,从服务器重新加载。 - `window.location.reload(false)` 或 `window.location.reload()` 会优先使用缓存。 要验证清除缓存是否成功,我们需要比较强制刷新和普通刷新时资源的加载情况。我们可以通过检查资源加载时间戳或版本号来验证。 方法: 1. 在资源(如图片、脚本)的URL后面添加时间戳或版本号,这样可以避免缓存。但我们这里要验证的是清除缓存,所以不能直接修改资源URL。 2. 另一种方法是利用HTTP头信息,但JavaScript出于安全原因通常无法读取完整的HTTP头(除非通过AJAX请求同源资源,且服务器暴露了相关头信息)。 3. 更实用的方法是:在页面加载时记录资源的加载时间(或记录资源的最后修改时间),然后执行强制刷新,再次记录同一资源的加载时间。如果强制刷新后时间戳更新,说明缓存被清除。 然而,由于我们无法直接通过JavaScript获取资源的完整缓存信息,我们可以采用以下思路: - 在页面中嵌入一个测试资源(比如一个图片),该资源设置了较长的缓存时间(例如通过Cache-Control或Expires)。 - 第一次加载页面时,该图片会被缓存。 - 然后我们使用`window.location.reload(true)`强制刷新,再使用`window.location.reload(false)`普通刷新,观察图片的加载情况。 但是,如何通过JavaScript验证图片是否从缓存加载?我们可以利用`performance` API来获取资源加载的时间。 具体步骤: 1.页面中放置一个测试图片,并确保该图片在服务器端设置了缓存(例如,通过设置HTTP头Cache-Control: max-age=3600)。 2. 使用`performance.getEntriesByName(url)`获取该资源的加载性能记录,其中`url`是图片的URL。 3. 观察该资源的`transferSize`属性(传输大小)。如果`transferSize`为0,则表示资源是从缓存加载的;如果大于0,则表示是从服务器重新加载的。 注意:`performance.getEntriesByName`返回一个数组,包含指定URL的性能条目。每个条目是一个对象,其中`transferSize`表示传输大小(以字节为单位)。如果资源从缓存加载,则`transferSize`通常为0(或者在某些浏览器中可能未定义,但我们可以用`encodedBodySize`和`decodedBodySize`等属性辅助判断)。 因此,我们可以设计如下实验: 步骤1:首次加载页面,记录测试图片的传输大小(此时应该大于0,因为是从服务器加载)。 步骤2:使用普通刷新(`reload(false)`),再次记录同一图片的传输大小(此时应该为0,因为从缓存加载)。 步骤3:使用强制刷新(`reload(true)`),再次记录同一图片的传输大小(此时应该大于0,因为强制刷新忽略缓存,重新从服务器加载)。 这样,通过比较传输大小,我们就可以验证清除缓存是否成功。 代码示例: ```html <!DOCTYPE html> <html> <head> <title>缓存验证测试</title> <script> // 测试图片的URL,确保该图片在服务器上设置了缓存 const testImageUrl = 'test.jpg'; function checkResourceLoad() { const entries = performance.getEntriesByName(testImageUrl); if (entries.length > 0) { const entry = entries[0]; // 输出传输大小 console.log(`资源传输大小: ${entry.transferSize} 字节`); // 在页面上显示结果 document.getElementById('result').innerHTML += `<p>资源传输大小: ${entry.transferSize} 字节</p>`; } } function normalReload() { // 先检查一次 checkResourceLoad(); // 然后普通刷新 window.location.reload(false); } function forceReload() { // 先检查一次 checkResourceLoad(); // 然后强制刷新 window.location.reload(true); } // 页面加载完成后执行 window.onload = function() { // 首次加载,添加测试图片 const img = new Image(); img.src = testImageUrl; document.body.appendChild(img); // 等待图片加载后检查(注意:可能需要在图片加载完成后再检查) img.onload = function() { console.log('图片加载完成'); checkResourceLoad(); }; }; </script> </head> <body> <h1>缓存验证测试</h1> <button onclick="normalReload()">普通刷新</button> <button onclick="forceReload()">强制刷新</button> <div id="result"></div> </body> </html> ``` 注意:由于`performance.getEntriesByName`只能获取到当前页面已经加载的资源,因此在刷新前需要先记录,刷新后重新记录。但是刷新后页面会重新加载,之前的脚本状态会丢失。因此,我们需要在刷新前将结果存储在可以持久化的地方(如localStorage或sessionStorage),然后在刷新后取出进行对比。 改进方案: 1. 在刷新前,将当前的资源传输大小存储在`sessionStorage`中(因为刷新后sessionStorage还在)。 2. 刷新后,从`sessionStorage`中取出之前的值,并与刷新后的值进行比较。 修改后的代码: ```html <!DOCTYPE html> <html> <head> <title>缓存验证测试</title> <script> // 测试图片的URL const testImageUrl = 'test.jpg'; function checkResourceLoad(step) { const entries = performance.getEntriesByName(testImageUrl); if (entries.length > 0) { const entry = entries[0]; console.log(`步骤${step}: 资源传输大小: ${entry.transferSize} 字节`); // 将当前步骤的传输大小存入sessionStorage sessionStorage.setItem(`step${step}`, entry.transferSize); // 在页面上显示结果 document.getElementById('result').innerHTML += `<p>步骤${step}: 资源传输大小: ${entry.transferSize} 字节</p>`; } } function normalReload() { // 检查并记录步骤1(普通刷新前) checkResourceLoad(1); // 设置一个标记,表示接下来是普通刷新后的检查 sessionStorage.setItem('reloadType', 'normal'); // 普通刷新 window.location.reload(false); } function forceReload() { // 检查并记录步骤1(强制刷新前) checkResourceLoad(1); sessionStorage.setItem('reloadType', 'force'); // 强制刷新 window.location.reload(true); } window.onload = function() { // 添加测试图片 const img = new Image(); img.src = testImageUrl; document.body.appendChild(img); // 检查是否是在刷新后 const reloadType = sessionStorage.getItem('reloadType'); if (reloadType) { // 刷新后的检查(步骤2) img.onload = function() { checkResourceLoad(2); // 比较步骤1和步骤2 const step1 = sessionStorage.getItem('step1'); const step2 = sessionStorage.getItem('step2'); if (step1 !== null && step2 !== null) { const diff = parseInt(step2) - parseInt(step1); console.log(`两次传输大小的差值: ${diff}`); if (reloadType === 'normal') { // 普通刷新:期望step2为0(缓存),所以step1(首次)大于0,step2为0,差值为负 if (parseInt(step2) === 0) { console.log('普通刷新:资源从缓存加载'); document.getElementById('result').innerHTML += `<p>普通刷新:资源从缓存加载(传输大小减少)</p>`; } else { console.log('普通刷新:资源重新从服务器加载'); } } else if (reloadType === 'force') { // 强制刷新:期望step2大于0(重新加载),所以两次都大于0,但可能相同也可能不同(取决于资源是否改变) if (parseInt(step2) > 0) { console.log('强制刷新:资源重新从服务器加载'); document.getElementById('result').innerHTML += `<p>强制刷新:资源重新从服务器加载</p>`; } } } // 清除标记,避免下次进入时重复检测 sessionStorage.removeItem('reloadType'); sessionStorage.removeItem('step1'); sessionStorage.removeItem('step2'); }; } else { // 首次加载 img.onload = function() { console.log('首次加载图片'); // 首次加载不需要记录步骤,因为刷新前会记录 }; } }; </script> </head> <body> <h1>缓存验证测试</h1> <button onclick="normalReload()">普通刷新</button> <button onclick="forceReload()">强制刷新</button> <div id="result"></div> </body> </html> ``` 注意:这个示例中,我们假设测试图片`test.jpg`在服务器上并且设置了缓存。在实际测试时,需要确保服务器配置了正确的缓存头。 另外,`performance.getEntriesByName`可能无法获取到跨域资源的详细信息(除非资源允许CORS)。因此,测试图片最好是同源的,或者服务器设置了适当的CORS头。 通过以上方法,我们可以验证`window.location.reload(true)`是否成功清除了缓存(即强制从服务器重新加载资源)。 §§相关问题§§ 1. 如何通过JavaScript检测资源是否从浏览器缓存加载? 2. 除了使用`performance` API,还有哪些方法可以验证缓存是否被清除? 3. 在哪些场景下使用`window.location.reload(true)`比普通刷新更有优势? </think> ### JavaScript 验证 `window.location.reload` 清除缓存的方法 要验证 `window.location.reload(true)` 是否成功清除了缓存,可以通过以下两种方法实现: #### 方法 1:使用时间戳验证资源更新 ```javascript // 1. 首次加载时记录资源时间戳 const initialTimestamp = Date.now(); // 2. 执行强制刷新 function forceReload() { window.location.reload(true); } // 3. 刷新后验证 window.onload = function() { const newTimestamp = Date.now(); const timeDiff = newTimestamp - initialTimestamp; if (timeDiff < 10) { console.log("⚠️ 可能未清除缓存(加载时间过短)"); } else { console.log("✅ 强制刷新成功,缓存已清除"); } }; ``` **原理**:强制刷新会重新请求所有资源,加载时间明显长于缓存加载。时间差过小(如 <10ms)说明可能使用了缓存[^1][^2]。 #### 方法 2:检测资源版本号变化 ```html <!-- 在HTML中添加版本标识 --> <meta name="version" content="1.0"> <script> // 强制刷新前存储版本号 localStorage.setItem('prevVersion', document.querySelector('meta[name="version"]').content); // 执行强制刷新 window.location.reload(true); // 刷新后检测 window.onload = function() { const currentVersion = document.querySelector('meta[name="version"]').content; const prevVersion = localStorage.getItem('prevVersion'); if (currentVersion === prevVersion) { console.log("❌ 缓存未清除(版本号未更新)"); } else { console.log("✅ 缓存已清除"); } }; ``` **原理**:每次部署更新版本号,强制刷新后应获取新版本号,相同则说明缓存未清除[^3]。 #### 验证要点: 1. **强制刷新参数**:必须使用 `window.location.reload(true)` 或 `Ctrl+F5`(Windows)/ `Cmd+Shift+R`(Mac) 2. **缓存特征**: - 普通刷新(`reload(false)`)可能返回 `HTTP 304`(未修改) - 强制刷新始终返回 `HTTP 200`(重新加载)[^2] 3. **开发者工具验证**: - 在 **Network 标签**勾选 `Disable cache` - 观察资源加载的 `Size` 列: - `(memory cache)` 表示缓存 - 具体文件大小表示重新加载 > **注意**:部分浏览器可能忽略强制刷新参数,建议结合浏览器开发者工具确认。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值