能否排除指定脚本在location.reload()手动重载时的执行?
如何在
location.reload()重载时排除指定脚本执行 这个问题问得很到位——因为location.reload()本质上就是让浏览器重新请求并渲染整个页面,默认情况下所有脚本都会重新执行,所以得靠状态标记来区分「正常加载」和「手动重载」这两种场景。下面给你两种实用的解决方案:
方案1:用sessionStorage做临时标记(推荐)
sessionStorage是会话级的存储,页面关闭后就会自动清除,非常适合用来存这种一次性的状态标记。
步骤1:在调用reload()前设置标记
在你手动触发location.reload()的代码里,先给sessionStorage加一个标记:
// 标记当前是手动重载,需要跳过指定脚本 sessionStorage.setItem('skipTargetScript', 'true'); // 执行重载 location.reload();
步骤2:在目标脚本中检查标记
在你想要排除的脚本开头,先检查这个标记——如果是重载触发的加载,就跳过核心代码,同时记得清除标记(避免影响下一次正常加载):
// 检查是否是重载触发的加载 if (sessionStorage.getItem('skipTargetScript') !== 'true') { // 这里放你原本要执行的脚本逻辑 console.log('脚本正常执行(非重载场景)'); } else { // 清除标记,确保下次正常加载时脚本能运行 sessionStorage.removeItem('skipTargetScript'); }
方案2:动态加载脚本(适合外部引入的脚本)
如果你的目标脚本是通过<script>标签引入的外部文件,可以改成动态创建脚本标签的方式,根据标记决定是否加载:
<script> // 先检查标记 if (sessionStorage.getItem('skipTargetScript') !== 'true') { // 正常加载场景:动态创建脚本标签并引入 const targetScript = document.createElement('script'); targetScript.src = '/path/to/your-target-script.js'; targetScript.async = false; // 保持原本的加载顺序,按需调整 document.body.appendChild(targetScript); } else { // 重载场景:清除标记 sessionStorage.removeItem('skipTargetScript'); } </script>
注意事项
- 标记一定要在
location.reload()之前设置,不然重载后页面重新初始化,标记就来不及生效了。 - 如果用
location.reload(true)强制从服务器拉取资源,这个方案依然有效——sessionStorage不会因为强制刷新而丢失(除非浏览器有特殊设置)。 - 如果你有多个触发重载的地方,记得每个地方都要加上设置标记的代码。
内容的提问来源于stack exchange,提问作者JoSch




