jquery scrollTop animate 完成后滚动触发

2024-02-15

为什么另一个滚动事件被调用after a scrollTop动画激发其complete打回来?

单击处理程序:

var lock = false;

$('#id').click(function(event) {
    var pos;
    if (lock) {
        return;
    }
    lock = true;
    pos = 150;

    console.log("jump start");

    $(jQuery.browser.webkit ? "body": "html").animate({ scrollTop: pos }, 150, function () {
        lock = false;
        console.log("jump end");
    });
});

滚动处理程序:

$(window).scroll(function (e) {
    console.log("scrolling");

    if (!lock){
        alert('1');
    }
});

Log:

jump start
scrolling
jump end
scrolling

jsfiddle 上的演示 http://jsfiddle.net/47gLg/


背景

jQuery的scrollTop()使用scrollTo(),这是一个即发即忘事件。没有滚动停止事件。滚动事件发生在scrollTo 的带外。 scrollTo 表示“开始滚动”,滚动事件表示“滚动(某个位置)”。 scrollTo 只是启动滚动的开始,它不保证返回时滚动完成。因此,jQuery 动画在最终滚动之前完成(甚至可能有多个滚动备份)。另一种方法是 jQuery 等待滚动的位置达到它所请求的位置(根据我的解决方案),但它不会这样做

如果有一个规范可以用来描述这一点,那就太好了,但它只是没有规范的 0 级 dom 元素之一,see here https://developer.mozilla.org/en-US/docs/Web/API/Window.scrollTo。我认为它的工作方式是有意义的,这就是为什么所有浏览器似乎都以这种方式实现它。

为什么会发生这种情况

动画最后滚动时发生以下情况:

  1. jquery: '窗口请滚动最后一点'
  2. 窗口:“我从 jquery 收到了这条滚动消息,我现在就开始滚动”
  3. jquery: 'woohoo 我完成了动画,我会完成'
  4. 你的代码:lock = false;console.log("jump end");
  5. 窗口:“我已经滚动”调用滚动事件处理程序。
  6. 你的代码:$(window).scroll(function (e) {“为什么会发生这种事?”

正如您所看到的,jquery 在完成动画之前不会等待动画的最后滚动步骤完成(继续步骤 4)。部分原因是因为没有滚动停止事件,部分原因是 jquery 不会等待滚动位置到达所请求的位置。我们可以检测何时到达目的地位置,如下所述。

解决方案

滚动完成时没有停止事件。See here https://stackoverflow.com/questions/4620906/how-do-i-know-when-ive-stopped-scrolling-javascript。没有停止事件是有道理的,因为用户可以在任何时候再次开始滚动,因此滚动不会真正停止——用户可能只是暂停了几分之一秒。

用户滚动:对于用户滚动,正常的方法是等待一段时间以查看滚动是否完成,如引用问题的答案中所述(请记住用户可以再次开始滚动)。

滚动顶部:但是,由于我们知道要滚动到的位置,因此我们可以做得更好。

See 这把小提琴。 http://jsfiddle.net/47gLg/6/

关键在于,既然我们知道要滚动到哪里,我们就可以存储该位置。当我们到达那个位置时,我们知道我们已经完成了。

现在的输出是:

jump start
scroll animation
jump end

代码是(请注意,这是基于您的小提琴而不是编辑问题中的代码):

var scrollingTo = 0;
$('#id').click(function(event) {    
    if (scrollingTo) {
        return;
    }        
    console.log("jump start");
    scrollingTo = 150;
    $(jQuery.browser.webkit ? "body": "html").animate({ scrollTop: scrollingTo }, 150, function () {                
    });
});

function handleScroll()
{    
    if( scrollingTo !== 0  && $(window).scrollTop() == scrollingTo)
    {
        scrollingTo = 0;
        console.log("jump end");    
    }
}

$(window).scroll(function (e) {    
    if (!scrollingTo){
        console.log('user scroll');
    } else {
        console.log("scroll animation");
    }
    handleScroll();
});
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

jquery scrollTop animate 完成后滚动触发 的相关文章

  • 如何共享 Swagger 文档

    我最近开始使用 Swagger 来编写文档 但有一些事情我仍然不清楚 我创建了 YAML 文档 现在我希望能够与团队的其他成员共享 pdf 或 HTML Javascript 页面中的文档 我无法使用 SwaggerHub 因为它们没有私有
  • 如何清除画布元素中的多边形区域?

    我使用过clearRect函数 但没有看到多边形的等效函数 我天真地尝试过 ctx fillStyle transparent ctx beginPath ctx moveTo 0 0 ctx lineTo 100 50 ctx lineT
  • 克隆元素对应表单中所有元素的事件

    我成功克隆了表行 其中包含从数据库检索的值 不过我对它没有什么问题 我对所有元素使用了类 因为克隆会重复 ID 不会出现问题 因为它无法唯一地定位每个元素 使每个元素 行在这里唯一的方法是什么 功能如何工作 当第一次选择框时 所选 ID 的
  • Karma + JSPM + Typescript - 未找到“.ts.js”

    主要只是想让 Karma JSPM 在加载 ts 文件时发挥良好作用 但绝对没有运气 我看到一个讨论库 https github com Larchy karma jspm typescript coverage tree master一个
  • 异步 JS 加载到 head 中

    我需要将脚本异步加载到页面上 我正在使用createElement方法在头部动态插入脚本标签 发生的事情是首先加载页面源 完成后 头部中包含的所有元素都会并行加载 一旦全部加载完毕 我动态添加的脚本就会加载 这在逻辑上是有道理的 但我正在寻
  • 根据用户的时间设置问候语(早上好,下午好......)

    任何人都可以推断如何根据用户的时间设置实现基本的 晚上好 或 早上好 也许 PHP 会获取服务器时间 但我希望用基于时间的适当问候语来问候网站访问者 并考虑到他们一天中的时间 E G 早上好 晚上好 下午好 基于它 getHours 日期对
  • 名称属性的 CSS 选择器?

    这可能是一个愚蠢的问题 但是属性的 CSS 选择器是什么 a 那是 名字 document body innerHTML myString anchor HTML String 这段 JavaScript 创建了一个 a 带有名称的元素 H
  • 为什么 html 中的 AngularJS 错误没有显示在控制台中?

    Here s a fiddle http jsfiddle net 6y7odxmj 3 用于说明 当 ng click 指令 例如 调用未在控制器的 scope 或其父级 上定义的函数时 它会默默地失败 当我尝试调试网页时 这种行为令人抓
  • Javascript 函数,我如何开始理解它们?

    我完全理解 为了学习 javascript 我需要知道函数是如何工作的 我了解传递参数的基础知识 然后使用值调用函数以将某些内容添加到一起 等等 我读过无数关于函数的文章 例如以及书籍等 但我只是不明白它们是如何使用的以及何时应该使用它们等
  • 验证动态添加的输入字段

    我用过this http docs jquery com Plugins Validation以下表单的 jquery 验证插件
  • HTTP请求的内容长度>正文大小

    我正在管理一个网站 该网站过去几个月在使用 MVC 3 0 ASP net 构建的 IIS 7 5 上运行良好 当我们的 AJAX POST 请求 通过 jQuery 触发 因发布的 JSON 被截断而失败时 我们时不时地会遇到一个问题 到
  • 包含括号的变量会导致问题[重复]

    这个问题在这里已经有答案了 简单的事情 当单击按钮并将其写入文本字段时 我读取选择框的值 选择框
  • 交换两个文本框的值

    我有两个文本框值 var pickup txt pickup var destination txt destination 我想交换这两个值 如下所示 pickup val destination val destination val
  • 如何使用 Ajax 在 Flask 中发布按钮值而不刷新页面?

    我有一个问题 当我单击 Flask 应用程序中的按钮时 我想避免重新加载 我知道有 Ajax 解决方案 但我想知道如何将我的按钮链接到 ajax 函数以发布按钮值并运行链接到其值的 python 函数 这是我的 html 按钮 div di
  • Electron 应用程序中的 NEDB 持久化

    我正在尝试从电子应用程序连接到 nedb CRUD 操作效果很好 但我没有看到 db 文件 D my db 检查隐藏文件 文件存在于某个地方 因为即使在机器重新启动后它也会保留数据 我怀疑电子威胁着我的相对路径 但我可以在任何地方找到它 v
  • 如何使用 jQuery 检测浏览器是否关闭

    我需要使用 jQuery 检测浏览器是否被关闭 如果是这样 则执行一个事件 我的网站上有一个聊天功能 很像 Facebook 可以让用户在导航到网站结构中的其他页面时保持登录状态 但如果他们单击 则需要将他们从聊天中注销 这样他们就不会在线
  • 跨浏览器相当于explicitOriginalTarget事件参数

    有谁知道跨浏览器等价于explicitOriginalTarget事件参数 该参数是 Mozilla 特定的 它为我提供了导致模糊的元素 假设我的页面上有一个文本输入和一个链接 文本输入具有焦点 如果我点击链接 文本输入的模糊事件会通过ex
  • 如何在输入时格式化 contenteditable div?

    我正在尝试编写一个函数 允许 contenteditable div 在用户输入 div 时执行一些自动格式化 到目前为止我只能让它在 IE 中运行 有人可以帮助我吗 function formatOnKeyUp if window get
  • 通过 Ajax 加载内容

    好的 我对 ajax 和从外部加载内容还很陌生 如果您能深入了解我的问题 我将不胜感激 我目前有一个空的隐藏 div 单击链接后应在其中加载 ajax 内容 div div 我目前有一个链接列表 它们都具有相同的类 我希望在单击时 空白 d
  • Fancybox修改。如何修改 fancybox 以停止在每个画廊的最后一项? (画廊 1 画廊 2 等)[重复]

    这个问题在这里已经有答案了 我正在为我的照片库使用 fancybox 插件 我有多个包含更多项目 照片 的画廊 我想知道如何在点击每个画廊的最后一个项目时停止幻灯片放映 我的 fancybox js 没有被修改 谢谢 您需要添加该选项loo

随机推荐

  • 使用SyncAdapters时登录两次

    我正在使用创建一个新的 Android 应用程序SyncAdapter处理数据库同步 我已准备就绪 应用程序工作正常 但我注意到我登录了两次 首次登录发生在AuthenticatorActivity类 它扩展了AccountAuthenti
  • Android 无法在设备上安装 HelloWorld.apk (null) 错误

    我是安卓新手 当我在 Eclipse 中运行 Android 应用程序时 我在控制台中收到以下消息 2011 03 08 12 57 35 HelloWorld 2011 03 08 12 57 35 HelloWorld Android
  • WIX - 如何使用删除文件

    我们有多个配置文件 根据所选的环境 将复制正确的文件 并删除其余文件 我在用RemoveFile但这不会删除任何内容 或者可能是我没有正确使用它 有人可以举个删除的例子吗 config from INSTALLDIR 在安装过程中 复制所有
  • 避免 p:treeTable 的节点在更新后崩溃

    我有一个p treeTable以一种形式和一种p dialog以另一种形式从哪里p dialog我将数据添加到p treeTable 提交时h commandButton我添加更新的对话框p treeTable为了看到添加的节点 问题是用户
  • 从视频中获取多个缩略图

    我在用着MediaMetadataRetriever检索视频中特定时间的缩略图 这就是我实现这一目标的方法 MediaMetadataRetriever metadataRetriever new MediaMetadataRetrieve
  • 为什么我的所有位图都上采样 200%?

    我的应用程序 1 遇到严重的内存问题 为了调查这一点 我在不同状态下对我的应用程序进行了堆转储 我发现一些位图占用了大量内存 我编写了一个小工具 2 将字节数组解码为 Windows 位图文件 bmp 这样我就可以see位图并将它们与我的文
  • Android Studio 显示警告:此处不允许元素合并

    我基于 LinearLayout 创建自定义视图 类扩展了 LinearLayout 类 在布局中我有
  • 如何获取与 Linux 桌面中的文件关联的图标、MIME 类型和应用程序?

    在 Linux 桌面上使用 C 获取与任意文件 文件路径 关联 的图标 文档描述和应用程序的最佳方法是什么 我想使用最 规范 的方式在 KDE 和 gnome 上查找图标 mime 类型 文件类型描述和相关应用程序 并且我想避免任何 炮击
  • 自动从 Woocommerce 谢谢重定向到传递变量的外部链接

    在 Woocommerce 中 下订单后 我想在 5 秒后自动将客户从感谢页面重定向到外部链接 并传递一些变量作为order id 以及order ammount 那么 如何在 5 秒后自动将客户从 Woocommerce 谢谢重定向到传递
  • 用于 ASP.NET 的自定义 Javascript Ajax

    我已经编写了一些基本的 Javascript 函数 并且想了解如何使用此 JS 代码在 C 4 0 ASP net 项目中启用异步回发 例如 我有一个脚本 单击时会增加数字 再次单击时 数字会减少 我基本上从数据库加载号码 然后隐藏一个 s
  • 如何从另一个类访问共享首选项布尔值

    我创建了一个包含两个按钮的单选组 我可以选择一个并保存它 它工作正常 关闭应用程序后仍然存储 我想做的是使用另一个类中单选按钮的值 这是我的设置类 其中包含共享首选项代码 public class Settings extends Acti
  • C# - 读取字节,它们是什么以及发生了什么。我期望二进制值,而不是十进制数

    我已经成为一名程序员几年了 但我从来没有had了解涉及字节的低级操作 然而它让我感兴趣 并且我想了解更多有关使用字节的信息 在下面的代码中 我正在读取一个仅包含 嗨 那里 一词的文本文件 FileStream fileStream new
  • ASP .net 当前物理位置

    您好 我正在开发 ASP net Web 应用程序 我需要找到网站的当前位置 物理位置 或包含程序集的 bin 目录 我尝试使用 Directory GetCurrentDirectory 并返回 ASP net 临时目录 我真的不喜欢在我
  • 将 JSON 数据发布到 .asmx Web 服务

    我正在尝试将一些简单的参数发布到 asmx Web 服务 我收到以下错误 请求格式无效 application json 字符集 utf 8 我真正需要的是能够传递一个复杂的对象 但我无法通过使用 json 内容类型发出 POST 请求 这
  • UIDocumentInteractionController 日历访问

    我有一个 ics 日历 文件 我用UIDocumentInteractionController using presentOptionsMenuFromRect 运行时 打开方式 菜单看起来像this https i stack imgu
  • twig 扩展中的 Symfony 依赖注入

    好的 我试图创建依赖于其他服务的树枝扩展 安全 上下文 并遇到了一些麻烦 所以 这是我的服务声明 acme twig user extension class Acme BaseBundle Twig UserExtension argum
  • 在 Groovy 类中导入 groovyx.net.http.RESTClient

    我尝试在我的 groovy 类中导入 groovyx net http RESTClient 我的常规课程是这样的 void getREST def r new RESTClient url def response r get path
  • 限制文件下载

    我目前正在为客户创建一个网站 该网站基本上涉及销售各种文件 这显然是一件非常常见的事情 这让我觉得自己很愚蠢 因为我没有想到一种方法来做到这一点 购买完成后 客户应该会被带到包含下载链接的页面 并收到包含下载链接的电子邮件和包含将为他们创建
  • 无法绑定属性

    我已经将Spring Boot从版本1 5 6更新到2 0 0 并且开始出现很多问题 一是题目中给出的问题 我有一个带有属性的类 Data ConfigurationProperties eclipseLink public class E
  • jquery scrollTop animate 完成后滚动触发

    为什么另一个滚动事件被调用after a scrollTop动画激发其complete打回来 单击处理程序 var lock false id click function event var pos if lock return lock