iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >vue中引入mousewheel事件及兼容性处理方式的示例分析
  • 426
分享到

vue中引入mousewheel事件及兼容性处理方式的示例分析

2023-06-29 10:06:35 426人浏览 薄情痞子
摘要

小编给大家分享一下Vue中引入mousewheel事件及兼容性处理方式的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!引入mousewheel事件及兼容性处理项目实现过程中需要对一个已经有纵向滚动条的table表格

小编给大家分享一下Vue中引入mousewheel事件及兼容性处理方式的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!

引入mousewheel事件及兼容性处理

项目实现过程中需要对一个已经有纵向滚动条的table表格增加鼠标滚轮(mousewheel)事件,方便查看数据;其实现原理与我上一篇博客中的拖动事件类似,利用模拟出来的同一个滚动条来实现

滚动条设置的要点在于

滚动条与滚动槽的高度比例 应该等于 内容区(动态变化)和可视区的高度比例;滚动槽与可视区平齐,高度一样;滚动条的高度则根据内容的高度等比例计算;

各元素的定位采用绝对定位,其父元素采用相对定位,这样就能很好地设置样式;

布局与样式做好后,只需要在组件methods注册方法,在元素就位后调用该方法,在方法内部为表格绑定(mousewheel)事件;在这里需要考虑兼容性问题,firefox并不支持mousewheel事件,它对应的鼠标滚动事件为DOMMouseScroll事件,并且该事件仅能通过DOM2级(addEventListener)添加处理程序;并且判断鼠标滚动方向的方式也不一样,firefoxt通过detail属性判断,向前滚动该属性为-3,向后+3;其余浏览器通过wheelDelta属性,向前时为+120的倍数,向后为-120的倍数;

