简体   繁体   English

如何用 addEventListener 替换 @click 并使 addEventListener 像@click 一样灵活?

[英]How to replace @click by addEventListener and make addEventListener so flexible as @click?

Chrome on Android does not allow to play music\\video if there is no any user movements.如果没有任何用户动作,Android 上的 Chrome 不允许播放音乐\\视频。 I found a piece of Google's code which uses addEventListener which sees user's interactions and plays music\\video.我找到了一段 Google 的代码,它使用addEventListener来查看用户的交互并播放音乐\\视频。

For some reason, Chrome on Android does not allow to play track if @click is used.出于某种原因,如果使用@click ,Android 上的 Chrome 不允许播放曲目。 Because of debugging and reading lots of info, I found that Chrome starts playing for a moment, but then stops.由于调试和阅读大量信息,我发现Chrome开始播放了一会儿,然后停止了。 It probably happens because Chrome thinks that @click is kind of auto-play that may show some adverts and does not have any relation to user's interaction because Chrome requires an explicit action by the user.这可能是因为 Chrome 认为@click是一种自动播放,可能会显示一些广告并且与用户的交互没有任何关系,因为 Chrome 需要用户的明确操作。 If I start to use addEventListener , Chrome starts playing without any problems.如果我开始使用addEventListener ,Chrome 开始播放没有任何问题。 It could be ok for me to use addEventListener , but:我可以使用addEventListener ,但是:

1) I need somehow to pass trackObj from template to event listener's function; 1)我需要以某种方式将trackObj从模板传递给事件侦听器的函数;

2) There are could be hundreds of tracks, I do not know if it is ok to add listeners to all of them. 2)可能有数百首曲目,我不知道是否可以将听众添加到所有曲目中。

<template>
  <div v-for="(trackObj, index) in tagObj.tracks" :key="trackObj.trackId">

    // What I currently have and it works on PC, but not on Anroid + Chrome
    <b-card @click="nextTrack({whatToDo: 'playTrackObj', trackObj: trackObj})"
      class="dragula-move w-100 pl-2" no-body>
      {{ index + 1 }}. {{ trackObj.trackTitle }}
    </b-card>

  </div>
</template>

<script>
  import { mapActions } from 'vuex'

  export default {
    methods: {
      ...mapActions('header', [
        'nextTrack'
      ])
    },

    // This work on Android + Chrome
    mounted () {
      // let self = this

      // let allTracks = document.getElementsByClassName('card dragula-move w-100 pl-2')
      // for (let i = 0; i < allTracks.length; i++) {
      //   allTracks[i].addEventListener('click', function (event) {
      //     self.nextTrack({whatToDo: 'playDefaultTrack'})
      //   })
      // }
    }

  }
</script>

If I remove @click="nextTrack(...) from <b-card> and uncomment the code in mounted () , Chrome on Android starts to see user's interaction and starts track playing.如果我从<b-card>删除@click="nextTrack(...)并取消对mounted ()的代码的注释,Android 上的 Chrome 将开始查看用户的交互并开始播放曲目。

Is there any way how to help Chrome on Android to see user's clicks using +- my existing code (ie @click="nextTrack(...) ) or can anyone show me how it is possible to pass to EventListener a trackObj from template which can be used by self.nextTrack(...) function?有什么方法可以帮助 Android 上的 Chrome 使用 +- 我现有的代码(即@click="nextTrack(...) )查看用户的点击,或者任何人都可以向我展示如何将trackObj从模板传递给 EventListener self.nextTrack(...) 函数可以使用哪个?

@click.native does not help. @click.native没有帮助。

I suggest using a custom directive with those objects as arguments.我建议使用带有这些对象的自定义指令作为参数。 See below:见下文:

 Vue.directive('next-track', { bind: function(el, binding, vnode) { var vm = vnode.context; el.addEventListener('click', function(event) { vm.nextTrack({whatToDo: binding.value.whatToDo}) }) } }) new Vue({ el: '#app', data: { message: 'hello!', trackObj: 'something' }, methods: { nextTrack(arg) { console.log('nextTrack called with', JSON.stringify(arg)) } } })
 <script src="https://unpkg.com/vue@2.5.13/dist/vue.min.js"></script> <div id="app"> <div v-next-track="{whatToDo: 'playTrackObj', trackObj: trackObj}"> playTrackObj </div> <br> <div v-next-track="{whatToDo: 'click uss!', trackObj: trackObj}"> click us and check the console </div> </div>

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM