JavaScript返回到上一页的三种方法

JavaScript 返回到上一页的三种常用方法

在网页开发中,实现“返回上一页”功能非常常见。JavaScript 提供了多种方式来实现,下面详细介绍三种最常用且可靠的方法,并附带优缺点对比和使用场景。

方法一:history.back()(最常用,推荐)
// 直接返回上一页,等同于点击浏览器“后退”按钮 history.back();// 或者 history.go(-1);

说明

  • history.back()history.go(-1) 效果完全相同。
  • 会触发浏览器的历史记录后退,页面状态(如表单填写、滚动位置)通常能保持(取决于浏览器实现)。

示例(按钮点击返回):

<buttononclick="history.back()">返回上一页</button>

优点

  • 简单、直观。
  • 用户体验最好,模拟真实后退行为。
  • 支持页面状态恢复。

缺点

  • 如果当前页是历史记录的第一页,会无效(不会跳转)。
方法二:history.go(-1)(等同于 back)
history.go(-1);// 后退一步// history.go(-2); // 后退两步// history.go(1); // 前进一步

说明

  • history.go(n) 中的 n 是整数,正数前进,负数后退。
  • history.back() 完全等价,只是写法不同。

使用场景

  • 需要动态控制后退步数时更灵活。
方法三:window.location.href = document.referrer(根据来源页跳转)
if(document.referrer){ window.location.href = document.referrer;}else{// 如果没有来源页(比如直接打开),跳转到指定页面 window.location.href ='/index.html';}

说明

  • document.referrer 返回引发当前页面跳转的上一个页面的 URL(字符串)。
  • 直接设置 location.href 实现跳转。

完整安全示例

<buttononclick="goBack()">返回上一页</button><script>functiongoBack(){if(document.referrer && document.referrer !== window.location.href){ window.location.href = document.referrer;}else{// 备选方案:跳转到首页或指定页面 window.location.href ='/';}}</script>

优点

  • 可以明确知道要跳转到哪个页面。
  • 在某些单页应用(SPA)中更可控。

缺点

  • 如果用户是通过直接输入 URL、书签或搜索引擎进入当前页,document.referrer 会为空。
  • 不会保留浏览器历史栈的“后退”状态(属于新跳转)。
  • 跨域时 referrer 可能被屏蔽(受 Referrer-Policy 影响)。
三种方法对比总结
方法代码是否模拟浏览器后退referrer 是否为空时行为是否保留页面状态推荐度
history.back() / go(-1)history.back()无效(停留在当前页)通常保留★★★★★
history.go(-1)history.go(-1)无效通常保留★★★★★
document.referrerlocation.href = referrer否(新跳转)需要手动处理备选页面不保留★★★
最佳实践建议
  1. 移动端或单页应用(Vue/React) 中常用 history.back(),配合路由守卫更优雅。

需要兼容无来源页的情况,结合 referrer:

functiongoBack(){if(history.length >1){ history.back();}else{ window.location.href ='/';// 跳转到首页}}

大多数场景优先使用history.back()

<buttononclick="history.back()">返回</button>

总结:99% 的情况下,直接使用 history.back() 就是最佳选择,简单可靠,用户体验最好。

Read more

Flutter 组件 sse_stream 的适配 鸿蒙Harmony 实战 - 驾驭轻量级服务器发送事件流、实现鸿蒙端长连接实时通讯与断线重连方案

Flutter 组件 sse_stream 的适配 鸿蒙Harmony 实战 - 驾驭轻量级服务器发送事件流、实现鸿蒙端长连接实时通讯与断线重连方案

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 组件 sse_stream 的适配 鸿蒙Harmony 实战 - 驾驭轻量级服务器发送事件流、实现鸿蒙端长连接实时通讯与断线重连方案 前言 在鸿蒙(OpenHarmony)生态的金融实时行情、在线社交协作以及物联网告警应用中,如何实现“数据从服务器到终端的实时推送”是一个核心命题。面对不需要双向通信(WebSocket 太重)且对功耗极其敏感的移动端场景,基于 HTTP 协议的轻量化长连接方案——SSE(Server-Sent Events)成为了事实上的行业标准。 然而,处理不稳定的移动网络波动、处理分块传输(Chunked Encoding)中的字节截断、以及在鸿蒙端实现优雅的断线重连逻辑,依然是开发者面临的技术瓶颈。 sse_stream 是一套专为解析该协议设计的高性能响应流解析引擎。它能将原始的二进制流瞬间转化为语义化的 Event 对象。适配到鸿蒙平台后,它不仅能支撑起一个毫秒级延迟的行情大盘,

By Ne0inhk
鸿蒙金融理财全栈项目——上线与运维、用户反馈、持续迭代优化

鸿蒙金融理财全栈项目——上线与运维、用户反馈、持续迭代优化

《鸿蒙APP开发从入门到精通》第25篇:鸿蒙金融理财全栈项目——上线与运维、用户反馈、持续迭代优化 🚀📱🔧 内容承接与核心价值 这是《鸿蒙APP开发从入门到精通》的第25篇——上线与运维、用户反馈、持续迭代优化篇,100%承接第24篇的生态合作、用户运营优化、数据产品变现优化架构,并基于金融场景的上线与运维、用户反馈、持续迭代优化要求,设计并实现鸿蒙金融理财全栈项目的上线与运维、用户反馈、持续迭代优化功能。 学习目标: * 掌握鸿蒙金融理财项目的上线与运维优化设计与实现; * 实现应用上线优化、应用运维优化、应用监控优化; * 理解用户反馈在金融场景的核心优化设计与实现; * 实现用户反馈收集优化、用户反馈分析优化、用户反馈处理优化; * 掌握持续迭代优化在金融场景的设计与实现; * 实现持续集成优化、持续部署优化、持续交付优化; * 优化金融理财项目的用户体验(上线与运维、用户反馈、持续迭代优化)。 学习重点: * 鸿蒙金融理财项目的上线与运维优化设计原则; * 用户反馈在金融场景的优化应用; * 持续迭代优化在金融场景的设计要点。 一、

By Ne0inhk
【Linux】线程同步与互斥深度解析:从锁机制到生产者消费者模型

【Linux】线程同步与互斥深度解析:从锁机制到生产者消费者模型

目录 一、引言:多线程共享资源的问题     1.1 为什么需要同步与互斥?     1.2 核心概念铺垫 二、线程互斥:用互斥量(mutex)守护临界资源     2.1 互斥的核心:临界资源与临界区     2.2 互斥量接口与实战     2.3 RAII风格锁封装:避免锁泄漏 三、线程同步:条件变量(cond)实现有序协作     3.1 同步的意义:解决“竞态条件”     3.2 条件变量接口与核心原理     3.3 条件变量使用规范:避免伪唤醒     3.4 条件变量封装:与互斥量解耦 四、生产者消费者模型:同步互斥的经典实战

By Ne0inhk
OpenClaw(MACOS 安装部署)

OpenClaw(MACOS 安装部署)

一、介绍: 开源免费 · 清理收件箱、发送邮件、管理日历、办理登机手续。通过飞书、WhatsApp、Telegram 或任何你常用的聊天应用。 Mac、Windows 或 Linux。Anthropic、OpenAI 或本地模型。默认私有——你的数据属于你自己。 通过飞书、WhatsApp、Telegram、Discord、Slack 或 iMessage 与它对话。支持私聊和群聊。 记住你的一切并成为独一无二的你的 AI。你的偏好、你的上下文、你的 AI。 它可以浏览网页、填写表单、从任何网站提取数据。 读写文件、运行 Shell 命令、执行脚本。完全访问或沙箱模式——由你选择。 使用社区技能扩展或自己构建。它甚至可以自己编写技能。 二、安装 OpenClaw:

By Ne0inhk