具体内容可参考《js高级程序设计》事件一章;添加函数如下:

    scroll(){        this.wrapDiv = document.getElementById("wrap");        this.contentDiv = document.getElementById("context-table");        this.contentDiv1 = document.getElementById("context-table1");        this.sliderWrap = document.getElementById("sliderWrap");        this.slider = document.getElementById("slider");        //设置比例        let scale =  this.wrapDiv.clientHeight /  this.contentDiv.clientHeight;        if (scale < 1) {          this.mouseFlag = true;          let h2 =  this.sliderWrap.clientHeight * scale;          h2 = (h2 < 50) ? 50 : h2;          this.slider.style.height = h2 + "px";          let y = 0;          let that = this;          //为firefox添加滚轮事件          if (document.addEventListener){            document.addEventListener('DOMMouseScroll',function (e) {                if(that.mouseFlag){                  //console.log('scroll');                  let event1 = window.event|| e;                  y = (event1.detail > 0) ? y + 8 : y - 8;                  y = (y < 0) ? 0 : y;                  let max = that.sliderWrap.clientHeight - that.slider.clientHeight;                  y = (y > max + 1) ? max + 1 : y;                  that.slider.style.top = y + "px";                  scale = that.wrapDiv.clientHeight / that.contentDiv.clientHeight;                  let y1 = -y / scale;                  that.contentDiv.style.top = y1 + "px";                  that.contentDiv1.style.top = y1 + "px";                }            },false)          }          this.wrapDiv.onmousewheel = function (e) {            if (scale < 1) {              let event1 = window.event || e;              y = (event1.wheelDelta < 0) ? y + 8 : y - 8;              y = (y < 0) ? 0 : y;              let max =  that.sliderWrap.clientHeight -  that.slider.clientHeight;              //console.log(scale, y, sliderWrap.clientHeight, slider.clientHeight);              y = (y > max + 1) ? max + 1 : y;              that.slider.style.top = y + "px";              scale =  that.wrapDiv.clientHeight /  that.contentDiv.clientHeight;              let y1 = -y / scale;              that.contentDiv.style.top = y1 + "px";              that.contentDiv1.style.top = y1 + "px";            }          }        }        else{          this.wrapDiv.onmousewheel =null;          if(document.addEventListener){             this.mouseFlag = false;          }          this.sliderWrap.style.visibility = 'hidden';          let height = this.contentDiv.clientHeight;          tableRight.style.height  = height+72+'px';          this.wrapDiv.style.height = height+2+'px';        }      },

该函数在给firefox绑定的事件解绑时遇到了问题,由于removeEventListener()需要通过句柄来解绑,而addEventListener()通过句柄添加处理函数会导致event参数无法传递的问题;即使在需要解绑时给document绑定空的处理函数也无法覆盖前一个绑定函数;最后只好添加一个标志,在需要解绑函数时改变标志的值;在绑定函数中通过判断该标志的值来确定是否要做操作;

通过上述方式即可很好地实现鼠标滚动事件的效果,并不会有兼容性的问题出现。

注:若仅仅是为表格绑定单一的滚动事件,则可以不显示滚动条,甚至不设置滚动条;滚动条的作用仅仅是用来指示内容区滚动的位置,以及配合拖动事件使用; 

关于scroll和mousewheel事件的问题

需要注意的点

火狐的鼠标滚轮事件是DOMMouseScroll

事件参数兼容:e=window.event||e;(下面省略)

preventDefault()函数取消的是默认事件,不会把我们自己添加的事件处理删除

实验开始

在下面验证例子的基础上实验,实验之间代码没有干涉:

1.原样输出

在元素内无论是手动拉动滚动条还是滚动鼠标滚轮,'d'都是无法出现的。而当元素滚动到达顶部或底部的时候,输出的是就有'd'了,但是这个时候并没有输出'b',说明scroll事件本来就没有发生冒泡。而document的scroll事件是由于其他因素触发的。

2.在element的mousewheel事件处理里把冒泡取消

e.stopPropagation();

这时候在元素内滚动鼠标滚轮,'c'始终是无法出现的,说明我们阻止mousewheel事件的冒泡成功了。但是在滚动条到达底部或顶部时,虽然'c'依旧没有出现,但是'd'却出现了,说明这个时候的document的scroll事件是靠element的mousewheel来触发的。

到这里就出现一个问题:element的mousewheel事件在默认处理里对这一情形进行了处理吗?

3.在element的mousewheel事件处理里取消默认处理

e.preventDefault();

这时候在元素内滚动鼠标,只会有'a'、'c'会出现,页面也不会滚动。说明鼠标滚轮滚动element页面的效果是由element的mousewheel默认事件处理来的。这个时候留意实验1中滚轮滚动一下'b'的输出数量,大概就能猜到默认处理的过程。

4.在element的mousewheel里添加一个自己的页面滚动(与默认处理的滚动方向相反)

element.scrollTop+=e.wheelDelta>0?30:-30;//手动添加的页面滚动

这个时候在元素内滚动鼠标,你会发现即使滚动到顶部或底部,元素外的页面并不会滚动,且并没有输出'd',也就是document的scroll事件没有触发。不好的一点是你在滚动到底部或顶部时,继续滚动鼠标的话,元素内还是会滚动,只不过是先下再上(或先上再下)地波动一下。

5.在element的mousewheel里添加一个自己的页面滚动(与默认处理的滚动方向相同)

element.scrollTop+=e.wheelDelta<0?30:-30;//手动添加的页面滚动

这个时候在元素内滚动鼠标,你会发现即使滚动到顶部或底部,元素外的页面跟着滚动,且输出'd',也就是document的scroll事件触发了。

这里需要注意到一点:元素的scrollTop属性是无法无限增加和减少的,到了滚动的顶部或底部后只能反向变化(可以自行输出测试)。

6.在实验5的基础上,将滚动的距离调整到很大

element.scrollTop+=e.wheelDelta<0?300:-300;(值要大等于滚动行程)

认真观察输出的'b'的个数,和实验1的对比,你会发现这次只有1个'b',而且还输出了'd',而且'd'的数量还不少。经过一些其他的实验,得到:默认事件处理里的判断大概如下:

(function scroll(element){    for(var i=0;i<12;i++){        var temp=element.scrollTop;        element.scrollTop+=e.wheelDelta<0?10:-10; //滚动算法肯定不是这个,这里只是简单演示        if(temp!= element.scrollTop){            //滚动‘消息树'的下一个元素(和冒泡是一个列表)            var newEle=....//消息树怎么获取我不懂            scroll(newEle);            return;        }    }})();

验证例子:

       addEventListener(element,'mousewheel',function(e){            console.log('a');        });        addEventListener(element,'scroll',function(e){            console.log('b');        });        addEventListener(document.documentElement,'mousewheel',function(e){            console.log('c');        });        addEventListener(document,'scroll',function(e){            console.log('d');        });

结论:通过上面的6个实验,很容易发现在元素的mousewheel的默认处理事件里对scrollTop属性进行变化和判断,如果没有发生变化就对外部元素进行滚动一下(具体滚动算法不懂,滚动距离和鼠标滚一下是一样的),以此类推,如果下一个元素到边界了,就再下一个。而这个过程和冒泡是没有关系的,只是当前元素的mousewheel默认事件处理进行的。

应用:因此为了实现元素滚动到底时继续滚动却不会使外部元素滚动,我们可以直接取消它的默认处理,然后给一个自己的滚动函数就可以了。至于怎么滚就看自己给什么函数了,而冒泡取不取消也看自己,上面的默认处理在冒泡和捕获阶段是不进行的。

例子如下:

       addEventListener(element,'mousewheel',function(e){            console.log('a');            e.preventDefault();            // e.stopPropagation();            ulObj.scrollTop+=e.wheelDelta<0?20:-20;        });        addEventListener(element,'scroll',function(e){            console.log('b');        });        addEventListener(document.documentElement,'mousewheel',function(e){            console.log('c');        });        addEventListener(document,'scroll',function(e){            console.log('d');        });

看完了这篇文章,相信你对“vue中引入mousewheel事件及兼容性处理方式的示例分析”有了一定的了解,如果想了解更多相关知识,欢迎关注编程网精选频道,感谢各位的阅读!

--结束END--

本文标题: vue中引入mousewheel事件及兼容性处理方式的示例分析

本文链接: https://www.lsjlt.com/news/324216.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • vue中引入mousewheel事件及兼容性处理方式的示例分析
    小编给大家分享一下vue中引入mousewheel事件及兼容性处理方式的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!引入mousewheel事件及兼容性处理项目实现过程中需要对一个已经有纵向滚动条的table表格...
    99+
    2023-06-29
  • vue中引入mousewheel事件及兼容性处理方式
    目录引入mousewheel事件及兼容性处理滚动条设置的要点在于关于scroll和mousewheel事件的问题需要注意的点实验开始引入mousewheel事件及兼容性处理 项目实现...
    99+
    2024-04-02
  • bootstrap和IE8兼容性处理的示例分析
    这篇文章主要介绍了bootstrap和IE8兼容性处理的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。bootstrap IE8 兼...
    99+
    2024-04-02
  • HTML5中进度条progress元素及兼容性处理的示例分析
    HTML5中进度条progress元素及兼容性处理的示例分析,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。一、progress元素基本了解1....
    99+
    2024-04-02
  • js中DOM2兼容处理this的示例分析
    这篇文章主要介绍js中DOM2兼容处理this的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!DOM2级存在的兼容问题,这里先说一下this的问题。 function&nbs...
    99+
    2024-04-02
  • Vue+iview+webpack中ie浏览器兼容处理的示例分析
    这篇文章主要介绍Vue+iview+webpack中ie浏览器兼容处理的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!环境介绍:vue: ^2.5.2iview: ^3.1....
    99+
    2024-04-02
  • Vue中后台管理类项目兼容IE9+的示例分析
    小编给大家分享一下Vue中后台管理类项目兼容IE9+的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!目前后台管理系统前端...
    99+
    2024-04-02
  • vue-cli axios请求方式及跨域处理的示例分析
    这篇文章给大家分享的是有关vue-cli axios请求方式及跨域处理的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。vue-cli axios请求方式以及跨域处理安装a...
    99+
    2024-04-02
  • firefox中event事件处理的示例分析
    这篇文章给大家分享的是有关firefox中event事件处理的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。在用angularJs实现一个功能,点击后获取event的x,...
    99+
    2024-04-02
  • Netty分布式客户端处理接入事件handle的示例分析
    这篇文章主要介绍了Netty分布式客户端处理接入事件handle的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。处理接入事件创建handle回到上一章NioEvent...
    99+
    2023-06-29
  • vue中事件机制原理的示例分析
    这篇文章主要介绍了vue中事件机制原理的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。常见的事件机制demo都会包含在这段代码中:&...
    99+
    2024-04-02
  • Base64图片编码解析及在各种浏览器兼容性处理的示例分析
    小编给大家分享一下Base64图片编码解析及在各种浏览器兼容性处理的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!IE浏...
    99+
    2024-04-02
  • Vue中click事件防抖和节流处理的示例分析
    小编给大家分享一下Vue中click事件防抖和节流处理的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!函数防抖定义:多次...
    99+
    2024-04-02
  • Mysql事务及数据一致性处理的示例分析
    这篇文章主要介绍Mysql事务及数据一致性处理的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!在MySQL的InnoDB中,预设的Tansaction isolation l...
    99+
    2024-04-02
  • Vue-cli单文件组件引入less,sass,css样式的示例分析
    这篇文章主要介绍了Vue-cli单文件组件引入less,sass,css样式的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。vue-...
    99+
    2024-04-02
  • mysql事务select for update及数据一致性处理的示例分析
    小编给大家分享一下mysql事务select for update及数据一致性处理的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我...
    99+
    2024-04-02
  • Netty分布式编码器及写数据事件处理使用场景的示例分析
    这篇文章主要介绍Netty分布式编码器及写数据事件处理使用场景的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!编码器第一节: writeAndFlush的事件传播我们之前在学习pipeline的时候...
    99+
    2023-06-29
  • H5中APP监听返回事件处理的示例分析
    这篇文章将为大家详细讲解有关H5中APP监听返回事件处理的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。在使用MUI框架的时候,我们经常会用到一个头部带有.mui...
    99+
    2024-04-02
  • Mysql事务和数据中一致性处理的示例分析
    这篇文章主要介绍了Mysql事务和数据中一致性处理的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。在工作中,我们经常会遇到这样的问题...
    99+
    2024-04-02
  • Spring注解@Value及属性加载配置文件方式的示例分析
    这篇文章主要介绍了Spring注解@Value及属性加载配置文件方式的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。Spring中使用@Value注解给bean加载属...
    99+
    2023-06-20
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作