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 相关文章推荐
Javascript学习笔记之 函数篇(一) : 函数声明和函数表达式
Jun 24 Javascript
JS中如何判断传过来的JSON数据中是否存在某字段
Aug 18 Javascript
JavaScript搜索字符串并将搜索结果返回到字符串的方法
Apr 06 Javascript
JavaScript中利用Array和Object实现Map的方法
Jul 27 Javascript
javascript动态获取登录时间和在线时长
Feb 25 Javascript
JavaScipt选取文档元素的方法(推荐)
Aug 05 Javascript
微信小程序 欢迎界面开发的实例详解
Nov 30 Javascript
BootStrap便签页的简单应用
Jan 06 Javascript
微信小程序 合法域名校验出错详解及解决办法
Mar 09 Javascript
js构造函数创建对象是否加new问题
Jan 22 Javascript
详解vue中移动端自适应方案
May 05 Javascript
react实现复选框全选和反选组件效果
Aug 25 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
PHP三元运算符的结合性介绍
2012/01/10 PHP
cakephp打印sql语句的方法
2015/02/13 PHP
详解php设置session(过期、失效、有效期)
2015/11/12 PHP
Laravel5.5新特性之友好报错以及展示详解
2017/08/13 PHP
PHPCrawl爬虫库实现抓取酷狗歌单的方法示例
2017/12/21 PHP
JavaScript DOM 学习第五章 表单简介
2010/02/19 Javascript
基于JQuery的简单实现折叠菜单代码
2010/09/15 Javascript
js类型转换与引用类型详解(Boolean_Number_String)
2014/03/07 Javascript
使用delegate方法为一个tr标签加一个链接
2014/06/27 Javascript
Jquery 自定义事件实现发布/订阅的简单实例
2016/06/12 Javascript
vue动态组件实现选项卡切换效果
2017/03/08 Javascript
angular框架实现全选与单选chekbox的自定义
2017/07/06 Javascript
Angular7.2.7路由使用初体验
2019/03/01 Javascript
详解webpack打包vue项目之后生成的dist文件该怎么启动运行
2019/09/06 Javascript
JavaScript实现动态留言板
2020/03/16 Javascript
解决vue net :ERR_CONNECTION_REFUSED报错问题
2020/08/13 Javascript
wepy--用vantUI 实现上弹列表并选择相应的值操作
2020/11/03 Javascript
通过vue.extend实现消息提示弹框的方法记录
2021/01/07 Vue.js
搞笑的程序猿:看看你是哪种Python程序员
2015/06/12 Python
详解Python使用tensorflow入门指南
2018/02/09 Python
python中的内置函数max()和min()及mas()函数的高级用法
2018/03/29 Python
python机器学习包mlxtend的安装和配置详解
2019/08/21 Python
Python绘制股票移动均线的实例
2019/08/24 Python
Python实现i人事自动打卡的示例代码
2020/01/09 Python
构建高效的python requests长连接池详解
2020/05/02 Python
Python使用多进程运行含有任意个参数的函数
2020/05/02 Python
详解python中groupby函数通俗易懂
2020/05/14 Python
女性时尚在线:IVRose
2019/02/23 全球购物
面包店的创业计划书范文
2014/01/16 职场文书
本科生求职信
2014/06/17 职场文书
绿色出行口号
2014/06/18 职场文书
房屋买卖委托书格式范本格式
2014/10/13 职场文书
小学生2015教师节演讲稿
2015/03/19 职场文书
新学期小学班主任工作计划
2019/06/21 职场文书
《攀登者》:“海拔8000米以上,你不能指望任何人”
2019/11/25 职场文书
Pandas数据结构之Series的使用
2022/03/31 Python