首页
学习
活动
专区
圈层
工具
发布

Web 应用能不能禁用浏览器 Back 按钮,History API、路由守卫与工程边界的完整分析

这里要区分四个经常被混用的动作。禁用Back按钮,指浏览器工具栏按钮变灰,点击后没有任何导航行为。普通Web页面做不到。检测后退,指页面获知当前历史条目发生了切换。popstate可以覆盖一部分场景。...导航被取消后,Router只能通过修复URL或反向遍历历史,把应用恢复到编辑页。popstate是讨论Back按钮时最容易被误解的事件。...实际发生的过程是,应用先向历史栈塞入一个额外条目,浏览器后退到前一个条目后,监听器又创建了新条目。页面不是阻止了后退,而是在后退之后制造了新的历史状态。这种方案不适合作为生产级导航控制。...浏览器已经开始执行历史遍历,Angular发现导航不允许后,会把路由状态修复回来。Angular的canceledNavigationResolution配置正是用来定义取消导航后如何恢复历史状态。...event.persisted)returnrefreshSessionState()})这段处理不是禁用Back,而是在历史恢复后修正认证状态、刷新过期数据或清理敏感界面。

12600

浏览器按下返回键时究竟发生了什么,彻底理解 backforward cache

今天在Chrome、Safari或Firefox里打开一个商品列表,滚动到很靠下的位置,点进商品详情,再按浏览器的返回按钮,页面经常会在几乎没有等待的情况下回到原来的滚动位置。...事件监听器通常仍与原来的对象关联,闭包仍可能引用原来的变量,滚动容器也可能恢复到离开前的位置。浏览器恢复的不是页面文件,而是此前那次页面执行所形成的运行世界。把一次完整导航拆开看,逻辑会更清楚。...更实际的处理往往是让恢复函数只触发少量数据重新验证,不重置整个Redux、Zustand或ReactContext状态。若恢复时直接清空所有状态,bfcache保留交互现场的价值就被应用层抵消了。...提交按钮点击后,代码把按钮设为禁用并把isSubmitting设为true,随后浏览器跳到结果页。用户按返回按钮时,页面瞬间回来,按钮仍然禁用,因为DOM和JavaScript状态正是离开前的状态。...bfcache恢复可以复用此前的大量结果,但恢复后仍可能因为视口变化、字体状态、动态数据更新或脚本操作产生新的布局与绘制。

