从URL中删除哈希,以无哈希URL加载页面,然后在不重新加载页面的情况下向URL添加哈希
Remove hash from URL, load the page at hash-less URL, then add hash to URL without reloading the page
我在一个使用AJAX加载一些jQuery动画的网站上工作。
使用JavaScript,我从动态生成的指向基于php的页面的链接中获取href,然后将该href添加到URL(在不可避免的#/之后)。
到目前为止一切顺利,除非用户将该页加入书签并试图访问它,否则该用户将到达主页,而不是他/她期望访问的页面。
所以,当一个页面被直接访问时,不是通过点击网站的内部链接,我想从url中删除#/,但保留它之后的所有内容,所以url是这样被书签的:
http://www.mysite.com/#/somepage
被重写为:
http://www.mysite.com/somepage
然后,在正确的页面(http://www.mysite.com/somepage
)完成加载后,我想把#/粘回到URL (http://www.mysite.com/#/somepage
)中原来的位置,而不重新加载页面(这要归功于我使用的一个聪明的代码片段,将确保其余的导航工作方式。)
:
- 页面加载前,检查URL,如果它有
#/
,删除它。 - 加载位于无哈希url的页面
- 用
#/
重新显示url,不重新加载页面。
这真的可行吗?如果有,我很感激你给我上一课。
您正在尝试做的是可行的,但需要维护完全的PITA,并且它不会在所有浏览器上可用。除此之外,键驻留在history
对象中,最近扩展了一组新的"技巧"。完整文档可从MDN获取。
你要做的是replaceState
命令。内容如下:
更新历史堆栈上的最新条目,使其具有指定的数据、标题和URL(如果提供的话)。数据被DOM视为不透明的;你可以指定任何可以序列化的JavaScript对象。注意,Firefox目前会忽略title参数;要了解更多信息,请参见操作浏览器历史记录。
这将允许您替换浏览器历史记录中的当前页面,但URL中的不能替换。URL将与您所拥有的完全相同-带有散列。考虑到你的解决方案,没有必要改变它。
但是,为了一致性,您必须确保您的无散列页面重定向到具有history
对象的客户机的存在散列的页面。这是唯一的要求。
在页面加载之前,检查URL,如果有#/,删除它。
不可能的。片段id没有发送到服务器,所以你只能用客户端代码访问它,这需要页面加载(或至少开始加载)。
加载位于无哈希url的页面
用#/重新显示url,而不重新加载页面
使用XMLHttpRequest获取数据,使用DOM更改文档以使用它,使用历史API更改地址栏中的URL。
正如在其中一个答案中指出的那样,您不能在页面加载之前删除散列。
然而,一旦页面开始加载,问题中描述的操作是可能的。
有一种方法可以做到。
// Remove the hash and reload the page at url without hash
if (window.location.href.indexOf('/#/')>=0) {
window.location = window.location.href.replace(/'/#'//, '/');
}
一旦新页面开始加载,您可以使用历史记录。pushState更新URL显示:
if ((window.location.href.indexOf('/#/')<1) && (location.pathname != "/")) {
history.pushState({}, "page x", location.protocol + '//' + location.host + '/#' + location.pathname);
}
你要记住,pushState
只适用于以Gecko 2.0开始的浏览器,所以把哈希放回url在旧的浏览器中不起作用,就这样。
这可能导致一些不幸的情况。例如,假设您的url http://www.mywebsite.com/somepage被搜索引擎编入索引。用户单击该链接,在不支持pushState的旧浏览器中访问您的网站,然后在浏览启用ajax的网站时单击其他链接。该用户很可能到达
http://www.mysite.com/somepage/#/someotherpage
然后,随着用户不断点击,它只会变得更糟:
http://www.mysite.com/somepage/#/someotherpage/#/yetanotherpage/#/andsoon/#/andsoforth/
所以你可能需要一些东西来确保你的哈希值不会一直传播。
你也可以把你的哈希删除/替换代码包装在一个条件中:
if (history.pushState) {
// add hash
} else {
// provide some alternative
}
最后,查看这两个资源。您可能根本不需要哈希:History.js和jQuery Address。
- 需要url哈希修复
- 单击引导模式锚点时添加 URL 哈希
- 每次 url 哈希更改时执行 if 语句
- 如何同步Redux状态和url哈希标记参数
- 在鼠标悬停/取消悬停父元素时,更改子图像的url哈希
- 使用 Javascript 根据 URL 哈希设置所选选项
- 在不重新加载页面的情况下更新 URL 哈希
- 阻止href="#"链接更改URL哈希
- 通过location.assign()传递url哈希
- 处理Ember.js默认路由之外的页面URL哈希参数
- URL 哈希参数的 JavaScript 字符串压缩
- 猫头鹰轮播2 在拖动时更新 URL 哈希导航
- 删除 URL 哈希字符串中的前几个字符
- 通过 url 哈希打开 Jquery 手风琴
- 空 URL 哈希会导致页面跳转到 js 事件
- 如何使用 url 哈希在刷新后加载特定页面
- 更改 URL 哈希更改的脚本代码
- jQuery 以 url 哈希为条件
- Facebook React 根据 url 哈希渲染不同的组件
- 删除哈希更改事件的 URL 哈希(不是变量)