Vue中消息横向滚动时setInterval清不掉的问题及解决方法


Posted in Javascript onAugust 23, 2019

最近在做项目时,需要进行两个组件联动,一个轮询获取到消息,然后将其传递给另外一个组件进行横向滚动展示,结果滚动的速度越来越快。这里记录一下来提醒自己。消息滚动的代码在最下面,方便下次使用。

问题背景: 最近在做一个需求,组件A获取消息采用的是轮询,组件A获取到新的消息后,将组件A中的消息传递给另外一个组件B,当组件B接收到消息时就让消息在页面上滚动播放。

实现思路: 这个项目应用的框架为VUE,当组件A获取到新的消息之后,就触发中央事件总线,在组件B中进行事件监听,将其添加进入一个数组,当判断定时器没有运动时,就触发滚动的函数。消息滚动的函数是从消息数组中提取出第一条,然后利用定时器进行消息滚动,当消息滚动到边缘时清除定时器。

问题:消息在滚动的过程中,该开始还能够按照给定的速度进行滚动,可是当时间变长后就会出现消息滚动的速度越来越快的问题。

原因:当出现这个问题时,我第一个念头就是setInterval没有被清掉,因为当定时器没有清掉之后又再次调用定时器就会导致多个定时器同时执行,比如第一次是一个计时器,再点一下是就是两个定时器,这时候每次就是+2,所以速度不断提升。我看了一下我设置的滚动函数,里面当消息滚动到边缘时,就清除这个定时器,所以在滚动函数中没有问题。我又看了下中央事件总线的事件监听器,发现问题在这里。因为我在判断一个定时器是否被销毁时,直接判断其类型是 数字 还是 null,由于当定时器开始运行时,每一次返回的都是一个ID(数字),而不是一开始的对象,导致当一条消息开始滚动时,又接收到一条新的消息,然后就使得两个定时器同时运行,从而出现这个问题。

解决方式:当消息滚动到盒子边缘销毁定时器时,将其赋值为null,然后修改中央事件的事件监听,将其判断没有定时器的条件修改为null,然后满足条件的调用消息滚动函数。

横向滚动的代码:

<!DOCTYPE html>
  <html lang="en">
  <head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <style>
      * {
        margin: 0;
        padding: 0;
      }
      #title {
        position: relative;
        width: 10%;
        margin: 30px auto;
        line-height: 30px;
        height: 30px;
        border: 1px solid red;
        overflow: hidden;
      }
      #content {
        position: absolute;
        left: 0;
        line-height: 30px;
        display: inline-block;
      }
    </style>
  </head>
  <body>
    <div id="title">
      <span id="content">123</span>
    </div>
    <script>
      var wrapEle = document.getElementById('title');
      let contentEle = document.getElementById('content');
      let arr = [
        {news: '这是一条新闻'}
      ];
      let timer = null;
      move(wrapEle, contentEle);
      function move(wrap, item) {
        clearInterval(timer);
        if (!arr.length) { return false;}
        item.innerHTML = arr[0].news;
        arr.splice( 0, 1 );
        let allWidth = getCurrentStyle(wrap, 'width');
        let itemWidth = getCurrentStyle(item, 'width');
        item.style.left = allWidth + 'px';
        let speed = 2;
        let time = 50;
        timer = setInterval( () => {
          let itemPlace = getCurrentStyle(item, 'left');
          if (itemPlace < -itemWidth) {
            clearInterval(timer);
          }
          item.style.left = itemPlace - speed + 'px';
        }, time)
      }
      function getCurrentStyle (ele, attr) {
        return window.getComputedStyle ? parseInt(window.getComputedStyle(ele, null)[attr]) : parseInt(ele.currentStyle[attr] );
      }
    </script>
  </body>
  </html>

总结

以上所述是小编给大家介绍的Vue中消息横向滚动时setInterval清不掉的问题及解决方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Javascript 相关文章推荐
判断JS对象是否拥有某种属性的两种方式
Dec 02 Javascript
购物车选中得到价格实现示例
Jan 26 Javascript
jQuery如何防止这种冒泡事件发生
Feb 27 Javascript
JavaScript人脸识别技术及脸部识别JavaScript类库Tracking.js
Sep 14 Javascript
Javascript removeChild()删除节点及删除子节点的方法
Dec 27 Javascript
AngularJs 指令详解及示例代码
Sep 01 Javascript
基于bootstrap的选择框插件icheck
Dec 23 Javascript
详解vue-cli中的ESlint配置文件eslintrc.js
Sep 25 Javascript
详解React中合并单元格的正确写法
Jan 08 Javascript
vue 地图可视化 maptalks 篇实例代码详解
May 21 Javascript
mapboxgl区划标签避让不遮盖实现的代码详解
Jul 01 Javascript
js实现飞机大战游戏
Aug 26 Javascript
微信小程序 授权登录详解(附完整源码)
Aug 23 #Javascript
vue使用微信JS-SDK实现分享功能
Aug 23 #Javascript
VUE实现移动端列表筛选功能
Aug 23 #Javascript
简述ES6新增关键字let与var的区别
Aug 23 #Javascript
微信小程序后台持续定位功能使用详解
Aug 23 #Javascript
详解基于Vue/React项目的移动端适配方案
Aug 23 #Javascript
详解vue-video-player使用心得(兼容m3u8)
Aug 23 #Javascript
You might like
在IIS上安装PHP4.0正式版
2006/10/09 PHP
PHP在同一域名下两个不同的项目做独立登录机制详解
2017/09/22 PHP
Yii框架应用组件用法实例分析
2020/05/15 PHP
为Yahoo! UI Extensions Grid增加内置的可编辑器
2007/03/10 Javascript
jQuery 页面载入进度条实现代码
2009/02/08 Javascript
腾讯与新浪的通过IP地址获取当前地理位置(省份)的接口
2010/07/26 Javascript
基于jquery tab切换(防止页面刷新)
2012/05/23 Javascript
深入理解JavaScript编程中的同步与异步机制
2015/06/24 Javascript
jQuery zclip插件实现跨浏览器复制功能
2015/11/02 Javascript
基于jquery实现日历签到功能
2020/09/11 Javascript
纯JavaScript 实现flappy bird小游戏实例代码
2016/09/27 Javascript
webpack2.0配置postcss-loader的方法
2017/08/17 Javascript
浅谈vue路径优化之resolve
2017/10/13 Javascript
解决使用Vue.js显示数据的时,页面闪现原始代码的问题
2018/02/11 Javascript
node基于puppeteer模拟登录抓取页面的实现
2018/05/09 Javascript
如何利用ES6进行Promise封装总结
2019/02/11 Javascript
实现elementUI表单的全局验证的方法步骤
2019/04/29 Javascript
ElementUI Tag组件实现多标签生成的方法示例
2019/07/08 Javascript
js中console在一行内打印字符串和对象的方法
2019/09/10 Javascript
[01:04]DOTA2:伟大的Roshan雕塑震撼来临
2015/01/30 DOTA
django创建自定义模板处理器的实例详解
2017/08/14 Python
python使用sqlite3时游标使用方法
2018/03/13 Python
解决python中无法自动补全代码的问题
2018/12/04 Python
Python+PyQt5实现美剧爬虫可视工具的方法
2019/04/25 Python
python中的global关键字的使用方法
2019/08/20 Python
PyTorch预训练的实现
2019/09/18 Python
解决django FileFIELD的编码问题
2020/03/30 Python
捷克体育用品购物网站:D-sport
2017/12/28 全球购物
Dr. Martens马汀博士德国官网:马丁靴鼻祖
2019/12/26 全球购物
Lookfantastic澳大利亚官网:英国知名美妆购物网站
2021/01/07 全球购物
女儿十岁生日答谢词
2014/01/27 职场文书
阿德的梦教学反思
2014/02/06 职场文书
班级学习计划书
2014/04/27 职场文书
新闻发布会策划方案
2014/06/12 职场文书
2015毕业生自我评价范文
2015/03/02 职场文书
自主招生英文自荐信
2015/03/25 职场文书