关于取消默认事件

现今的 chrome 浏览器,为了实现丝滑顺畅地滑动,活动时间直接执行而不再检测默认事件,这使得无法用 e.preventDafult() 来阻止默认事件。

现在需要添加 {passive: false} 配置

$(document).addEventListener( 'scroll', fun, {passive: false} ) 把事件被动监听设置为 false 之后,就可以正常阻止默认事件了。


关于 scrollTop

为了手动地使页面平滑滚动到某个高度,需要使用 $.animate({scrollTop: val}) 。由于不同浏览器间的差异,绑定 scrollTop 的 DOM 元素是不一样的,比如

  • chrome 下最外层元素为 html ,活动事件需要绑定在这上面。

  • 而 edge 及移动端的 html 就没有高度,需要绑定在 body 节点上,才能实现滚动。

为了解决这个差异,我们需要把 animate 同时绑定在两个节点上。 $('html, body').animate()


关于获取位置

$().position() ———— 基于父元素,从自身的外边框为点。
$().offset() ———— 基于父元素,从自身内容为点。
$(window).height().width() ———— 获取窗口宽高。


记录一个底部上划继续加载的方法

因为使用的是监听 touchstar 和 touchend 方法,所以该方法只适用于移动端。

$("body").on("touchstart", getTouchS = e => {
  //记录页面当前滚动和开始Y坐标,以供比较
  startScroll = $(window).scrollTop()
  moveStartY = e.originalEvent.changedTouches[0].pageY;
});
$("body").on("touchend", getTouchE = e => {
  //这里判断是否有必要执行,没有必要则直接跳出
  if (needToDo?) return false
  //若有必要,则获取当前事件发生的状态值
  let endScroll = $(window).scrollTop(),
      ifBottom = $('body').outerHeight() - $(window).scrollTop() - $(window).height()
  //页面不再滚动 或者 leadblock位置超出范围
  if (startScroll == endScroll || ifBottom <= 0) {//滑动后没有滚动
    moveEndY = e.originalEvent.changedTouches[0].pageY,
    Y = moveEndY - moveStartY;
    if ( Y < -60 ) { //至少上滑60个单位
      //这里执行加载或之类的操作
      //*****
      //解绑事件
      $("body").off("touchstart", getTouchS)
      $("body").off("touchend", getTouchE)
    }
  }
});

主要的思路就是监听“触摸开始”和“触摸结束”两个事件,分别获取事件当前的触摸点坐标和文档滚动的值,进行对比判断“触摸是否有滑动”以及“文档是否有滚动(到底)”,来执行需要的方法。下面说说几个注意点:

  • 有必要的话,可以对事件监听添加阻止默认事件,需要在 on() 的第三个参数传入 false 。
  • 执行触摸结束监听时,优先判断是否需要执行,以节约性能。
  • 为了避免微信 iOS端底部导航栏的问题(显隐不定,出现时会减少视窗高度), $(window).height() 必须实时获取而不是用全局变量。
  • 同样为了节省性能,当执行完毕后使用 off() 对事件进行解绑,当需要传入函数名参数,所以绑定是不能使用匿名函数。

判定兼容后的阻止默认事件

var e=e||window.event;
e.stopPropagation();//阻止事件的传播(包括捕获也包括冒泡)
// 兼容处理
if (e.stopPropagation) {
    e.stopPropagation();
}else{
// IE浏览器
    e.cancelBubble=true;
}

作者:Primers
链接:https://www.jianshu.com/p/e8d68a9bba54
来源:简书

 
 

