​【关键词】

动画监听、动态改变

【问题背景】

Style中设置动画样式,然后在onshow生命周期中调用addEventListener()方法去监听动画事件,无法监听到,该方法无任何回调返回

问题代码如下:

<template>

  <!-- Only one root node is allowed in template. -->

  <div class="container" id="ani">

    <text class="title" >Hello World</text>

  </div>

</template>

<style>

  .container {

    flex-direction: column;

    justify-content: center;

    align-items: center;

    animation-name: translateX;

    animation-duration: 1000ms;

  }

  .title {

    font-size: 100px;

  }

  @keyframes translateX {

    from {

      transform: translateX(20px);

    }

    to {

      transform: translateX(200px);

    }

  }

</style>

<script>

  import prompt from '@system.prompt';

  module.exports = {

    data: {

      componentData: {},

    },

    onInit() {

      this.$page.setTitleBar({

        text: 'menu',

        textColor: '#ffffff',

        backgroundColor: '#007DFF',

        backgroundOpacity: 0.5,

        menu: true

      });

    },

    onShow(options) {

      '// Do something .'

      console.log("111111111111111111111111111111111");

      var element = this.$element("ani")

      element.addEventListener("animationend", (event) => {

        console.log("22222222222222")

        prompt.showToast({

          message: 'type: ' + event.type + ', animationName: ' + event.animationName + ', elapsedTime: ' + event.elapsedTime

        })

      })

    },

  }

</script>

回调结果如下图所示:

【问题分析】

这是华为与联盟的底层实现差异导致的,华为是需要在动画效果触发前去调用监听方法才能拿到回调结果。而在onshow中调用时,动画效果已经触发,是无法监听到的。如果要获取callback结果,必须先调用addEventListener,然后再动态修改class,触发CSS动画样式效果。

【解决方法】

在动画样式触发之前调用addEventListener监听方法,动画效果的触发可以通过动态改变class来实现,具体代码如下:

<template>

  <!-- Only one root node is allowed in template. -->

  <div class="container {{name}}" id="ani">

    <text class="title">Hello World</text>

  </div>

</template>

<style>

  .container {

    flex-direction: column;

    justify-content: center;

    align-items: center;

  }

  .animation {

    animation-name: translateX;

    animation-duration: 1000ms;

  }

  .title {

    font-size: 100px;

  }

  @keyframes translateX {

    from {

      transform: translateX(20px);

    }

    to {

      transform: translateX(200px);

    }

  }

</style>

<script>

  import prompt from '@system.prompt';

  module.exports = {

    data: {

      componentData: {},

      name: ''

    },

    onInit() {

      this.$page.setTitleBar({

        text: 'menu',

        textColor: '#ffffff',

        backgroundColor: '#007DFF',

        backgroundOpacity: 0.5,

        menu: true

      });

    },

    onShow(options) {

      '// Do something .'

      console.log("111111111111111111111111111111111");

      var element = this.$element("ani")

      element.addEventListener("animationend", (event) => {

        console.log('type: ' + event.type + ', animationName: ' + event.animationName + ', elapsedTime: ' + event.elapsedTime)

        prompt.showToast({

          message: 'type: ' + event.type + ', animationName: ' + event.animationName + ', elapsedTime: ' + event.elapsedTime

        })

      })

      this.name = "animation"

    },

  }

</script>

回调结果如下图所示:

