我使用Ajax和hash进行导航.

有没有办法判断window.location.hash人是否发生了这样的变化?

http://example.com/blah#123http://example.com/blah#456

如果我在文档加载时判断它,它就会工作.

但是,如果我有基于#hash的导航,那么当我在浏览器上按Back按钮时就不能工作(所以我从blah#456跳到了blah#123).

它显示在地址框中,但是我无法用JavaScript捕捉到它.

推荐答案

真正做到这一点的唯一方法(也就是"realysimpleHistory"是如何做到这一点的),是通过设置一个持续判断当前散列的间隔,并将其与以前的散列进行比较,我们这样做,并让订阅者订阅我们在散列更改时触发的已更改事件.它并不完美,但是浏览器本身并不支持这个事件.


更新以保持此答案的 fresh 度:

如果您使用的是jQuery(现在对大多数人来说,这应该是基本的),那么一个很好的解决方案就是使用jQuery提供的抽象,通过使用它的事件系统来监听窗口对象上的hashchange事件.

$(window).on('hashchange', function() {
  //.. work ..
});

这里的好处是,您可以编写甚至不需要担心hashchange支持的代码,但是您确实需要做一些魔术,以一种不太为人所知的jQuery功能jQuery special events的形式.

有了这个功能,当有人第一次try 以任何方式使用事件(例如绑定到事件)时,您基本上可以为任何事件运行一些设置代码.

在这个设置代码中,您可以判断本机浏览器支持,如果浏览器没有本机实现这一点,您可以设置一个计时器来轮询更改,并触发jQuery事件.

这完全解除了您的代码需要理解这个支持问题的束缚,这种特殊事件的实现非常简单(要得到一个简单的98%工作版本),但为什么要这样做呢.

Javascript相关问答推荐

如何在不使用类型化数组的情况下将32位浮点数按位转换为整值?

如何使用Paged.js仅渲染特定页面

我应该在redux reducer中调用其他reducer函数吗?

zoom svg以适应圆

如何才能拥有在jQuery终端中执行命令的链接?

我开始使用/url?q=使用Cheerio

了解Node.js中的EventEums和浏览器中的addEventEums之间的关系

在JavaScript中声明自定义内置元素不起作用

在vercel throws上部署带有gunjs的sveltekit应用无法找到模块./' lib/文本编码'

浮动Div的淡出模糊效果

Snowflake JavaScript存储过程返回成功,尽管预期失败

如何在Javascript中使用Go和检索本地托管Apache Arrow Flight服务器?

将本机导航路由react 到导航栏中未列出的屏幕?

简单的PayPal按钮集成导致404错误

虚拟滚动实现使向下滚动可滚动到末尾

如何在ASP.NET JavaScript中使用Google Charts API仅对绘制为负方向的条形图移动堆叠条形图标签位置

连接到游戏的玩家不会在浏览器在线游戏中呈现

是否可以将Select()和Sample()与Mongoose结合使用?

在ChartJS中使用spanGaps时,是否获取空值的坐标?

在Puppeteer中使用promise进行日志(log)记录时出现TargetCloseError