使用replaceState和jQuery Mobile更新部分页面AJAX刷新的URL

时间:2015-01-15 23:16:45

标签: javascript ajax jquery-mobile html5-history

我正在使用jQuery Mobile 1.4.2,并且在我的应用程序中有一些页面,我使用AJAX刷新内联部分页面(不在jQM中进行完整的“页面导航”)。我想更新当前的URL而不添加历史记录点来跟踪这些AJAX操作的状态,这样如果用户导航到子页面然后返回,他们就会回到他们中断的地方(我们不会在DOM中缓存页面) - 如果他们将URL复制/粘贴到新的浏览器中,它也看起来完全一样。

history.replaceState非常适合这种情况,但我无法弄清楚如何将其与jQuery Mobile正确集成。如果我在执行AJAX操作时调用它,则URL会正确更新。但是,如果我导航到子页面,然后返回,当浏览器地址栏显示正确的URL(带有修改)时,jQuery Mobile脚本似乎只获取了原始 URL页面,所以内容不符合预期。

我相信jQM正在使用自己的历史API /堆栈,它是存储原始页面URL的地方。是否有任何API我可以使用它replaceState,或者有没有办法通知jQM的历史记录页面URL已经更改而没有添加历史记录点?我在文档中看到$.mobile.navigate(),但在尝试之后,它似乎总是会添加一个新的历史记录点,在这种情况下我不想要这样做。

2 个答案:

答案 0 :(得分:1)

我相信我找到了一个可行的解决方案,虽然它可能有点脆弱。在调试中,似乎jQuery Mobile使用附加到包含url属性的历史记录的状态对象,当使用兼容popstate的浏览器时,它是如何确定要返回的URL的。因此,仅使用url参数调用history.replaceState是不够的。还必须提供至少包含url属性的状态对象。

似乎有一个内部jQuery Mobile辅助函数,它将获取一个URL,相对于root正确映射它,创建状态对象,然后调用history.replaceState。此API为$.mobile.navigate.navigator.squash(newUrl);

虽然我一般不喜欢使用内部API,但在这种情况下,它看起来效果很好!编写自己的此方法版本以执行等效行为可能也是微不足道的。希望这能帮助处于同样情况的其他人。

答案 1 :(得分:0)

我也有这个问题,你的解决方案最接近预期的结果。问题是$.mobile.navigate.navigator.squash(newUrl);会在网址中添加一个额外的#,这是无法接受的。

经过多次尝试和搜索后,我设法使用history.replaceState函数而不会损坏“BACK”行为。秘诀是在stateObj对象中使用绝对路径:

var myurl = "https://example.com/page.php?id=123";
var stateObj = { url: myurl }
history.replaceState(stateObj, "", myurl);

我希望它对其他人也有用。