[英]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.