javascript - 创建 javascript 小部件时如何管理浏览器 "back"和 "forward"按钮

标签 javascript jquery ajax

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

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

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

如此真实的案例场景。我在网站 www.fantastic-events.com 上有我的事件。我使用 javacascript 小部件将日历嵌入到 www.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),那就是要走的路。如果您决定使用此方法,您的 friend 就是 hashchange event .哈希模式依赖于此事件来触发功能。以最天真的方式,它看起来像:

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

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

请注意,使用 hashchange 方法可能会与使用该方法的其他库冲突,并且由于大多数流行的框架(ember、angular 等)出于浏览器兼容性原因使用该方法,因此有点冒险。

对于您对“不存在的页面”问题的担忧 - 一种可能的解决方案是为您的状态使用查询参数,而不是不存在的 URL:

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

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

可以看看this nice MDN article以便更好地引用。

关于javascript - 创建 javascript 小部件时如何管理浏览器 "back"和 "forward"按钮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26475746/

相关文章:

javascript - JavaScript 匿名函数参数名称重要吗?

javascript - 使用 javascript 验证用户输入

jquery - 如何添加新索引 Highcharts 柱形钻取图表

框架从 4.5.2 升级到 4.7.2 后,C# Web API 引发 CORS 错误

javascript - Ajax 发布到远程 php 文件不适用于phonegap

javascript - JavaScript 中的 sCrypt 实现?

javascript - Bootstrap 3 列列排序

jquery:不显示特定的下拉菜单

jquery - Div 元素不会在 JQuery 中重新定位

ajax - 禁用 AJAX 缓存