转载文章 -- 难搞的滚动事件(滚动默认,scrollTop)的更多相关文章

  1. Vue 爬坑之路(七)—— 监听滚动事件 实现动态锚点

    前几天做项目的时候,需要实现一个动态锚点的效果 如果是传统项目,这个效果就非常简单.但是放到 Vue 中,就有两大难题: 1. 在没有 jQuery 的 animate() 方法的情况下,如何实现平滑 ...

  2. taro 滚动事件

    taro 滚动事件 taro scroll bug ScrollView https://nervjs.github.io/taro/docs/components/viewContainer/scr ...

  3. js鼠标滑轮滚动事件绑定(兼容主流浏览器)

    /** Event handler for mouse wheel event. *鼠标滚动事件 */ var wheel = function(event) { var delta = 0; if ...

  4. 鼠标滚动事件兼容性 wheel、onwheel

    wheelEvent = "onwheel" in document.createElement("div") ? "wheel" : // ...

  5. JavaScript----分层导航 滚动事件

    分层导航 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3 ...

  6. js网页滚动条滚动事件实例分析

    本文实例讲述了js网页滚动条滚动事件用法.分享给大家供大家参考.具体分析如下: 在做js返回顶部的效果时,要监听网页滚动条滚动事件,这个事件就是:window.onscroll.当onscroll事件 ...

  7. JS鼠标滚动事件

    -----------------------------//鼠标滚动事件以下是JS临听鼠标滚动事件 并且还考虑到了各浏览器的兼容----------------------------------- ...

  8. Jquery-Mobile滚动事件

    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> < ...

  9. javascript滚动栏响应鼠标滑轮的实现上下滚动事件

    实现鼠标滚动滚轮事件: <script type="text/javascript"><pre name="code" class=" ...

随机推荐

  1. 组件接口(API)设计指南[2]-类接口(class interface)

    *返回文件夹阅读其它章节: http://blog.csdn.net/cuibo1123/article/details/39894477 类接口(class interface) 你能够參考MGTi ...

  2. 重构机房收费系统你要用的——异常处理和抛出异常(try catch finally)——(vb.net)

    你能保证你的程序不会出问题吗? 不能 当你的程序执行到某个地方发生了你不想要的结果.你是否想让它一错再错? 不想 你是否想让你的程序占着茅坑不拉屎? 不想 你是否想知道你的程序出错的原因? 想 个问题 ...

  3. [Pyhton]weakref 弱引用

    文档中的解释: https://docs.python.org/2/library/weakref.html wiki 中的解释: 在计算机程序设计中,弱引用.与强引用相对.是指不能确保其引用的对象不 ...

  4. [PHP]PDO调用存储过程

    1. 数据库中已创建存储过程user_logon_check, PHP调用示例如下, <?php $dsn = 'mssql:dbname=MyDbName;host=localhost'; $ ...

  5. 【bzoj3210】花神的浇花集会

    将(x,y)转化成(x+y,x-y)可以将切比雪夫距离转化成曼哈顿距离(自己推一推) A.B的切比雪夫距离就是A‘.B‘曼哈顿距离的一半. 那么可以将x.y分离处理,排序中位数即可. 注意如果最后选的 ...

  6. Spring Boot 整合Servlet

    冷知识,几乎用不到 在spring boot中使用Servlet有两种实现方法: 方法一: 正常创建servlet,然后只用注解@ServletComponentScan package clc.us ...

  7. 在docker里查看java进程

    先使用命令查看docker的运行进程 docker ps [root@localhost logs]# docker ps CONTAINER ID        IMAGE             ...

  8. HUST1017 Exact cover —— Dancing Links 精确覆盖 模板题

    题目链接:https://vjudge.net/problem/HUST-1017 1017 - Exact cover 时间限制:15秒 内存限制:128兆 自定评测 7673 次提交 3898 次 ...

  9. Python return语句用法分析

    return 语句 程序运行到所遇到的第一个return即返回(退出def块),不会再运行第二个return. 要返回两个数值,写成一行即可: def a(x,y): if x==y: return ...

  10. JavaScript模板引擎使用

    1. [代码]tmpl.js     // Simple JavaScript Templating// John Resig - http://ejohn.org/ - MIT Licensed(f ...