了解 hashchange 事件的执行顺序

2024-05-19

我有一个关于此代码片段的问题要问您:

window.location.hash=1;

$(window).on('hashchange', function() {
    alert('hello');
});

上面的脚本应该执行以下操作:

  1. 将位置哈希设置为1
  2. 任何进一步的改变->alert('hello')

这就是问题所在:为什么hashchange在第一次执行的第一次调用?这个脚本不应该只改变哈希值而不发出任何警报吗?

我该如何修复它,使其按描述工作?


首先,你问:

why is hashchange在第一次执行的第一次调用?这个脚本不应该只改变哈希值而不发出任何警报吗?

为了回答这个问题,我们可以深入研究规范 http://www.w3.org/TR/html5/browsers.html。当导航到新片段时(即设置document.location.hash), 规格 http://www.w3.org/TR/html5/browsers.html#navigate-fragid经历许多步骤,其中之一是:

  1. 遍历历史到新条目,异步事件标志集。这将滚动到当前文档地址中给出的片段标识符。

规格为穿越历史 http://www.w3.org/TR/html5/browsers.html#traverse-the-history继续说道:

  1. If the asynchronous events flag is not set, then run the following steps synchronously. Otherwise, the asynchronous events flag is set; queue a task to run the following substeps.
    1. 如果 statechanged 为 true,则使用 PopStateEvent 接口在 Document 的 Window 对象上触发名为 popstate 的可信事件,并将 state 属性初始化为 state 的值。该事件必须冒泡,但不可取消,并且没有默认操作。
    2. 如果 hashchange 为 true,则触发名为 hashchange 的可信事件在浏览上下文的 Window 对象中,使用 HashChangeEvent 接口,其中 oldURL 属性初始化为旧 URL,newURL 属性初始化为新 URL。该事件必须冒泡,但不可取消,并且没有默认操作。

因此,所有这些加在一起意味着当您运行代码时,事件侦听器hashchange将在步骤 14 的子步骤中的代码运行之前添加,并随后在设置哈希值时触发。


我该如何修复它,使其按描述工作?

要修复此问题,您还可以使用以下命令对事件侦听器的添加进行排队setTimeout(.., 0) https://stackoverflow.com/questions/779379/why-is-settimeoutfn-0-sometimes-useful:

setTimeout(function() {
    $(window).on('hashchange', function() {
        alert('hello');
    });
}, 0);

由于您在设置哈希后将其添加到队列中,因此它将在上面步骤 14 中排队的任务之后添加到队列中,因此事件侦听器仅在事件触发后才会添加。

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

了解 hashchange 事件的执行顺序 的相关文章

  • 验证动态字段jquery

    下午好 我遇到了以下问题 我正在使用 jQuery 验证插件来验证我的表单 v1 13 0 客户端 工作得很好 但我无法解决的问题是 我有一个字段名称 product 它是一个数组 在这个阵列中我可能有一种或可能有 20 种产品 这是我的代
  • 用更好的模式替换开关(Javascript)

    我必须升级我的应用程序以根据用户类型和角色属性显示页面 目前 我使用一个简单的 switch 语句来根据用户类型来执行此操作 例如 switch type case a return CONSTANT ONE case b return C
  • 使用 babel env 预设时,展开运算符出现语法错误

    我正在努力 现代化 meern io 入门样板 https github com Hashnode mern starter通过替换巴别塔es2015 and stage 0预设为env 然而 似乎env预设无法识别以下片段client m
  • 在动态创建的元素的onclick函数的属性中传递一个字符串

    我试图在动态创建的锚元素的 onClick 事件处理函数的参数中传递一个字符串 请参阅小提琴http jsfiddle net shmdhussain bXYe4 http jsfiddle net shmdhussain bXYe4 我无
  • 无需重定向的 HTML 页面提交

    有没有什么方法可以在不使用ajax的情况下提交html表单而无需从当前页面重定向 你可以设置一个target 为您form 这样您就可以将表单提交到新选项卡 target blank 或一个小的 隐藏的iframe target nameo
  • 获取选定的文本框 ID jQuery

    在我的表单中 我有几个文本框 例如txtItemCode1 txtItemCode2 etc 如果我在其中任何一个上按 Enter 键 我会使用此代码执行某些操作 但我想获取选定的文本框 ID 我怎样才能做到这一点 变量 id 应该有您正在
  • IE提示打开或保存服务器的json结果

    兼容模式下的Internet Explorer通过ajax回调方法从服务器获取数据 如果我想保存数据或打开数据 会弹出一个对话框 如何摆脱它 客户说 ajax type POST data UIdlgHolder gt form seria
  • 修复 Raphaël 路径节点上 Tipsy 工具提示的位置

    这是一个非常具体且有些复杂的问题 所以我设置了一个最小测试用例 http reveal dk 8080 revealit dk tipsytest 在阅读本文的其余部分之前 您可能应该先了解一下 我的页面显示悬停时突出显示区域的图像Raph
  • 如何使用 github 托管外部 CSS 文件?

    我将 css 上传到 github 然后转到网站上的文件并单击 raw 选项 我尝试将其添加到网页中 但 chrome 给出以下错误 资源解释为样式表 但使用 MIME 类型 text plain 进行传输 https raw github
  • NodeJS - 将相对路径转换为绝对路径

    In my 文件系统我的工作目录在这里 C temp a b c d 在 b bb 下有文件 tmp txt C temp a b bb tmp txt 如果我想从工作目录转到该文件 我将使用以下路径 bb tmp txt 如果该文件不存在
  • 基于范围内变量的角度设置形式动作

    我一直在尝试设置一个搜索表单 可以在其中注入表单操作属性 在我的表格中我有
  • 当rest api应用程序服务器(express)和Angulars js应用程序在不同端口上运行时出现Cors问题

    我有用node js编写的rest api应用程序 express在端口3000上运行 而angularjs应用程序在同一服务器上的端口9001上运行 从 angularjs 应用程序调用 rst api 时 出现了 cors 问题 在re
  • 如何让php页面从html页面接收ajax post

    我有一个非常简单的表单 其中有一个名字输入字段 我捕获了表单数据 并使用标准 jQuery 发布方法通过 ajax 将其传输到 PHP 页面 但是 我根本无法从 PHP 页面获得任何在服务器端捕获数据的响应 我不确定我做错了什么或缺少什么
  • chrome 选项卡/窗口中的 window.open 行为

    我有一小段 javascript 旨在打开两个或更多选项卡 这在 FF 和 IE 中工作正常 但 chrome 会在新窗口而不是选项卡中打开第二个窗口 它不依赖于 url 因为我已经尝试过使用两个相同的 url 第一个在选项卡中打开 第二个
  • jQuery DataTables:隐藏最后一行的“删除”按钮

    我有一个DataTable在某些情况下可以返回多个页面 返回的每一行都显示一个删除按钮 但我需要它在返回的最后一行上隐藏此按钮 无论是 1 pg 还是多个 因此不能在其中使用 CSS 我想学习如何实现这一点 因为DataTables对我来说
  • 如何捕获文本区域上的 Enter 按键而不是 Shift+Enter? [复制]

    这个问题在这里已经有答案了 I m doing it for texarea A function should be called when the user press Enter but nothing should be done
  • 加载 Angular 库时,IE9 和 IE10 中出现 Angular JS“SCRIPT5007:预期对象”错误

    我正在开发一个 AngularJS 应用程序 该应用程序应在 Firefox IE 9 和 IE 10 上运行 我使用最新版本的 angularjs 库 现在是 1 3 15 服务器端是在JavaEE平台上用Java编写的 服务器运行在Gl
  • 如何得知客户端从服务器的下载速度?

    根据客户的下载速度 我想以低质量或高质量显示视频 任何 Javascript 或 C 解决方案都是可以接受的 Thanks 没有任何办法可以确定 您只能测量向客户端发送数据的速度 如果没有来自客户端的任何类型的输入来表明其获取信息的速度 您
  • 有序 JSON 对象

    我有一个 servlet 它与数据库通信 然后返回有序 按时间排序 对象的列表 在servlet部分 我有 access DB returns a list of User objects ordered ArrayList users M
  • Radiobutton-带有纯 html/css 的按钮

    是否可以创建像这样的单选按钮JQuery http jqueryui com demos button radio那些 用纯html css thanks 试试这个小提琴 http jsfiddle net mcXm7 1 http jsf

