如何检测 JavaScript 中的哈希值后 URL 是否已更改

2024-04-27

如何在 JavaScript 中检查 URL 是否已更改?例如,像 GitHub 这样使用 AJAX 的网站将在 # 符号后附加页面信息,以创建唯一的 URL,而无需重新加载页面。检测此 URL 是否发生变化的最佳方法是什么?

  • Is the onload事件再次调用?
  • URL 是否有事件处理程序?
  • 或者必须每秒检查一次 URL 以检测更改?

我希望能够添加locationchange事件监听器。经过下面的修改后,我们就可以这样做了,像这样

window.addEventListener('locationchange', function () {
    console.log('location changed!');
});

相比之下,window.addEventListener('hashchange',() => {})仅当 url 中的主题标签后面的部分发生更改时才会触发,并且window.addEventListener('popstate',() => {})并不总是有效。

这个修改,类似于克里斯蒂安的回答 https://stackoverflow.com/a/41825103/3577695,修改历史对象以添加一些功能。

默认情况下,在这些修改之前,有一个popstate事件,但没有事件pushstate, and replacestate.

这修改了这三个函数,以便全部触发自定义locationchange事件供您使用,并且pushstate and replacestate如果您想使用这些事件。

这些是修改:

(() => {
    let oldPushState = history.pushState;
    history.pushState = function pushState() {
        let ret = oldPushState.apply(this, arguments);
        window.dispatchEvent(new Event('pushstate'));
        window.dispatchEvent(new Event('locationchange'));
        return ret;
    };

    let oldReplaceState = history.replaceState;
    history.replaceState = function replaceState() {
        let ret = oldReplaceState.apply(this, arguments);
        window.dispatchEvent(new Event('replacestate'));
        window.dispatchEvent(new Event('locationchange'));
        return ret;
    };

    window.addEventListener('popstate', () => {
        window.dispatchEvent(new Event('locationchange'));
    });
})();

请注意,我们正在创建一个closure https://stackoverflow.com/questions/111102/how-do-javascript-closures-work?rq=1,将旧函数保存为新函数的一部分,以便每当调用新函数时都会调用它。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何检测 JavaScript 中的哈希值后 URL 是否已更改 的相关文章

  • 如何检索 jquery $.ajax 对象的responseJSON属性[重复]

    这个问题在这里已经有答案了 我有这个 JavaScript ajax ajax type GET url DBConnect php data dataType json success function data error functi
  • 将数组中的所有值作为参数传递给函数

    我有一个值数组 a b c d 我需要将它们作为参数传递给函数 window myFunction a b c d 如果我可以将数组 对象传递到函数中 那么这会更容易 但这些函数是由其他人编写的或已经存在 我无法更改它们 它们需要作为单独的
  • 在 HTML SELECT 标记中禁用键盘

    我想禁用 HTML SELECT 标记的键盘 以便用户只能使用鼠标来选择选项 我试过了event cancelBubble true on the onkeydown onkeyup and onkeypress没有运气的事件 有任何想法吗
  • IE 9 的子元素不透明,我无法使用 captify 阻止它

    好的 我正在使用一段名为 Captify 的 javascript 它为您的图像添加了一个带有文本的小弹出窗口 适用于所有接受 IE9 的浏览器 IE9 会淡化弹出 div 中的所有内容 我已阅读其子元素问题 但无法修复它 由于在网上任何地
  • 通过单击字段启用非活动字段

    是否可以有一组非活动字段 如果单击其中一个字段 则某些字段将变为必填字段并运行某些代码段 举例来说 您显示了三个字段
  • 是否可以用 json 进行表达式/计算?

    我使用出色的 json server 作为应用程序的后端 它对于访问自定义端点以检索一些数据非常有用 但是如果它允许我进行计算 表达式以便我也可以模仿后端行为 那将会非常有用 以这个数据结构为例 products name football
  • 使用JS将图像的特定背景颜色设置为透明

    我正在使用以下代码来修改图像的透明度 然而 我想做的只是修改图像的背景颜色并将其 alpha 通道设置为 0 而不是整个图像 以下代码将整个图像的 Alpha 透明度设置为 0 var ctx this data getContext 2d
  • 避免 AngularJS 部分视图在 IE 中缓存

    我正在开发一个 ASP NET MVC 应用程序 它也有一些 angularJS 我有一个主页 其中有不同的选项卡 当您单击它们时 它们会加载角度部分视图 主页是这样的 div class widget div div class widg
  • 在 Chrome 中检索浏览器语言

    我一直在尝试让 momentjs 正确检测浏览器语言并本地化时间显示 按照使用 Moment js 进行区域设置检测 https stackoverflow com questions 25725882 locale detection w
  • RxJS - 从可观察对象中获取最后 n 个元素

    我想从可观察对象中获取最后 3 个元素 假设我的时间线是这样的 a b c d e f g h i j gt where a b c d e f g h i j are emitted values 每当发出新值时 我想立即获取它 因此它可
  • 日期时间的自定义 JavaScriptConverter?

    我有一个对象 它有一个 DateTime 属性 我想通过 AJAX JSON 将该对象从 ashx 处理程序传递回网页 我不想使用第 3 方控件 当我这样做时 new JavaScriptSerializer Serialize DateT
  • Firefox OS 后台服务

    我想构建一个应用程序 用户可以通过它输入一些设置 并且应用程序将启动后台服务来根据这些设置执行一些任务 我只想在模拟器中运行应用程序和后台服务 我知道它需要 认证 模式才能运行后台服务 但我现在不考虑在 Firefox Marketplac
  • 当脚本是从加载的脚本动态创建的 DOM 节点时,脚本 onload 和 window.onload 的顺序是否定义良好?

    File loader js function main if typeof window undefined var script window document createElement script script src https
  • 设计 Javascript 前端 <-> C++ 后端通信

    在我最近的将来 我将不得不制作一个具有 C 后端和 Web 前端的系统 要求 目前 我对此了解不多 我认为前端将触发数据传输 而不是后端 所以不需要类似 Comet 的东西 由于在该领域的经验可能很少 我非常感谢您对我所做的设计决策的评论
  • 为什么严格模式下不允许使用八进制数字文字(解决方法是什么?)

    为什么八进制数字文字不允许JavaScript 严格模式 https developer mozilla org en docs Web JavaScript Reference Strict mode 有什么害处呢 use strict
  • 将 javascript 变量发送到服务器端 ASP .NET

    我需要在回发时将 JavaScript 数据传递到服务器端 Exvar jsVariableToPass new Object jsVariableToPass key1 value1 jsVariableToPass key2 value
  • 在javascript中定义Date.parse的格式[重复]

    这个问题在这里已经有答案了 我正在使用 Date parse 将字符串转换为 JavaScript 中的日期 但是 如果字符串看起来像 10 11 2016 它会被解释为 2016 年 10 月 11 日 我需要将其解释为 2016 年 1
  • Safari 的 Javascript 与 document.write 的问题

    我的问题只发生在 Safari 上 IE FF Chrome 和 Opera 都可以完美运行 我正在向 DOM 添加一个对象 与 YouTube 的方式完全相同 具体取决于 ActiveX 或 NPAPI 因此在确定写入对象类型后 我通过以
  • JS中如何过滤多个字符串? [复制]

    这个问题在这里已经有答案了 我希望能够过滤数组中的多个字符串 类型 例如我想过滤类型meat并输入fruit在下面的数据结构中 我想要实现的是过滤数据对象 const data type meat food hamburger type f
  • 禁用 Materialise Carousel 上的触摸

    看起来以前没有人问过这个问题 因为我几乎在互联网上寻找一个非常简单的答案 如何禁用在物化轮播上向左 向右滑动的功能 在 Materialize js 添加 编辑 var allowCarouselDrag true value functi

随机推荐

  • 如何填充剩余高度的100%?

    1 2
  • 列出 git 标签名称、日期和消息

    如何列出所有标签的标签名称 标签日期和标签消息 看来 git 通过以下方式分离了提交的显示逻辑git log并通过标签git tag使得列出标签名称 标签日期和标签消息变得困难 我可以显示标签日期 姓名和提交消息 using git log
  • bcrypt 中的盐的要点

    抱歉 如果这是一个愚蠢的问题 我只是想知道 bcrypt 中的盐有什么意义 我的意思是 如果您有以下用于从密码创建哈希的代码 function generateSalt salt 2a 13 salt salt 11111111111111
  • iOS 在应用程序内注册推送通知

    Q1 我必须在应用程序启动时执行此操作吗 或者我可以在应用程序中的任何时候触发允许 不允许的提示吗 Q2 有没有办法查明用户是否单击了是 否 打回来 Q3 如果用户已经单击 否 在之前的会话中 我的提示实际上会触发吗 或者我是否需要告诉用户
  • “sed” 在文件中插入反斜杠

    Tool Windows 版 Git Bash Problem 尝试在目录中每个文件的顶部插入文本 connectcentral Code for f in DIR sql do sed i 1i connect central f don
  • iPhone:跳转到uitableview中的下一个uitextfield,如何?

    在我的 iPhone 项目中 我使用 UITableview 和包含 UITextfields 的 UITableViewCells 我在许多应用程序中看到 可以使用下一个按钮跳转到下一个单元格中的下一个文本字段 实现这一目标的最佳方法是什
  • 诊断 Mac OS X 上的堆碎片?

    我正在编写的核心基础应用程序似乎消耗的内存比我实际分配的内存多 根据活动监视器中的 真实内存 计数 我已通过 Instruments 中的 实时字节分配 视图确认我的实际分配符合我的预期 大约 10MB 但活动监视器中的 真实内存 计数显示
  • 轻松安全AppiumService

    我是 Appium 新手 我想使用 Appium 和 C 执行一些 ADB 命令 执行 adb shell ps 的示例 Dictionary
  • 如何延迟forkJoin

    你会怎样拖延 forkJoin 在 rxjs 中 这是我已经拥有但想使用的delay https www learnrxjs io operators utility delay html运营商用那个 return forkJoin thi
  • iOS 内存警告发送到已释放的 UIViewController

    我有奇怪的行为 我的应用程序正在启动UINavigationController 如果我推视图控制器ANavigationController 返回并模拟内存警告一切正常 如果我推相同的视图控制器 ANavigationController
  • 浮点数的最佳中点公式是什么?

    第一个公式 m a b 2 简单 但是存在很大的溢出风险 除了 数值分析 第 9 版伯登和费尔斯指出 当 b a 接近机器的最大精度时 a b 2 有可能返回一个在区间 a b 中不均匀的中点 尽管没有提供进一步的解释 第二个 m a b
  • 如何通过 Angular 6 中的服务将对象发送到不相关的组件?

    所以我是 Angular 的新手 我正在尝试使用服务将对象从组件 1 发送到组件 2 当我将结果记录到 component2 中的控制台时 它没有给我对象的更新值 这可能是因为服务在第二个组件中重新初始化 你能帮忙解决这个问题吗 这是我的代
  • 为什么“(def 元音?(set“aeiou”))”有效?

    我正在看优秀的 Clojure 教程here http ociweb com jnb jnbMar2009 html 在其中一个示例中 它具有如下所示的 Clojure 代码 def vowel set aeiou 这使得元音对于元音返回
  • 如何在vim中的相同行数前面插入多行?

    假设我有两个文本块 其中之一在我的剪贴板中 one two three 另一个位于我正在 vim 中编辑的文件中 AAA BBB CCC 如何在第二个块前面插入第一个块以获得以下结果 oneAAA twoBBB threeCCC 我希望有一
  • html5 下载属性在 FF 中不起作用

    您好 我有一个带有下载属性的锚标记 单击该标记时将从 href 中定义的 url 下载图像 这在 Chrome 中工作正常 但在 Firefox 中它需要浏览器中的图像 有什么办法可以让我们在 FF 中实现这一点吗 a href https
  • BlazorNotifyAuthenticationStateChanged 不会更新基于授权的元素

    我正在实施一个自定义AuthenticationStateProvider并在 mainLayout 中使用来自用户声明的信息 据我了解执行后NotifyAuthenticationStateChanged方法本身应该重新渲染所有使用的组件
  • 带有图像或路径的自定义滑块

    我的 WP7 应用程序中有一个滑块 我想重新设计它的样式 我的默认模板有问题 我做了类似的事情 但我无法将拇指 绑定 到该值
  • R 中独立环境的源脚本,而不是全局环境

    有没有办法source 一个脚本在R这样它就作为父环境附加到全局环境 GlobalEnv 目前 当我获取脚本时 该脚本的所有变量和函数都会出现在我的全局 交互式 环境中 我想将这些变量和函数包含在搜索路径中 但不包含在 GlobalEnv
  • Mockito-thenReturn(true) 仍然在模拟对象上返回 false

    我最近开始阅读有关 Mockito 的内容 根据我的理解 以下代码行必须返回 true 但它返回 false 测试班 public class PersonServiceImplTest Car car InjectMocks CarSer
  • 如何检测 JavaScript 中的哈希值后 URL 是否已更改

    如何在 JavaScript 中检查 URL 是否已更改 例如 像 GitHub 这样使用 AJAX 的网站将在 符号后附加页面信息 以创建唯一的 URL 而无需重新加载页面 检测此 URL 是否发生变化的最佳方法是什么 Is the on