【快应用】addEventListener()方法无法监听动画事件的更多相关文章

  1. JS如何监听动画结束

    场景描述 在使用JS控制动画时一般需要在动画结束后执行回调去进行DOM的相关操作,所以需要监听动画结束进行回调.JS提供了以下事件用于监听动画的结束,简单总结学习下. CSS3动画监听事件 trans ...

  2. H5_0003:JS禁用调试,禁用右键,监听F12事件的方法

    1,禁用调试 // 这个方法是防止恶意调试的 (function () { console["log"]("=============================== ...

  3. [JS]笔记12之事件机制--事件冒泡和捕获--事件监听--阻止事件传播

    -->事件冒泡和捕获-->事件监听-->阻止事件传播 一.事件冒泡和捕获 1.概念:当给子元素和父元素定义了相同的事件,比如都定义了onclick事件,点击子元素时,父元素的oncl ...

  4. JS 中的事件绑定、事件监听、事件委托

    事件绑定 要想让 JavaScript 对用户的操作作出响应,首先要对 DOM 元素绑定事件处理函数.所谓事件处理函数,就是处理用户操作的函数,不同的操作对应不同的名称. 在JavaScript中,有 ...

  5. 在Javascript中监听flash事件(转)

    在Javascript中监听flash事件,其实有两种做法: 1.在特定的环境下(例如专门制作的flash),大家约定一个全局函数,然后在flash的事件中用ExternalInterface.cal ...

  6. Vue 爬坑之路(七)—— 监听滚动事件 实现动态锚点

    前几天做项目的时候,需要实现一个动态锚点的效果 如果是传统项目,这个效果就非常简单.但是放到 Vue 中,就有两大难题: 1. 在没有 jQuery 的 animate() 方法的情况下,如何实现平滑 ...

  7. vue监听滚动事件 实现某元素吸顶或者固定位置显示

    https://blog.csdn.net/wang1006008051/article/details/78003974 1.监听滚动事件 利用VUE写一个在控制台打印当前的scrollTop, 首 ...

  8. JS 事件绑定、事件监听、事件委托详细介绍

    原:http://www.jb51.net/article/93752.htm 在JavaScript的学习中,我们经常会遇到JavaScript的事件机制,例如,事件绑定.事件监听.事件委托(事件代 ...

  9. vue-video监听touch事件

    vue-video是基于 Vue 的简洁 HTML5 视频播放器组件,但是并没有监听touch事件,也就是说在移动端按键无效. 本文讲述如何改写其vue组件,使其兼容移动端.只需要在其原有的mouse ...

  10. vue监听滚动事件

    vue中监听滚动事件,然后对其进行事件处理,一般有:1. 滚动到顶部吸附: 2. 根据滚动的位置激活对应的tab键(锚链接tab键) 这两种方式的处理都是可通过监听scroll来实现 mounted( ...

随机推荐

  1. ACM-DP-数塔问题

    Description 在讲述DP算法的时候,一个经典的例子就是数塔问题,它是这样描述的: 有如下所示的数塔,要求从顶层走到底层,若每一步只能走到相邻的结点,则经过的结点的数字之和最大是多少? 已经告 ...

  2. Django笔记十九之manager用法介绍

    本文首发于微信公众号:Hunter后端 原文链接:Django笔记十九之manager用法介绍 首先介绍一下 manager 的使用场景,比如我们有一些表级别的,需要重复使用的功能,都可以使用 man ...

  3. cf1809e(edu145e)

    1 /* 2 _ooOoo_ 3 o8888888o 4 88" . "88 5 (| -_- |) 6 O\ = /O 7 ____/`---'\____ 8 .' \\| |/ ...

  4. SpringBoot项目中使用缓存Cache的正确姿势!!!

    前言 缓存可以通过将经常访问的数据存储在内存中,减少底层数据源如数据库的压力,从而有效提高系统的性能和稳定性.我想大家的项目中或多或少都有使用过,我们项目也不例外,但是最近在review公司的代码的时 ...

  5. mysql运维------分库分表

    1. 介绍 问题分析: 随着互联网以及移动互联网的发展,应用系统的数据量也是成指数式增长,若采用单数据库进行数据存储,存在以下性能瓶颈: IO瓶颈:热点数据太多,数据库缓存不足,产生大量磁盘IO,效率 ...

  6. MySQL匿名空用户名处理

    问题描述:公司漏扫发现数据库内出现空用户名及密码,需要对这些用户进行整改 1.首先出现了疑问,这些空的用户名是怎么出现的,而且不附带密码. 2.可以手动这样创建这样的用户名和密码形式么. 3.如果能这 ...

  7. c/c++零基础坐牢第一天

    c/c++从入门到入土(1) 开始时间2023-04-12 22:37:21 结束时间2023-04-13 00:02:26 前言:恭喜大家打开信息时代的大门,每个时代都有代表性的炫酷技能:原始时代的 ...

  8. css中文字与图片对齐

    css中文字与图片对齐 第一种,使用vertical-align:middle .icon{ background-repeat:no-repeat; background-position:cent ...

  9. [操作系统] - 进程切换&进程控制

    2.1.6 进程切换 名称解析 进程的上下文(Context) 当一个进程在执行时,CPU的所有寄存器的值.进程的状态以及堆栈中的内容被称为进程的上下文Context 进程的切换(switch) 当内 ...

  10. VS 输入快捷键propfull

    大家都知道prop.propg输入快捷键. 当前我们需要生成一段包含属性和字段的代码时,可以propfull. propfull在安装了reshaper后,会被隐藏掉.没关系,直接敲propfull, ...