当前位置: 首页 > 面试题库 >

开启-window.location.hash-更改了吗?

董宜然
2023-03-14
问题内容

我正在使用Ajax和哈希进行导航。

有没有办法检查这样的window.location.hash变化?

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

如果我在加载文档时检查它,它将起作用。

但是,如果我具有基于#hash的导航,则在按浏览器上的“后退”按钮时将不起作用(因此我从blah#456跳到blah#123)。

它显示在地址框中,但是我无法用JavaScript捕获它。


问题答案:

真正做到这一点的唯一方法(以及“
reallysimplehistory”的实现方式)是通过设置一个间隔来保持检查当前哈希值,并将其与之前的哈希值进行比较,然后执行此操作,并让订阅者订阅更改后的内容如果哈希发生变化,我们将触发该事件。它并不完美,但浏览器实际上并不原生支持此事件。

更新以使此答案保持最新:

如果您使用的是jQuery(今天对于大多数人来说应该是基础的),那么一个不错的解决方案是使用jQuery通过其事件系统侦听window对象上的hashchange事件为您提供的抽象。

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

这里的好处是您可以编写甚至不需要担心hashchange支持的代码,但是您确实需要做一些魔术,以一种鲜为人知的jQuery特性jQuery特殊事件的形式。

使用此功能,您基本上可以为任何事件运行一些设置代码,这是有人第一次尝试以任何方式(例如绑定到事件)使用该事件。

在此设置代码中,您可以检查是否支持本机浏览器,如果浏览器不是本机实现的,则可以设置单个计时器以轮询更改并触发jQuery事件。

这完全从需要了解这种支持问题解除绑定你的代码,这样的一个特殊事件的实现很简单(以得到一个简单的98%的工作版本),但为什么这样做时,别人早已。



 类似资料:
  • 问题内容: 我有一个使用哈希导航的ajax webapp(JSF 2.0)。 我已在此答案的帮助下使用了事件触发功能,并在较旧的浏览器(主要是IE6 + 7)中检查了值的变化。 执行此操作的Javascript代码: 这很好。意思是,当我更改哈希值时,AJAX应用会获取通知并进行更新。IE 6/7是其中一个无效的实例。当我按下“后退/前进”按钮时,我可以看到URL栏已使用正确的哈希值更新,但似乎没

  • 窗口最多可开启8个。 轻触(窗口)>(追加),可开启新窗口。 切换显示中的窗口 1. 轻触(窗口)。 2. 轻触想显示的窗口。 关闭窗口 1. 轻触(窗口)。 2. 轻触想关闭的窗口的(关闭)。 关闭所有窗口时,新窗口会自动开启并显示书签列表。

  • 问题内容: 我在我的网站上设置了一个滑动面板。 完成动画制作后,我像这样设置哈希 (这是一个回调,并且在前面已分配)。 这很好用,可以使用户在面板上添加书签,也可以使非JavaScript版本正常工作。 但是,当我更新哈希时,浏览器跳到该位置。我想这是预期的行为。 我的问题是:如何预防这种情况?即如何更改窗口的哈希值,但是如果哈希值存在,浏览器 不能 滚动到该元素?某种东西吗? 我正在使用jQue

  • 问题内容: 我正在使用JDK的keytool来生成Google Maps API密钥指纹。在多次被拒绝的同时,我意识到我最近已将JDK升级到1.7。所以我将目录切换到JDK6(感谢上帝,仍然保留旧版本。),并重复相同的命令: 和Bang!有用。事实证明,JDK7生成了SHA1指纹而不是MD5指纹,这导致我向Google提交的申请被拒绝。因此,我想知道为什么新版本的JDK会发生这种情况。有人有线索吗

  • 组播地址 SO_REUSEADDR对于多播地址的含义发生了变化,因为它允许将多个套接字绑定到源多播地址和端口的完全相同的组合上。换句话说,对于多播地址,SO_REUSEADDR的行为与对于单播地址,SO_REUSEPORT的行为完全相同。实际上,代码对组播地址的SO_REUSEADDR和SO_REUSEPORT是相同的,这意味着您可以说SO_REUSEADDR意味着所有组播地址都是SO_REUSE

  • 问题内容: 我对背景色有疑问。如何在启用的文本字段中进行更改(编辑时)?仅适用于禁用的文本字段。可以更改窗口中所有文本字段的背景,但我只想对其中一个进行更改。 问题答案: 好的,这是我需要的: