jQuery 工具可使用鼠标滚轮滚动 - 滚动一个位置并停止

2023-11-22

我正在使用绑定/取消绑定进行鼠标滚轮滚动,基于此响应:

Jquery,取消绑定鼠标滚轮事件,然后在操作完成后重新绑定它?

我正在从 delta 向上挖掘事件树,以仅针对 X 鼠标滚轮值。一切都运转良好。我试图克服的问题:我想简单地向前/向后滚动一个面板,然后停止滚动。目前,我在移动后立即解除鼠标滚轮事件的绑定,这有效地停止了滚动...但解除鼠标滚轮事件的绑定也会劫持页面。我需要的是能够嗅探方向的第一个 deltaX 值,然后采取行动并停止监听。我需要自动滚动来寻找答案吗?绑定/解除绑定感觉很笨拙,但我一生都无法弄清楚如何在一个动作后踢出,同时仍然能够在该动作完成后滚动。这是我的鼠标滚轮功能:

function mouseHandler(event, delta) {
$('.homeScrollable').bind('mousewheel', mouseHandler);

var deltaX = event.originalEvent.wheelDeltaX;
//console.log(event.originalEvent.wheelDeltaX);

if(deltaX <= 0) {
    //move forward 1 screen and stop
    scrollapi.move(1);
    $('.homeScrollable').unbind('mousewheel', mouseHandler);
} else if(deltaX > 0) {
    //move backward 1 screen and stop
    scrollapi.move(-1);
    $('.homeScrollable').unbind('mousewheel', mouseHandler);
}   
event.preventDefault();

// Rebind mousewheel event:
$('.homeScrollable').bind('mousewheel', mouseHandler);     };

我还考虑过设置计时器,la:

jquery mousewheel插件:如何每次滚动仅触发一个功能

这看起来非常有希望,但行不通。这是这个人的插件页面:http://brandonaaron.net/code/mousewheel/docs

感谢检查出来。


由于 DOM 不提供任何方法来区分触发的第一个滚动事件和恰好属于同一滚动运动一部分的后续滚动事件,因此我们被迫考虑区分它们的间接方法。

如果快速滚动任何特定元素,则会按顺序多次触发滚动事件。使用以下代码,我们可以了解这种情况发生的确切频率:

$('#exampleDiv').bind('mousewheel', function () {
    console.log(new Date().getTime());
});

当您滚动该 div 时,您将获得如下所示的控制台输出:

// Using mouse wheelbar
251327626600149
251327626600215
251327626600265
251327626600282
251327626600332
251327626600365

// Using touchpad
251327626626207
251327626626225
251327626626261
251327626626276
251327626626312
251327626626345

看看这个输出,似乎mousescroll事件通常在 20 毫秒到 60 毫秒之间的某个时间间隔内触发。为了安全起见,我们将上限设为 100 毫秒。这是非常有用的,因为我们可以使用它来区分属于同一操作的滚动事件和可能由用户故意发起的不同滚动事件。

您可以从这里做的是创建一个全局可访问的“时间戳”变量,每次更新它mousescroll事件被触发,无论成功与否。像这样的东西:

var timeStamp = new Date().getTime();

$('#exampleDiv').bind('mousewheel', function (event) {
    var timeNow = new Date().getTime();

    // Need to prevent the default scrolling behavior
    event.preventDefault();

    // If the last mousescroll happened less that 100 ms ago, update
    // timeStamp and do nothing
    if (timeNow - timeStamp < 100) {
        timeStamp = timeNow;
        return;
    } else {
        timeStamp = timeNow;
        scrollToSomeOtherDiv();
    }
});

这实际上忽略了所有mousescroll在所有事件之前的初始事件之后触发的事件,但在用户暂停 100 毫秒后再次开始工作。

这可以解决您的问题,除非您的scrollToSomeOtherDiv()函数涉及某种耗时的动画。你当然可以创建一个全局布尔值isAnimating,并检查每次 a 是否为真mousescroll事件被触发(确保在动画结束后在回调中将其设置为 false)。

这确实可行,但可能会给用户带来不和谐的体验。即使在看到动画开始后,想要快速滚动两个面板的人也可能不会在滚动之间暂停。上面的代码将看到它们的所有mousescroll事件作为同一滚动运动的一部分并继续忽略它们!

在这种情况下,您可以简单地使用动画时间作为阈值。一旦动画开始,您就设置一个时间戳,然后忽略所有mousescroll那段时间发生的事件。我在这里写了一个例子:http://jsfiddle.net/Sg8JQ/

相关代码在这里:

var lastAnimation = 0;
var animationTime = 1000; // in ms
var quietPeriod = 500; // in ms, time after animation to ignore mousescroll

function scrollThis(event, delta, deltaX, deltaY) {
    var timeNow = new Date().getTime();

    // change this to deltaX/deltaY depending on which
    // scrolling dir you want to capture
    deltaOfInterest = deltaY;

    if (deltaOfInterest == 0) {
        // Uncomment if you want to use deltaX
        // event.preventDefault();
        return;
    }

    // Cancel scroll if currently animating or within quiet period
    if(timeNow - lastAnimation < quietPeriod + animationTime) {
        event.preventDefault();
        return;
    }

    if (deltaOfInterest < 0) {
        if ($('.active').next('div').length) {
            lastAnimation = timeNow;
            $('.active').removeClass('active').next('div').addClass('active');
            $('html,body').animate( {
                scrollTop: $('.active').offset().top }, animationTime);
        }
    } else {
        if ($('.active').prev('div').length) {
            lastAnimation = timeNow;
            $('.active').removeClass('active').prev('div').addClass('active');
            $('html,body').animate( {
                scrollTop: $('.active').offset().top }, animationTime);
        }
    }
}

// Note: mousewheel() is defined in the mousewheel plugin by Brandon Aaron
// You could do without it, but you'd need to adjust for firefox and webkit
// separately.
//
// You couldn't use $(document).scroll() because it doesn't allow you to
// preventDefault(), which I use here.
$(document).mousewheel(scrollThis);

我还包括了quietPeriod这是超出动画时间的时间,在此期间您要继续忽略mousescroll事件。如果您希望滚动在动画完成后立即“响应”,您可以将其设置为 0。

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

jQuery 工具可使用鼠标滚轮滚动 - 滚动一个位置并停止 的相关文章

  • 如何通过先前的选择填充下拉列表 Spring thymeleaf

    我需要根据之前的选择创建第二个下拉列表 基本上 用户需要选择放映 其他下拉列表必须显示所选放映的座位 我的控制器 RequestMapping movieDetail public String movieDetail PathParam
  • jquery .text() 和 unicode

    我想显示 开锁 字符 http www fileformat info info unicode char 1f513 index htm在我的 HTML 链接文本中 如果我直接这样做 它会正确显示 a x1f512 a 但我发现没有办法用
  • 如何在拖动另一个元素时获取鼠标光标下的元素?

    我用谷歌搜索并找到了几个答案 但它们都是关于单击或鼠标移动事件的 这些事件不适合我的问题 基本上 我允许用户从列表中拖动项目并将其放在另一个列表中的文件夹上 并且每当项目拖动到元素上时 我想突出显示元素 在文件夹列表中 监听文件夹列表上的
  • 取消选择单选选项

    我正在使用引导单选按钮 http getbootstrap com javascript buttons并希望允许取消选择无线电组 这可以使用额外的按钮来完成 Fiddle http jsfiddle net norlihazmeyGhaz
  • iphone / css - 单击时如何防止项目上出现黑色半透明覆盖

    我正在编写一个移动网站 在 iPhone 中 当您触摸 按住可点击项目时 图像顶部会出现明显的半透明黑色覆盖层 有人经历过这个吗 我该如何摆脱它 有没有办法用css 这是我的代码 childLink div class option div
  • Google Maps API - 按关键字(城市名称)定位/中心

    在我的网络应用程序中 我使用 gmap javascript API https developers google com maps documentation javascript https developers google com
  • 使用 javascript 或 jquery 水平滚动 div onclick

    过去两天我一直在寻找一个简单的 javascript 或 jquery 代码 我想使用 javascript 或 jquery 合并水平滚动 div 来显示我的网络作品集工作页面的图像和描述性文本 它的功能与此处所示的 glide oncl
  • 动态创建 jQuery 元素时是否会触发“ready”事件?

    我正在尝试用 jQuery 实现类似照片轮播的功能 这个轮播可以使用图像源数组填充图像 我发出一个 ajax 请求 返回带有此数据的 json 一旦填充 您可以调用几个方法 previous 和 next 来移动分别向后和向前旋转 问题是这
  • ckeditor 添加“keyup”事件

    如何将 keyup 事件附加到 CKEditor 我正在使用 jQuery 适配器 这是我当前使用的代码 ckeditor textarea ckeditor function editorInstance attaching keyup
  • 处理表单刷新的 jQuery 生日选择器

    我正在使用一个优秀的 jquery 插件为我的网络表单选择生日日期 演示在这里 http abecoffman com stuff birthdaypicker http abecoffman com stuff birthdaypicke
  • jQuery val 未定义?

    我有这个代码
  • 限制 jQuery 可拖动项目与同级元素重叠/碰撞

    我需要使用 jQuery UI 来限制可拖动对象的包含区域 并进行一些附加限制 我需要防止可拖动元素与同一容器内的其他元素重叠 我需要允许在 moveInHere 区域移动 但不允许在 butNotHere 区域移动 是否可以 div di
  • DatePicker 上的日期验证器在 IE7/IE8 中触发漏报

    我对包含两个 jQuery UI DatePickers 的表单进行了一些基本验证 日期的格式为 yy mm dd 有一个required and date对两个 DatePicker 进行验证 这些在 Chrome 和 FF 中按预期工作
  • 无法在使用 ajax 调用加载的 DOM 中聚焦输入字段

    我疯狂地试图弄清楚如何使这项工作发挥作用 代码大致如下 function onDropDownChanged updatePanel load myUrl id myDropDown option selected val onPanelL
  • 如何根据 Jquery mobile 中的事件名称更改日历中特定日期的背景图像?

    我正在使用它来创建活动日历Calendar https github com JWGmeligMeyling jqm calendar 我每个月都有一些定期活动 例如会议 聚会 提交 研讨会 我的想法是如何根据事件名称更改日期的背景图像以及
  • 使用外部复合 jQuery 模板

    受到这 2 篇博客文章的启发后 我想尝试一下 jQuery 模板 http encosia com 2010 11 10 composition with jquery templates why and how http encosia
  • jQuery Ajax 返回 404 错误,但响应正确

    我通过 jQuery AJAX 将一些数据发布到 PHP 脚本 一切都正确执行 但它返回 404 错误 在我的 Firebug 控制台中 PHP 脚本的响应是正确的 我不明白脚本如何响应 它仍然抛出 404 错误 jQuery 错误 回调方
  • 使用 jQuery 检测用户何时滚动到 div 底部

    我有一个 div 框 称为 Flux 里面有可变数量的内容 此 divbox 的溢出设置为自动 现在 我想做的是 当使用滚动到此 DIV 框的底部时 将更多内容加载到页面中 我知道如何执行此操作 加载内容 但我不知道如何检测用户何时滚动到
  • jqGrid 3.4 中的自定义数据工具提示

    我一直在使用优秀的 jqGrid 插件 它运行得很好 不过最近 我被要求为网格实现一些自定义工具提示 现在文档 http www secondpersonplural ca jqgriddocs index htm非常彻底 但它没有解决如何
  • 这种日期时间格式有简单的转换吗?

    我正在使用 jQuery 从 JSON feed 中检索数据 并且作为 feed 的一部分 我获得了 datetime 属性 例如 2009 07 01 07 30 09 我想将此信息放入 javascript Date 对象中以方便使用

随机推荐

  • 获取查询字符串值并将其显示在我的html页面中

    重定向到 home html 页面后 我可以看到我在上一页中给出的查询字符串值 Home html FirstName dd LastName ee smtButton Submit 我得到的结果是 firstname undefined
  • 使用 swift、iOS 恢复应用内购买

    我正在应用程序购买中实施恢复 我有一个按钮 其操作是 IBAction func restorePurchases send AnyObject SKPaymentQueue defaultQueue restoreCompletedTra
  • 使用 CodeIgniter 重定向

    谁能告诉我为什么我的重定向助手不能按我期望的方式工作 我正在尝试重定向到主控制器的索引方法 但这需要我www example com index provider1 当它应该路由到www example com provider1 这对任何
  • HTML5 日期验证

    我正在寻找对移动网站实施验证 其中我有两个输入字段 我希望第一个验证值不晚于今天的日期 第二个验证值不晚于提前一年的第一个值 E g 第一个值 26 11 2013 第二个值不能包含晚于 26 11 2014 的值 这可能吗 I like
  • HTML 拖动事件在 Firefox 中不会触发

    我有一个表格 需要在其上实现可拖动的标题列 我使用 Chrome 作为浏览器来实现它 一切正常 当我在 Firefox 17 0 1 中测试它时 我注意到drag事件不会触发 dragstart不过确实如此 我在下面的标记中简化了问题 在
  • 如何使用 Quartz 2D 向 UIImage 或 UIImageView 添加阴影?

    如何使用 Quartz 2D 向图像添加阴影UIImage or UIImageView 有代码示例吗 imageView layer shadowColor UIColor blackColor CGColor imageView lay
  • 如何使用 Java 找出默认文件打开程序?

    我需要找出 Windows 上给定文件的默认文件打开器 以便我可以自定义命令参数并使用默认打开器 查看器打开文件 我的真实使用场景是使用用户的默认媒体播放器打开多个多媒体文件 以便所有文件都将添加到用户的播放列表中 对于可以在同一实例上打开
  • 在 CQRS 中,创建实体时如何构建响应?

    如果使用 CQRS 并创建一个实体 并且其某些属性的值是其构造函数的一部分生成的 例如默认值 active的值status属性 或当前日期时间createdAt 如果您的命令处理程序无法返回值 如何将其包含在响应中 您需要在创建实体之前创建
  • 可以更改目录并在脚本完成后保留更改吗?

    在试图回答的过程中向其他用户提问 我发现了一些引起我好奇的事情 import os os chdir 就Python而言 将更改工作目录 所以如果我在 home username 然后我跑os chdir 任何后续代码都会像我一样工作 ho
  • GIT 的名字不明确?

    我正在尝试查看我的本地分支机构之一 名为 TEAM20 lab2 release 当我尝试执行此操作时 出现不明确的引用名称错误 git branch TEAM20 lab2 release warning refname TEAM20 l
  • pythontensorflow导入dll加载失败

    我安装了最新的 python 3 6 4 x64 版本 然后使用 pip3 安装仅用于 cpu 的tensorflow C gt pip3 install tensorflow 但是当我尝试在 python 中导入tensorflow时 它
  • 如果 main 方法完成执行,任何长时间运行的线程会发生什么?

    since main 在线程上运行 并且一旦main 完成后 主线程应该停止 因此 如果main 调用了一个长时间运行的线程 即使在main 已完成所有任务 自从main 返回后 其他线程会被终止吗 我觉得不是 但为什么 public st
  • 为什么 git 标签没有出现在任何分支上?

    我克隆了蚊子仓库有标签的v1 4 9 但是 标记的提交似乎不在分支上 怎么会发生这种事 作者实际上是否在自己的存储库上保留了一个分支 但只将标签从该分支推送到 GitHub 或者他只是对标签做出了承诺 我将标签制作为本地分支 git che
  • 设置以年为单位的时间跨度格式

    我有一个具有 2 个日期属性的类 FirstDay and LastDay LastDay可以为空 我想生成一个格式为的字符串 x year s y day s 如果总年份小于 1 我想省略年份部分 如果总天数小于 1 我想省略日期部分 如
  • 在 Java 上嵌入 XULRunner 应用程序

    我的目标是让 Limewire JAVA 和 Songbird XULRunner 一起运行 我认为最好的方法是在 JAVA swing 面板内运行 XUL 应用程序 songbird 还有别的办法吗 将 GUI 完全放在 XUL 中 然后
  • VBA 展望。尝试从电子邮件正文中提取特定数据并导出到 Excel

    我在这里找到了很多指南 这些指南使我达到了目前的水平 但我需要一些帮助来完成我的代码 我在这方面完全是新手 所以请耐心等待 我正在尝试在 Outlook 中使用 VBA 将 Outlook 某个文件夹中的电子邮件中的数据导出到 Excel
  • “无法解析的日期:1302828677828”尝试使用 Gson 反序列化从服务器收到的毫秒格式日期

    经过 4 个小时不停地尝试解决问题后 我决定在这里询问是否有人可以帮助我 问题是我的 Android 客户端在尝试反序列化从服务器接收的数据时抛出 无法解析 1302828677828 异常 我想知道是否可以使用 Gson 反序列化毫秒格式
  • 使用 django-allauth 进行多重注册、注册表单

    我正在开发的应用程序需要两种不同类型的用户单独登录 我们需要 客户 和 企业 所有者能够注册 对于 企业 所有者 我需要做的就是设置布尔值user is business to True 我用过ACCOUNT SIGNUP FORM CLA
  • 如何让vim在运行带有“!”的命令时使用与我的登录shell相同的环境?

    I use ls执行 bash 命令 但是在我配置了类似的东西之后source usr profile in profile文件 vim 也不会获取该文件 所以当我想执行在中声明的函数时usr profile 我必须跑 source usr
  • jQuery 工具可使用鼠标滚轮滚动 - 滚动一个位置并停止

    我正在使用绑定 取消绑定进行鼠标滚轮滚动 基于此响应 Jquery 取消绑定鼠标滚轮事件 然后在操作完成后重新绑定它 我正在从 delta 向上挖掘事件树 以仅针对 X 鼠标滚轮值 一切都运转良好 我试图克服的问题 我想简单地向前 向后滚动