我在使用history.js 时遇到问题,我不知道如何解决。
在我正在开发的网站上,我们使用 History.js 在页面之间移动 - 如果您单击任何链接,history.js 就会通过 AJAX 加载 URL、更新 URL 并为内容创建过渡效果。然而,我们还有包含项目的索引页面;如果你点击一个项目,history.jsis not使用 - 内容通过 ajax 加载并显示在弹出窗口中。还有一种情况是用户可以打开项目的 URL(例如在新选项卡中或从搜索中),在这种情况下,用户应该被重定向到带有项目 URL 哈希值的索引页面,这将告诉 JS 运行以下事件单击具有哈希 URL 的链接。但是,history.js 会启动并重定向到项目 URL。
重申一下:
- 用户来到 /items/ URL
- 左键单击项目 (/item-[id]/ URL),这会在弹出窗口中打开内容(AJAX 请求)
- 右键单击项目并在新选项卡中打开链接
- 登陆 /item-[id]/ (不是 AJAX 请求),并通过标头重定向重定向到 /items/#/item-[id]/ 。
- History.js 在加载后立即启动并将用户重定向到 /item-[id]/
我正在使用history.js 的HTML5 版本(我认为不应该像这样,但不知道),它会在history.js 加载后立即重定向(页面上没有其他脚本)。除了将重定向更改为 /items/?/item-[id]/ 之外,还有其他方法可以解决此问题吗?(我认为)这应该可以解决该问题。
为了说明这个问题:
a.html
<html>
<body>
<script type='text/javascript' src="native.history.js"></script>
<a href="b.html#/b/">b</a>
</body>
</html>
b.html
<html>
<body>
<script type='text/javascript' src="native.history.js"></script>
<a href="a.html#/a/">a</a>
</body>
</html>
Using native.history.js
,这是history.js的纯HTML5版本,没有任何框架绑定,在这里找到:https://github.com/browserstate/history.js/blob/master/scripts/bundled-uncompressed/html5/native.history.js https://github.com/browserstate/history.js/blob/master/scripts/bundled-uncompressed/html5/native.history.js
它在没有任何重定向的情况下说明了这一点。一旦您点击任何链接,history.js 就会将您重定向到哈希值后的 URL。
我决定直接修改history.js并添加一个选项preventHashRedirect
-
#1820 // if (currentState ) {
+
#1820 // if (!History.options.preventHashRedirect && currentState ) {
这解决了这个问题。 (基本上哈希更改不被视为 popstates 并且不会触发状态更改)。
可能会改变isTraditionalAnchor
函数(它确定什么被认为是锚点以及 # 后面的 URL)来处理以开头的所有哈希值!
将是一个更好的主意。
-
#1052 // var isTraditional = !(/[\/\?\.]/.test(url_or_hash));
+
#1052 // var isTraditional = /^!/.test(url_or_hash) ? true : !/[\/\?\.]/.test(url_or_hash);
这样你实际上可以防止history.js影响以开头的任何重定向!
。 (例如,如果您实际上有一个名为my.puppy
, doing <a href='#!my.puppy'>
不会导致通过history.js重定向。
@Martin Barker 的以下想法仍然有效,尽管添加额外的重定向让我觉得有点……粗糙。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)