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 相关文章推荐
编写兼容IE和FireFox的脚本
May 18 Javascript
JavaScript操作XML 使用百度RSS作为新闻源示例
Feb 17 Javascript
节点的插入之append()和appendTo()的用法介绍
Jan 13 Javascript
关于编写性能高效的javascript事件的技术
Nov 28 Javascript
node.js路径处理方法以及绝对路径详解
Mar 04 Javascript
详解jQuery选择器
Dec 21 Javascript
AngularJS 使用ng-repeat报错 [ngRepeat:dupes]
Jan 19 Javascript
BACKBONE.JS 简单入门范例
Oct 17 Javascript
小程序hover-class点击态效果实现
Feb 26 Javascript
详解用async/await来处理异步
Aug 28 Javascript
详解如何在Vue项目中发送jsonp请求
Oct 25 Javascript
layui table 复选框跳页后再回来保持原来选中的状态示例
Oct 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
优化NFR之一 --MSSQL Hello Buffer Overflow
2006/10/09 PHP
&amp;lt;script defer&amp;gt; defer 是什么意思
2009/05/10 Javascript
基于JQuery.timer插件实现一个计时器
2010/04/25 Javascript
基于jQuery的自动完成插件
2011/02/03 Javascript
Javascript 面向对象(三)接口代码
2012/05/23 Javascript
jquery.blockUI.js上传滚动等待效果实现思路及代码
2013/03/18 Javascript
JS如何将UTC格式时间转本地格式
2013/09/04 Javascript
js函数在frame中的相互调用详解
2014/03/03 Javascript
jQuery添加删除DOM元素方法详解
2016/01/18 Javascript
JSON格式的时间/Date(2367828670431)/格式转为正常的年-月-日 格式的代码
2016/07/27 Javascript
解决Vue页面固定滚动位置的处理办法
2017/07/13 Javascript
webpack 单独打包指定JS文件的方法
2018/02/22 Javascript
node 使用 async 控制并发的方法
2018/05/07 Javascript
vue中进行微博分享的实例讲解
2019/10/14 Javascript
js实现表格数据搜索
2020/08/09 Javascript
Python中apply函数的用法实例教程
2014/07/31 Python
python通过正则查找微博@(at)用户的方法
2015/03/13 Python
全面了解Python的getattr(),setattr(),delattr(),hasattr()
2016/06/14 Python
python实现类之间的方法互相调用
2018/04/29 Python
Python实现爬虫抓取与读写、追加到excel文件操作示例
2018/06/27 Python
Python检查ping终端的方法
2019/01/26 Python
Python __slots__的使用方法
2020/11/15 Python
移动端rem布局的两种实现方法
2018/01/03 HTML / CSS
IE浏览器单独写CSS样式的几种方法
2014/10/14 HTML / CSS
Sunglasses Shop瑞典:欧洲领先的太阳镜网上商店
2018/04/22 全球购物
新西兰杂志订阅:isubscribe
2019/08/26 全球购物
别名指示符是什么
2012/10/08 面试题
Unix/Linux开发面试题
2016/08/16 面试题
计算机专业自我鉴定
2013/10/15 职场文书
高中毕业的自我鉴定
2013/12/09 职场文书
团队激励口号
2014/06/06 职场文书
专项法律服务方案
2014/06/11 职场文书
安全目标责任书
2014/07/22 职场文书
讲文明倡议书
2015/04/29 职场文书
钢琴师观后感
2015/06/12 职场文书
Python Pandas pandas.read_sql函数实例用法
2021/06/21 Python