随机推荐

  • Android:从我的应用程序发送带有附件的电子邮件时出现问题

    我的应用程序允许用户创建和修改文件 我希望他们能够以电子邮件附件的形式发送文件 因此 我需要首先创建并写入一个临时文件 然后将其附加到电子邮件中 然后我想在电子邮件程序完成后删除临时文件 不幸的是 一旦用户单击 发送 gmail 应用程序就
  • 核心数据 NSFetchRequest 还获取实体的子对象

    我是 iOS 开发和 Core Data 的新手 我有一个父 NSManagedObject class Units interface Properties NSManagedObject property nonatomic retai
  • 两将协议

    我正在尝试在不可靠的通道上制定一个协议 基本上两方 A 和 B 必须同意做某事 所以这就是两位将军的问题 http en wikipedia org wiki Two Generals 27 Problem 由于没有万无一失的解决方案 我正
  • xdebug.remote_handler 在 PHP.INI 中设置,但未在 PHPinfo 中显示

    我正在尝试让 Xbdebug 与 NetBeans 一起运行 以便调试一些 PHP 代码 我确信几年前我已经让它工作了 然后切换了 IDE 现在想切换回来 When I try to debug the status bar shows 并
  • C++:如何从函数返回shared_ptr

    当尝试从函数返回shared ptr时 我得到 对局部变量 recipe 的引用返回 Werror return local addr 我哪里做错了 shared ptr
  • 将查询字符串添加到 Ajax url 调用

    我想知道当我们调用 Jquery Ajax 时是否可以将查询字符串与 URL 一起传递 例子 ajax type POST url index php task addNewInfo data regForm serialize dataT
  • 变量替换为字符串

    我可以做类似的事情吗 s said s blah name blah 在 VB NET 中 写字越来越痛苦name said blah blah 在VB NET 14 对于VS2015 中 您可以使用字符串插值 https msdn mic
  • nHibernate 3 - Left Join re-Linq 解决方案

    我正在尝试使用 nHibernate 3 运行下面的 Linq 查询 var items from c in session Query
  • 是否可以使用 jQuery .on 和悬停?

    我有一个 ul 在初始页面加载后用 javascript 填充 我目前正在使用 bind with mouseover and mouseout 该项目刚刚更新到 jQuery 1 7 所以我可以选择使用 on 但我似乎无法让它工作hove
  • 在 MVC 应用程序中使用 DataTables.NET ajax 调用访问 WebAPI 2 json

    我一直在尝试让 DataTables NET 与我构建的 WebAPI RESTFul 服务很好地配合 但返回的 json 似乎不符合 DataTables 正在寻找的内容 我尝试了各种 服务器处理 示例以及我在互联网上找到的一些示例 例如
  • Angular ui.router,从子控制器调用父控制器函数?

    我将 Angular 与 ui router 一起使用 并设置了嵌套视图 父视图有一个 div 我可以通过父控制器上的函数切换其可见性 我想从嵌套视图的子控制器调用此函数 我该怎么做 http plnkr co edit zw5WJVhr7
  • 是否有一种类型安全的方法可以将较大的对象减少()为打字稿中的新类型?

    我有一个表示数据库查询结果的数据结构 它是一个具有许多属性的对象 所有属性都是标量 在我的例子中 都是字符串或数字 我想提取这些属性的一部分并填充一个具有已定义形状的新对象 const input Record
  • Gradle,取决于订购

    对 Gradle 中的排序感到困惑 我是一个新手 之前使用 Ant 进行构建 尝试使用 Gradle 这可能会解释其中的一些内容 简要背景 以防有人问 你为什么要这样做 我们在 war 文件中发布 Java WebStart 应用程序 Ja
  • Same_length/2 更好的纯版本

    鉴于频繁的纯定义same length 2 as same length same length As Bs same length As Bs same length L L loops 是否有一个纯粹的定义不会在这种情况下循环 类似于纯
  • 命名空间常量

    我正在寻找一种理想的方法来命名一些常量以便稍后在我的代码中访问 理想情况下 常量有两层 其中第一层是整个项目的命名空间 我们称之为Foo 第二层是常量所代表的类 我们称之为Bar 是使用以下内容实现此类操作的最佳方法吗 var Foo Fo
  • 如何在mathematica中进行函数替换

    我有这样的表情D f x y x 我想替换f x y with x y 我尝试了以下方法 D f x y x f x y gt x y and D f x y x f gt x y 但两者都不起作用 将不胜感激您的帮助 谢谢 The Ful
  • 如果不能保证调用 onDestroy() 为什么要实现 onDestroy() 呢?

    根据 android 活动生命周期 保证被调用的唯一回调 如果活动离开运行状态 这通常是预期的 是onPause 因此 我必须假设在某些情况下实施是有意义的onStop and onDestroy 虽然他们并不是真正的保证被称为 我明白那个
  • javax.inject.Named 注释的用途是什么?

    我正在尝试理解javax inject包 我不清楚是什么javax inject Named注释应该用于 Javadoc 没有解释其背后的想法 Javadoc 位于http download oracle com javaee 6 api
  • 子文件夹和关系中的 Rails 模型

    我在自动加载的文件夹中组织了一些轨道模型 config autoload paths Dir Rails root join app models 我可以直接使用所有模型 例如Image first file name 但是当我尝试通过关系
  • 了解 hashchange 事件的执行顺序

    我有一个关于此代码片段的问题要问您 window location hash 1 window on hashchange function alert hello 上面的脚本应该执行以下操作 将位置哈希设置为1 任何进一步的改变 gt a