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 Event学习第八章 事件的顺序
Feb 07 Javascript
JavaScript面向对象程序设计三 原型模式(上)
Dec 21 Javascript
javascript实现鼠标拖动改变层大小的方法
Apr 30 Javascript
javascript中去除数组重复元素的实现方法【实例】
Apr 12 Javascript
JS异步加载的三种实现方式
Mar 16 Javascript
浅谈es6 javascript的map数据结构
Dec 14 Javascript
jQuery实现动态显示select下拉列表数据的方法
Feb 05 jQuery
JS代码实现电脑配置检测功能
Mar 21 Javascript
Vue.use源码学习小结
Jun 20 Javascript
JS/HTML5游戏常用算法之碰撞检测 包围盒检测算法详解【矩形情况】
Dec 13 Javascript
JS实现进度条动态加载特效
Mar 25 Javascript
vue实现列表拖拽排序的示例代码
Apr 08 Vue.js
微信小程序 授权登录详解(附完整源码)
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
抓取YAHOO股票报价的类
2009/05/15 PHP
PHP显示今天、今月、上月、今年的起点/终点时间戳的代码
2011/05/25 PHP
PHP程序中使用adodb连接不同数据库的代码实例
2015/12/19 PHP
php实现页面纯静态的实例代码
2017/06/21 PHP
Thinkphp5.0 框架实现控制器向视图view赋值及视图view取值操作示例
2019/10/12 PHP
Laravel框架Eloquent ORM删除数据操作示例
2019/12/03 PHP
JavaScript延迟加载
2021/03/09 Javascript
jQuery 使用手册(七)
2009/09/23 Javascript
jQuery实现页面滚动时层智能浮动定位实例探讨
2013/03/29 Javascript
js substring从右边获取指定长度字符串(示例代码)
2013/12/23 Javascript
js提交form表单,并传递参数的实现方法
2016/05/25 Javascript
Node.js中防止错误导致的进程阻塞的方法
2016/08/11 Javascript
jquery判断iPhone、Android设备类型
2016/09/14 Javascript
Vue.js实现模拟微信朋友圈开发demo
2017/04/20 Javascript
Angular 4 指令快速入门教程
2017/06/07 Javascript
JS SetInterval 代码实现页面轮询
2017/08/11 Javascript
微信小程序websocket实现聊天功能
2020/03/30 Javascript
React和Vue中监听变量变化的方法
2018/11/14 Javascript
Angular实现svg和png图片下载实现
2019/05/05 Javascript
python实现获取客户机上指定文件并传输到服务器的方法
2015/03/16 Python
举例详解Python中yield生成器的用法
2015/08/05 Python
Python用csv写入文件_消除空余行的方法
2018/07/06 Python
python基础教程之while循环
2019/08/14 Python
详解Python并发编程之创建多线程的几种方法
2019/08/23 Python
Python+Tensorflow+CNN实现车牌识别的示例代码
2019/10/11 Python
python是怎么被发明的
2020/06/15 Python
CSS3教程(3):border-color网页边框色彩
2009/04/02 HTML / CSS
品恩科技软件测试面试题
2014/10/26 面试题
化验室技术员岗位职责
2013/12/24 职场文书
《孔子游春》教学反思
2014/02/25 职场文书
《与朱元思书》的教学反思
2014/04/17 职场文书
安全生产计划书
2014/05/04 职场文书
事业单位年度考核个人总结
2015/02/12 职场文书
离婚律师函范本
2015/05/27 职场文书
只需要这一行代码就能让python计算速度提高十倍
2021/05/24 Python
python中的sys模块和os模块
2022/03/20 Python