当前位置: 首页 > 面试题库 >

创建JavaScript小部件时如何管理浏览器的“后退”和“前进”按钮

万俟旭
2023-03-14
问题内容

我创建了一个Javascript小部件,允许用户在外部网站上嵌入日历。现在,我不以任何方式处理浏览器的后退/前进按钮,这意味着如果他们单击某个事件,该事件将通过ajax加载,但是如果他们单击“后退”,它们将被带到上一个网站。

我看到了两个解决方案:
1)在javascript对象中跟踪历史记录,然后尝试检测“后退”和“前进”点击
2)在url哈希中跟踪当前状态。(喜欢www.xxx.com/events#timely=my-fantastic-event

解决方案编号2还允许添加事件书签,尽管我认为这样做仍然很慢,因为它首先需要加载页面,然后加载事件(我的意思是,首先加载www.xxx.com/events,然后它检测到哈希并加载事件)

如此真实的场景。我在网站上有活动www.fantastic-events.com。我使用javcascript小部件将日历嵌入到w上ww.event- listings.com/events。当用户单击事件的详细信息时,我可能会推送我想要的状态( www.event- listings.com/event/my-fantastic- event),并使用History.js来捕获状态更改并加载正确的事件,但这将创建一个以后无法使用的url。我的意思是,如果www.event- listings.com/event/my-fantastic-event以后用户添加书签
并对其进行访问,它将无法正常工作,因为无法加载我的JavaScript小部件。

有什么建议/考虑吗?


问题答案:

有两种主要方法可用来实现您所追求的目标。
其中之一是您提到的哈希方法。如果您需要支持较旧的浏览器(IE <=
9),这就是方法。如果您决定使用此方法,那么您的朋友就是hashchangeevent。哈希模式依靠此事件来触发功能。以最幼稚的方式,它看起来像:

window.addEventListener('hashchange', function (e) {
    var hash = window.location.hash;
    if (hash === 'event-1') {
        // ...
    }
    else if (...) {
        // ...
    }
});

您的另一种选择是使用History API(特别是-
pushState方法)和popstateevent。应该注意的是,该pushState方法不会创建HTTP请求。同样,如果用户更改当前历史记录条目(使用后退/前进按钮),浏览器将不会重新加载,而是触发一个popstate您可以收听的事件。如果用户导航到不是使用pushState或创建的历史记录条目,则replaceState浏览器将按预期加载资源(不会损害用户的体验-
如果她想退出网站,则可以成功)。

请注意,使用该hashchange方法可能会与使用该方法的其他库发生冲突,并且由于大多数流行的框架(琥珀色,有角度的等等)出于浏览器兼容性原因而使用该方法,因此存在一定的风险。

对于“不存在的页面”问题,您可能会想到的解决方案是针对您的状态而不是不存在的URL使用查询参数:

window.history.pushState({ event: 'event-id' }, "Event Title", "?event=event-id");

然后,您可以在页面加载时解析查询参数,并使用它们的值以将组件初始化为所需的状态。

您可以看一下这篇不错的MDN文章,以获取更好的参考。



 类似资料:
  • 问题内容: 您如何确定用户是否按下浏览器中的“后退”按钮? 您如何使用系统在单页Web应用程序内强制使用页内后退按钮? 到底为什么浏览器后退按钮不触发自己的事件!? 问题答案: (注意:根据Sharky的反馈,我提供了用于检测退格的代码) 因此,我经常在SO上看到这些问题,并且最近遇到了我自己控制后退按钮功能的问题。在为我的应用程序寻找最佳解决方案(带哈希导航的单页)几天后,我提出了一个简单的,跨

  • 问题内容: 如何禁用浏览器的“后退”按钮(跨浏览器)? 问题答案: 这个问题是非常相似,这一个 … 您需要强制缓存过期才能正常工作。将以下代码放在页面代码后面。

  • 问题内容: 我在www.darknovagames.com上运行了基于浏览器的游戏。最近,我一直在努力使用CSS重新格式化该网站,试图让其所有页面都根据HTML标准进行验证。 我一直在想着要在页面左侧放置AJAX导航菜单的想法(而不是每次都将用户带到一个单独的页面,而是需要重新加载标题和导航栏,而这几乎是不会改变的),我知道如果这样做,我可能会破坏浏览器中的“前进/后退”按钮。我的问题是,我应该继

  • 问题内容: 当用户登录时,将存储会话信息。当用户注销时,会话信息将被删除。但是当我点击浏览器的后退按钮时,会显示用户信息。由于会话已消失,但我们无法确定是否执行了用户登录操作。我该如何解决这个问题? 问题答案: 我用这种方法。首先创建一个实现Filter的类并重写doFilter()方法。doFilter()的代码是: 之后在web.xml中使用过滤器。这个过滤器就是这个。

  • 问题内容: 我正在用php做在线测验应用程序。我想限制用户再次参加考试。我尝试了以下脚本,但是它停止了我的计时器。我该怎么办? 我已经包含了源代码。计时器存储在cdtimer.js中 我有一个考试计时器,该计时器从 mysql 值中获取考试时间。计时器相应地启动,但是当我放入用于禁用后退按钮的代码时,计时器停止。我怎么了 问题答案: 有许多原因导致禁用后退按钮无法真正起作用。最好的选择是警告用户:

  • 问题内容: 我已经建立了一个一页的网站。当用户单击菜单按钮时,内容将使用ajax加载。它工作正常。为了改善SEO并允许用户复制/过去不同内容的URL,我使用 它工作正常。URL更改并且浏览器没有重新加载页面 但是,当用户单击浏览器中的后退按钮时,URL会更改,并且必须加载内容。 我已经做到了,它的工作原理是: 您知道是否有改进此代码的方法吗? 问题答案: 我所做的是将对象文字传递给页面加载。这样,