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 json2 使用方法
Mar 16 Javascript
jQuery父级以及同级元素查找介绍
Sep 04 Javascript
node.js中的fs.writeSync方法使用说明
Dec 15 Javascript
Vue实现动态响应数据变化
Apr 28 Javascript
EasyUI中的dataGrid的行内编辑
Jun 22 Javascript
详解Vue + Vuex 如何使用 vm.$nextTick
Nov 20 Javascript
swiper移动端轮播插件(触碰图片之后停止轮播)
Dec 28 Javascript
JavaScript中变量提升与函数提升经典实例分析
Jul 26 Javascript
详解angular应用容器化部署
Aug 14 Javascript
详解JavaScript中的函数、对象
Apr 01 Javascript
详解Vue、element-ui、axios实现省市区三级联动
May 07 Javascript
vue使用localStorage保存登录信息 适用于移动端、PC端
May 27 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将数据库中的电话号码读取出来并生成图片
2008/08/31 PHP
利用Memcached在php下实现session机制 替换PHP的原生session支持
2010/08/21 PHP
phpMyAdmin出现无法载入 mcrypt 扩展,请检查PHP配置的解决方法
2012/03/26 PHP
php上传图片生成缩略图(GD库)
2016/01/06 PHP
Symfony2联合查询实现方法
2016/03/18 PHP
使用php从身份证号中获取一系列线索(星座、生肖、生日等)
2016/05/11 PHP
php文件上传、下载和删除示例
2020/08/28 PHP
php源码的安装方法和实例
2019/09/26 PHP
jQuery选择没有colspan属性的td的代码
2010/07/06 Javascript
javascript中的对象创建 实例附注释
2011/02/08 Javascript
基于Jquery的仿照flash放大图片效果代码
2011/03/16 Javascript
HTML5附件拖拽上传drop &amp; google.gears实现代码
2011/04/28 Javascript
页面只能打开一次Cooike如何实现
2012/12/04 Javascript
hover的用法及live的用法介绍(鼠标悬停效果)
2013/03/29 Javascript
JS localStorage实现本地缓存的方法
2013/06/22 Javascript
js中对象的声明方式以及数组的一些用法示例
2013/12/11 Javascript
chrome不支持form.submit的解决方案
2015/04/28 Javascript
jQuery实现的网页换肤效果示例
2016/09/20 Javascript
JavaScript箭头(arrow)函数详解
2017/06/04 Javascript
解决koa2 ctx.render is not a function报错问题
2018/08/07 Javascript
解决layer弹层遮罩挡住窗体的问题
2018/08/17 Javascript
Vue切换div显示隐藏,多选,单选代码解析
2020/07/14 Javascript
jQuery实现增删改查
2020/12/22 jQuery
Python中除法使用的注意事项
2014/08/21 Python
使用python编写简单的小程序编译成exe跑在win10上
2018/01/15 Python
在Mac上删除自己安装的Python方法
2018/10/29 Python
OpenCV图像颜色反转算法详解
2019/05/13 Python
python+opencv实现车牌定位功能(实例代码)
2019/12/24 Python
python 通过邮件控制实现远程控制电脑操作
2020/03/16 Python
css3 clip实现圆环进度条的示例代码
2018/02/07 HTML / CSS
瑞典廉价机票预订网站:Seat24
2018/06/19 全球购物
加拿大领先家居家具网上购物:Aosom.ca
2020/05/27 全球购物
亚洲在线旅行门户网站:Expedia.com.hk(智游网)
2020/04/14 全球购物
判断单链表中是否存在环
2012/07/16 面试题
数控加工专业毕业生自荐信
2013/09/27 职场文书
律政俏佳人观后感
2015/06/09 职场文书