在 Firefox 上使用 popState 平滑滚动和返回按钮 - 需要单击两次

2024-04-26

我正在尝试实现一个小代码,当我单击锚点时(并且锚点名称出现在动画之后),我可以使用它实现平滑滚动,并且如果我按下浏览器的后退按钮,我想返回到页面顶部并更新 URL(不带 #anchor 名称)。

这是代码:

$(function() {
  // Smooth scrolling when clicking on anchor
  $('a[href*=#]:not([href=#])').click(function(event) {
    event.preventDefault();
    if (location.pathname.replace(/^\//,'') == this.pathname.replace(/^\//,'') && location.hostname == this.hostname) {
      var target = $(this.hash);
      target = target.length ? target : $('[name=' + this.hash.slice(1) +']');
      if (target.length) {
        var hash = this.hash; 
        $('html,body').animate({ scrollTop: target.offset().top - 55}, 300, function() {
          location.hash = hash;
          href = window.location.href;
          history.pushState({page:href}, null, href);
        });
        return false;
      }
    }
  });
  // Get smooth scrolling to the top whith back button of browser
  $(window).bind('popstate', function(event) {
    var state = event.originalEvent.state;
    var target = window.location.href.split('#');
    var href = target[0];
    if (state) {
      $('html,body').animate({ scrollTop: 0 }, 300, function() {
        window.location.href = href;
     })
   }
  });

  // First page loading
  window.onload = function() {
    history.replaceState({ path: window.location.href }, '');
  }
});

以上所有功能在 Safari 和 Chrome 下都能正常运行。但 Firefox 的情况并非如此:一旦执行平滑向下滚动,我需要单击两次后退按钮才能重定向到页面顶部。

我见过stackoverflow 上的另一个问题 https://stackoverflow.com/questions/9634518/popstate-need-to-click-twice-on-back-button-to-actually-get-back并尝试使用和不使用 event.preventDefault 进行操作,也只放置:

$('html').animate

or $('body').animate

但行为是一样的。

如果有人能明白为什么它不起作用。

Thanks


您正在触发此行中的其他历史记录更改location.hash = hash;

所以,我对你的代码做了一些更改,现在它可以在我的 FF 中运行了。

在点击处理程序中,

   $('html').animate({ scrollTop: target.offset().top - 55}, 300, function() {
      href = window.location.href;
      history.pushState({page:href}, null, href.split('#')[0]+hash);
    });

另外,似乎$('html,body').animate运行回调两次,因此会扰乱历史记录。这就是为什么我只留下html。

在 popstate 处理程序中,我删除了页面重新加载,但如果您愿意,您可以保留它:

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

在 Firefox 上使用 popState 平滑滚动和返回按钮 - 需要单击两次 的相关文章

  • 静态方法而不是原型方法Javascript

    当在类中调用实例函数时 对象的每个实例都会获得自己的函数副本 但在原型方法和静态方法中不会创建副本 它们属于类 所以如果它们都没有创建其函数的副本 那么为什么如果我们不想复制 可以简单地使用原型方法 那么我们是否有静态函数 我有点困惑 如果
  • javascript while循环在节点和浏览器中给出不同的结果

    我正在执行以下看似简单的代码 var number 0 while number lt 12 console log number number number 2 我在浏览器和 Node 中得到不同的结果 当我在 Firefox v 32
  • 等待多个延迟对象完成并使用解析值

    我正在尝试找出一种方法来等待多个延迟对象并在完成后处理它们 可能就像开始延迟对象的下一组 我被困住了 因为以下结果不是预期的结果 我期待结果为 allDone resovled values are 1 2 3 实际结果是 allDone
  • HTML 表格换行列

    我有一个表 用户将数据输入到列中 每次用户输入数据时都会创建一个新列 一段时间后 他们有大量的专栏 我需要它们换行 我知道如何将文本换行在列内 但我需要将整个列换行在第一列下方 依此类推 您不应该为此使用表格 您应该使用具有 float l
  • 使 div 更大并在悬停时向上动画更大的部分

    当用户将鼠标悬停在 div 上时 我试图将 div 向上设置动画 我可以对 div 进行动画处理 使其变大 但动画是向下发生的 我试图将 div 的底部保持在同一位置 并平滑地向上增加 div 的大小 请参阅 jsfiddle 这里 htt
  • 锁定 contenteditable="true" div 中的元素

    我有一个用于用户输入的 contenteditable div 当单击按钮时 它会显示替换某些单词的选项 首先 它删除所有 html 并创建可以替换单词的 span 元素 这些词的标记不同 我面临一些问题 当直接在跨度之前或之后单击并键入文
  • Javascript 中繁重计算的最佳实践?

    我正在处理客户端脚本 需要进行繁重的计算 例如将大量对象推送到数组中 这会导致 JavaScript 停止响应并且浏览器挂起并发出警报 是否有任何最佳实践或设计模式来处理这些计算 我搜索并找到许多不同的方法来处理这些情况 但解决方案很难实现
  • JavaScript 动态变量名称[重复]

    这个问题在这里已经有答案了 好吧 我想在用户单击时创建变量 每次单击都会添加一个新变量 我目前正在使用 jquery 和 javascript 我无法在服务器端执行此操作 这必须在浏览器中完成 newCount document getEl
  • 如何在 div 中加载页面?

    我被告知使用 Div 代替 iframe 是前进的方向 所以我使用横幅和主体中的框架 如何将我的index html加载到我的div中 你尝试过 jquery 的 load 吗 通过服务器端技术 您可以轻松地做到这一点
  • 如何在警报或确认框中显示粗体文本?

    如何获取粗体文本并更改警报或确认框中文本的颜色 var conFrm confirm Following List s already Sent n strong List Name strong ss replace n b Name b
  • 打开 Chrome 扩展程序时出现 Service Worker TypeError

    当我打开 WAVE Web 可访问性评估工具 扩展时 我的服务工作人员在 Chrome 中抛出此错误 未捕获 承诺中 类型错误 请求方案 chrome extension 是 不支持的 在 sw js 52 匿名 sw js 52 Prom
  • 如何将参数传递给backbone.js 中事件对象中绑定的函数

    我需要为 Backbone 中的事件对象中使用的函数提供参数 var DocumentRow Backbone View extend tagName li className document row events click icon
  • 如何使用 Angular/Ionic/JS 显示 Motion JPEG 二进制数据流?

    我正在为设备编写应用程序 此类设备将收到 POST 请求 并发回multipart x mixed replace二进制数据流 我必须在我的应用程序主页的一部分上显示此类流 我查了一下 这种情况的资源非常有限 到目前为止 我发现如果 Mot
  • Chrome 无法识别我对 javascript 文件的更改并加载旧代码?

    我在这里坐了将近一个小时来测试我正在构建的网站 由于我想查看代码中的新更改 因此我重新加载了代码 但它正在重新加载旧代码 我打开了 devetools 进行硬重新加载和清空缓存硬重新加载 它们都加载我的旧代码 我进入隐身模式 它做了同样的事
  • 从字符串渲染 React 组件

    我在字符串中有一些 React 代码 例如 const component function App return div test div 我希望能够从浏览器内渲染该组件 例如 import React Component from re
  • javascript 中的独立括号[重复]

    这个问题在这里已经有答案了 可能的重复 JavaScript 为什么使用匿名函数包装器 https stackoverflow com questions 1643321 javascript why the anonymous funct
  • 如何通过 JQuery Post 传递 Javascript 数组,以便可以通过 PHP $_POST 数组访问其所有内容?

    如何通过 JQuery Post 传递 Javascript 数组 以便可以通过 PHP POST 数组访问其所有内容 请展示一个可以实现此目的的代码示例 Thanks 如果你想传递一个 JavaScript 对象 哈希 即 PHP 中的关
  • JQuery 使用一个复选框以编程方式取消选中其他复选框

    我正在寻找一个脚本 其中一个复选框将取消选中另一个复选框 虽然有点复杂 因为所有数据都是以编程方式加载的 因此 如果未选中某个复选框 则过程将获取其 src 值 然后遍历其他输入并查找标题为 RQlevel 单击元素的 src 值的输入 并
  • 什么是 Service Worker 控制台? & 它在 Chrome 浏览器中的什么位置?

    我正在研究推送通知并遇到一个陌生的术语 service worker console 我已阅读并使用过该术语console log or web console在浏览器中 但我不熟悉这个术语service worker console 之后
  • 替换字符串 Jquery 中的所有出现位置

    我有一串数据 This is a template body for lt ltApproved gt gt lt ltSubmitted gt gt 我想用 gt 替换 gt 为了替换 lt 我编写了这段代码 var body txtHS

随机推荐

  • 在 Firebase-ios-swift 中创建和附加数组

    如何在firebase 3 0中创建数组并在数组中执行append和delete功能 这是我正在寻找的数据结构 1 UserIds 0 12345 1 678910 2 1112131415 2 UserProfile 0 12345 0
  • React - JSX 语法问题,以及如何迭代地图并在换行符上显示项目

    我是一个 React 菜鸟 正在制作 ToDo 列表样式食谱列表应用程序 https fcc recipebox surge sh 我有一个功能组件 Item js 我使用 JSX 和映射函数来迭代每个配方项并显示它们 我希望每个菜谱项目都
  • 使用PHP通过FTP递归扫描目录和子目录

    我正在尝试创建目录中所有文件 及其大小 的列表 包括子目录中的所有内容 这些文件位于远程服务器上 所以我的脚本通过 FTP 连接 然后使用以下命令运行递归函数ftp chdir浏览每个目录 如果有其他方法可以做到这一点 我愿意接受建议 fl
  • 停止pandoc自动添加id

    我在用Pandoc对Markdown的扩展 http pandoc org MANUAL html pandocs markdown来生成 HTML 以下降价 test specificId test2 test3 生成以下 html h1
  • 如何使用 Xerces 同时使用 Maven 从 XSD 1.1 生成源

    我有一个带有断言标签的 XSD 文件 我读到 Xerces 支持带有这些标签的 XML Schema 1 1 草案 如何在我的 Maven 构建中使用实际的 Xerces 版本 而不是标准 Java 实现 使用 Xerces 版本的一种旧方
  • config_cache_enabled 错误

    使用 Zend 框架 2 1 当我设定 config cache enabled gt true在我的里面application config php 它返回以下错误 Warning var export does not handle c
  • 使用 SessionBean EJBObject 和 EJBHome 接口创建 EJB

    我对创建 EJB 感到困惑 我在互联网上看到了许多 EJB 示例 也看到了使用 SessionBean EJBObject 和 EJBHome 接口开发 EJB 的示例项目 在其他一些示例中 EJB 是在没有这些接口的情况下创建的 并且仅使
  • 如何获取数组中每个数字的阶乘值?

    我试图使用此方法获取数组中每个项目的阶乘值 但这仅输出一个值 任何人都可以帮助我找出我做错的地方吗 function mathh arr fn for i 1 i lt sizeof arr i arr2 arr2 i fn arr i r
  • 如何在 Jackson 和 Gson 之间转换日期?

    在我们的 Spring 配置的 REST 服务器中 我们使用 Jackson 将对象转换为 Json 该对象包含几个 java util Date 对象 当我们尝试使用 Gson 的 fromJson 方法在 Android 设备上反序列化
  • 如何在CSS中捏住一行的中间

    我正在尝试制作一条看起来几乎在末端有衬线的线条 本质上 我想让它在最末端变宽 在中间变细 只需使用 css 这实际上被证明是一个相当大的挑战 任何帮助 将不胜感激 到目前为止 我已经能够了解我想要如何使用 after伪选择器 但顶部没有运气
  • 如何使用shoulda匹配器来测试多态关联?

    我正在使用带有rails的shoulda matchers 并创建一个名为 comments 的模型和另一个名为 post 的模型 评论是多态的 当我在这样的帖子中使用 shoulda 匹配器进行测试时 it should have man
  • 导入错误:没有名为“编码”的模块

    我最近重新安装了ubuntu并升级到16 04并且无法使用python python manage py runserver Could not find platform independent libraries
  • 将 Azure CDN 与共享访问签名结合使用

    我正在尝试合并 Azure 来存储应用程序的大部分文件 我想将这些文件上传到 azure 中的私有容器和私有 blob 并通过 Azure CDN 将这些上传内容复制到所有其他节点 仍然作为私有容器和 blob 然后 我希望我的应用程序向存
  • “from Six.moves import urllib”在 Python 中做什么?

    我在 Python 代码中发现了以下行 from six moves import urllib 同时 我可以找到urllib py任何地方 我发现有一个文件six py在包根目录中 它有class Module six moves url
  • 在 R 中查找观察值之间的时间差

    我正在尝试确定两次观察之间的时间差 数据由不同的个人分解 每个人都有自己唯一的 ID 我有一个数据集 它告诉我每次状态发生变化时他们的状态会更新什么 以及他们的状态何时发生变化 状态可以是两个值之一 并且它总是更改为它不是的值 在本例中 从
  • C# 中的可选数组参数[重复]

    这个问题在这里已经有答案了 可能的重复 在 C 中传递一个空数组作为可选参数的默认值 https stackoverflow com questions 3480382 passing an empty array as default v
  • 比特币客户端如何确定第一个连接的IP地址?

    据我所知 比特币是一种 p2p 协议P2P协议必须有一个专用的中央服务器 https stackoverflow com questions 310607 peer to peer methods of finding peers 但据说比
  • 如何完善这个FTP(shell)功能?

    我有大量使用以下函数的脚本 Copies files over using FTP Configurations set at the beggining of the script param 1 FTP Host 2 FTP User
  • 如何在 swiftui 中使用 .quickLookPreview 修饰符

    我正在尝试使用视图修饰符 quickLookPreview在 iOS 14 macOS 11 macCatalyst 14 中引入 但我收到此错误Value of type some View has no member quickLook
  • 在 Firefox 上使用 popState 平滑滚动和返回按钮 - 需要单击两次

    我正在尝试实现一个小代码 当我单击锚点时 并且锚点名称出现在动画之后 我可以使用它实现平滑滚动 并且如果我按下浏览器的后退按钮 我想返回到页面顶部并更新 URL 不带 anchor 名称 这是代码 function Smooth scrol