18010
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Angular SSR 登录成功后点击浏览器 Back 按钮,正确行为应当怎样设计

    Angular官方文档对hydration的描述正是恢复服务端渲染应用、复用DOM和转移应用状态。它并不负责决定浏览器Back按钮应该走到哪一条历史记录。...点击Back后,浏览器先把历史游标移到/login。Angular收到这次浏览器导航后尝试激活登录路由,登录页Guard读取认证状态,发现当前会话已经登录,于是拒绝进入登录页并重定向到/home。...登录表单不应真正激活,也不应短暂暴露已经输入过的用户名,更不应该要求再次登录。Guard的作用不是阻止Back按钮这个硬件或浏览器动作,而是在Back已经选择/login之后,阻止登录路由被成功激活。...MDN对History的说明也指出,新标签页的一项历史长度通常为一,超出最早历史项继续后退不会产生效果。这才是登录成功后的主路径设计。登录是一个临时流程页,它的职责在认证完成后已经结束。...只做replaceUrl,直接输入/login时又可能看到不该出现的登录表单。两层同时存在,行为才稳定。回到SSR这一层,真正麻烦的不是Back按钮,而是认证状态在服务器和浏览器之间是否一致。

    15810

    Chrome DevTools 中 Test backforward cache 按钮到底测试了什么

    点击按钮后,Chrome会暂时离开当前页面,自动导航到chrome://terms/,随后再返回刚才的页面。Chrome官方文档明确描述了这一过程。...点击按钮前,当前网页处于正常活动状态。点击之后,DevTools要求Chrome导航到另一个文档,也就是chrome://terms/。...(ChromeforDevelopers)页面不符合条件时,Chrome会销毁或者放弃保存原来的Document。回退发生后,浏览器只能重新导航到原来的URL。...此时不能因为使用了浏览器Back按钮,就认定A从bfcache恢复。浏览器Back按钮只是历史导航的入口,是否涉及bfcache取决于历史条目之间是不是不同的Document。...若测试成功,恢复的是整个Angular应用运行环境。当按钮点击前停留在路由A,恢复后通常仍停留在路由A,原有Angular实例、服务对象、组件树和DOM状态可以一起恢复。

    13510

    JavaScript 高级程序设计(第 4 版)- BOM

    # 导航与打开新窗口 window.open()可以用于导航到指定URL,也可以用于打开新浏览器窗口 接收四个参数:要加载的URL、目标窗口、特性字符串和表示新窗口在浏览器历史记录中是否代替当前加载页面的布尔值...() 导航到新URL,并在浏览器历史记录中增加一条记录 给location.href或window.location设置一个URL,实际还是以同一个URL值调用assign()方法 常见的是设置location.href...,除了hash外,设置location的一个属性就会导致页面重新加载新URL 如果不希望增加历史记录,可以使用replace()方法,重定向后后退按钮是禁用状态 reload() 能重新加载的当前显示的页面...history.pushState():接收 3 个参数:一个 state 对象、一个新状态的标题和一个(可选的)相对 URL pushState()方法执行后,状态信息就会被推到历史记录中,浏览器地址栏也会改变以反映新的相对...为防止滥用,这个状态的对象大小是有限制的,通常在 500KB~ 1MB 以内 pushState()会创建新的历史记录,所以也会相应地启用“后退”按钮。

    2.9K10

    被忽略的缓存 -bfcache

    当用户在浏览器中执行后退或前进操作时,浏览器可以从 bfcache 中快速加载页面,而不是重新请求服务器并重新渲染页面。这意味着用户可以瞬间回到之前访问的页面,无需等待页面重新加载。...在触发 freeze 事件后,页面将被冻结,直到从 bfcache 中恢复页面,将不会触发任何事件。如果在此期间与页面的文档关联的任务或 Promise 准备就绪,则它们将在页面从缓存中恢复后执行。...当页面位于缓存中时,浏览器随时可以决定将页面从缓存中清除,在这种情况下,页面将被销毁,而不会触发任何通知。 当再次导航到页面时,将触发以下事件: resume:恢复事件,表示页面从冻结状态恢复。...从 bfcache 恢复页面:当用户执行后退或前进操作,导航回之前访问过的页面时,浏览器可以从 bfcache 中快速恢复保存的页面状态。...这意味着浏览器不需要重新请求页面的资源或重新渲染页面,而是直接加载保存在内存中的页面状态,从而实现快速导航和无缝的页面切换。

    3.3K30

    Redux助力美团点评前端进阶之路

    所有被试图更新的操作都靠刷新完整页面来进行。浏览器维护的history通过记录UI变化来维护不同状态的切换,最典型的使用场景就是浏览器提供的前进后退按钮。...曾经浏览器的前进后退功能都无效了,数据状态只能靠自己管理。 总结 应用中有多个数据源,维护多个数据源之间的一致性将变得非常困难。...中世纪:React(2003) 因此我将2005年之后的这段时期定义为“中世纪”,无尽的BUG,无尽的黑暗。 到2013年出现了转机,Facebook开源了React。 ?...React和Redux结合使用有一点需要注意的是,Redux启用了一个中间件的机制,中间件可以拦截全局触发的action,并根据自己拦截的action按需进行修改或再次触发其它action。...全承载模式是完全使用duxjs应用内的数据和视图进行封装和管理。 duxjs现状 duxjs在美团点评中还处于内测阶段,我们会根据实际使用的情况去调整API设计。 内测完毕后将进行开源。

    1.9K40

    从 URL B 点击浏览器回退按钮后,Angular 应用究竟会发生什么

    不过,页面A再次显示出来时,到底是原来的组件实例被恢复,还是Angular创建了一个新的组件实例,需要根据当初从A到B的导航方式来判断。...页面A导航到页面B后,页面A组件通常被销毁。点击浏览器回退按钮后,Angular创建新的页面A组件,ngOnInit再执行一次。...Angular提供canceledNavigationResolution配置,用来决定由浏览器回退或前进触发的导航被取消后,怎样恢复历史记录位置。...所以,在最普通的AngularRouter场景里,点击浏览器回退按钮后会回到URLA,Angular会把它当作一场由popstate引发的新导航来处理,而不是简单复活之前的组件。...页面A中只存在于组件内存里的数据可能已经重置,但之前成功写入、没有被覆盖或删除、仍属于同一Origin的localStorage数据依然存在,页面A可以在重新初始化时读取它并恢复业务状态。

    10800

    你能用 JavaScript 访问历史记录吗?

    使用JavaScript通过window.history对象来访问和操作浏览器的历史记录。window.history对象提供了一些方法和属性,跟踪浏览历史、导航到不同的页面以及对历史记录进行修改。...console.log(history.length); 2:history.back():将浏览器导航到上一个页面,等效于用户点击浏览器的后退按钮。...history.back(); 3:history.forward():将浏览器导航到下一个页面,等效于用户点击浏览器的前进按钮。...history.forward(); 4:history.go(n):将浏览器导航到相对于当前页面的特定位置,其中n表示相对于当前页面的偏移量。正值表示前进,负值表示后退。...history.replaceState({ page: "about" }, "About", "/about"); 通过使用这些方法和属性,读取历史记录的长度、在历史记录中导航、添加新的历史状态或替换当前状态

    1.7K50

    『React Navigation 3x系列教程』createMaterialTopTabNavigator开发指南

    如果是true,Tab 页只会在被选中或滑动到该页时被渲染。...paths: 提供routeName到path config的映射,它覆盖routeConfigs中设置的路径。 backBehavior: 后退按钮是否会导致标签切换到初始tab?...tabBarAccessibilityLabel:选项卡按钮的辅助功能标签。...如果您没有选项卡的标签,建议设置此项; tabBarTestID:用于在测试中找到该选项卡按钮的 ID; 【案例1】使用createMaterialTopTabNavigator做界面导航、配置navigationOptions...:createMaterialTopTabNavigator被包裹后在TabNavigator中的页面是无法借助navigation跳转到外层StackNavigator中的页面的,这种应用场景很多,尤其是你需要定制

    16.8K20

    react-router 的使用与优化

    ,并不会触发 popstate 事件,当点击浏览器的前进或者后退按钮时才会触发该事件。...前进或后退按钮 打印出的事件对象,其中也就包含我们向 pushState 中传入的 data(state) 和 title 参数: ?...window.location.replace("/") 表示重定向到某个页面,重定向相当于代替之前的路由,之前的那个路由不能后退回来。...StaticRouter 302 状态码是临时跳转的意思。当在浏览器上渲染一个 组件时,浏览器历史记录会改变状态,同时将屏幕更新。...在静态的服务器环境中,无法直接更改应用程序的状态。在这种情况下,可以在 context 特性中标记要渲染的结果。如果出现了 context.url,就说明应用程序需要重定向。

    4.7K10

    前端开发者的 Kotlin 之旅:ViewModel 状态管理入门

    这些问题让我想起了前端开发中从组件内状态(useState)到状态管理库(Redux、Pinia)的演进。...的状态管理方案:remember - Composable 内局部状态rememberSaveable - 可恢复的状态ViewModel - 跨 Composable 的业务逻辑容器StateFlow...按钮,观察两者的差异体验 ViewModel 的状态保持能力Tab 2:ViewModel 计数器一个完整的计数器示例展示 ViewModel 的基本用法观察状态更新的响应式特性Tab 3:ViewModel...的核心价值 - 状态在 UI 重组时保持。...,我从前端开发者的视角深入理解了 ViewModel:核心知识点ViewModel 是状态容器,类似 Redux Store 或 Pinia Store生命周期比 Composable 更长,状态在重组和配置变化时保持关注点分离

    28810

    AngularDart 4.0 高级-路由概述 顶

    本指南涵盖路由器的主要功能,通过演示可以实时运行的小应用程序(查看源代码)演示它们。 概观 浏览器是一种熟悉的应用程序导航模型: 在地址栏中输入一个URL,然后浏览器导航到相应的页面。...点击页面上的链接,浏览器导航到新页面。 点击浏览器的后退和前进按钮,浏览器会前后浏览您浏览过的网页的历史记录。 Angular路由器借鉴了这种模式。...当用户点击按钮,从下拉框中选择,或者响应来自任何来源的其他刺激时,您都可以进行命令式导航。并且路由器在浏览器的历史记录中记录活动,所以后退和前进按钮也起作用。...点击“返回”按钮,应用程序返回英雄列表,显示更改的英雄名称。 注意名称更改立即生效。 如果您点击了浏览器的后退按钮而不是“返回”按钮,该应用程序也会将您返回到英雄列表。...点击浏览器后退按钮或“英雄”链接。 向上弹出一个对话框。 ? 您可以选择“OK”并丢失您的更改,或单击“Cancel”并继续编辑。 这种行为的后面是路由的routerCanDeactivate挂钩。

    10.2K20

    如何制作自己的原生 JavaScript 路由

    太糟糕了,因为单击浏览器的“后退”和“前进”按钮与浏览历史记录中的 URL 导航有关。如果没有 History API,就无法谈论路由。...go() 与 .back() 和 forward() 方法相似,不同之处在于你可以指定浏览器历史记录栈中要前进或后退的步数。。 pushState() 会将新状态推送到 History API。...它们应与你要导航到的实际页面一致。当然这不是存储页面名称的唯一方法,例如可以用 array [] 或其他任何方式。这就是本例中的操作方式。 当然我们还需要从服务器加载有关该位置的布局和资源的内容。...这取决于你的程序。可以是任何东西。 使“后退”和“前进”按钮起作用 通过使用 history.pushState,你将自动使 Back 和 Forward 按钮导航到上一个或下一个状态。...假定每次你导航到出现在路由按钮上的 URL 时,实际上都会从服务器单独加载该 URL。 因此你有责任确保/page/about 将路由器和页面的加载到应用程序的根视图中。

    6.6K20

    『React Navigation 3x系列教程』之createStackNavigator开发指南

    headerBackTitleVisible : 提供合理的默认值以确定后退按钮标题是否可见,但如果要覆盖它,则可以使用true或` false 在此选项中。...: 定义在iOS上当前页面进入到下一页面的回退标题,可以通过设置null来禁用它; headerTruncatedBackTitle: 当回退标题不能显示的时候显示此属性的标题,比如回退标题太长了; headerBackImage...:React 元素或组件在标题的后退按钮中显示自定义图片。...垂直状态默认135; gestureDirection: 设置关闭手势的方向。...当用户单击Go Back按钮时,通过: navigation.goBack(); 实现了返回上一页; 类似上述的应用场景有很多,大家可以通过与本教程配套的最新版React Native+Redux打造高质量上线

    8.4K10

    React 步骤条组件 Stepper 深入解析与常见问题

    在构建复杂的多步骤表单或流程时,步骤条(Stepper)组件是一个非常有用的工具。它可以帮助用户了解当前进度,并且可以轻松地在不同的步骤之间导航。...一个典型的步骤条组件应该包含以下几个部分:步骤指示器:显示每个步骤的编号或图标。步骤标题:每个步骤的简短描述。导航按钮:允许用户前进或后退到其他步骤。步骤内容:每个步骤的具体内容区域。...常见的错误包括:未正确更新状态:确保在点击“Next”或“Back”按钮时,正确更新 currentStep 状态。状态逻辑复杂化:避免在状态管理中加入过多的逻辑,这会使代码难以维护。...可以使用 CSS Modules 或其他样式隔离方案。响应式设计:考虑到不同屏幕尺寸下的显示效果,确保步骤条组件在各种设备上都能正常工作。...如何避免常见问题3.1 使用状态管理库对于复杂的步骤条组件,可以考虑使用状态管理库(如 Redux 或 MobX)来管理状态。这样可以更好地组织和管理组件的状态,减少逻辑错误的可能性。

    2.3K10

    『React Navigation 3x系列教程』createBottomTabNavigator开发指南

    paths: 提供routeName到path config的映射,它覆盖routeConfigs中设置的路径。 backBehavior: 后退按钮是否会导致标签切换到初始tab?...tabBarOptions(tab配置) activeTintColor: 设置TabBar选中状态下的标签和图标的颜色; inactiveTintColor: 设置TabBar非选中状态下的标签和图标的颜色...tabBarVisible: 显示或隐藏TabBar,默认显示; tabBarIcon: 设置TabBar的图标; tabBarLabel: 设置TabBar的标签; tabBarOnPress: Tab...如果您没有选项卡的标签,建议设置此项; tabBarTestID:用于在测试中找到该选项卡按钮的 ID; 提示:和本文配套的还有一个React Navigation3x的视频教程,欢迎学习。...:createBottomTabNavigator被包裹后在TabNavigator中的页面是无法借助navigation跳转到外层StackNavigator中的页面的,这种应用场景很多,尤其是你需要定制

    10.6K30

    【JavaScript 教程】浏览器—History 对象

    window.history.length // 3 由于安全原因,浏览器不允许脚本读取这些地址,但是允许在地址之间导航。...// 后退到前一个网址 history.back() // 等同于 history.go(-1) 浏览器工具栏的“前进”和“后退”按钮,其实就是对 History 对象进行操作。...History.back():移动到上一个网址,等同于点击浏览器的后退键。对于第一个访问的网址,该方法无效果。 History.forward():移动到下一个网址,等同于点击浏览器的前进键。...history.go(0); // 刷新当前页面 注意,移动到以前访问过的页面时,页面通常是从浏览器缓存之中加载,而不是重新要求服务器发送新的网页。...注意,仅仅调用pushState()方法或replaceState()方法 ,并不会触发该事件,只有用户点击浏览器倒退按钮和前进按钮,或者使用 JavaScript 调用History.back()、History.forward

    1.7K10

    Human Interface Guidelines —— 导航栏(Navigation Bars)

    Navigation Bars 位置 Navigation Bars显示在app屏幕的顶部,位于status bar(状态栏)下方,并可穿过一系列不同层级的屏幕进行导航。 ...有时,navigation bars的右侧包含一个control,如Edit或Done按钮,用于管理活动视图中的内容。 ...暂时隐藏navigation bar以提供更加身临其境的体验。 照片在查看全屏照片时会隐藏navigation bar和其他界面元素。 如果你实现这类行为,让用户用简单的手势恢复导航栏,如点击。...如果在navigation bar中使用segmented control,则该栏不应包含标题或segmented control以外的任何控件。 ·使用标准的后退按钮。...人们知道标准的后退按钮可以让他们通过层级的信息返回。但是,如果您实现了自定义后退按钮,请确保它仍然看起来像后退按钮,直观,与剩下的页面交互方式保持匹配,并始终贯穿于您的应用程序中。

    4.3K110
    领券