javascript - 如何使用 Vue / JavaScript 在移动设备上触发长按(单击并按住)
问题描述
这仅在移动设备上。它在桌面上按预期工作,所以我将省略所有这些样式和功能。
我有一个像这样的 Vue 组件:
模板
<div class="container">
<div class="invisible-overlay-styles">
<button
v-if="! videoIsPlaying"
@click="playVideo()"
@mousedown="playVideo()"
>
</button>
<a
v-if="videoIsPlaying"
>
</a>
</div> <!-- invisible-overlay-styles -->
<video ... />
</div>
所有的 div、按钮、锚点和视频都堆叠在一起,使用display: block
和position: absolute; width: 100%; etc. etc. etc.
方法
playVideo(){
console.log( 'Im playing!!' );
if( this.player ){
if( this.player.paused ){
this.player.play()
}
}
}
如果我点击它,它会正常工作:
- 第一次点击时,视频播放。
- 第二次点击时,链接被点击。
但是,如果我单击并按住,则既@click
不会触发也不会@mousedown
触发。这两者都在:
- 我的三星 Android 设备上的 Chrome
- 在我的 iPhone 7 上的 Safari 上
- 在我的 Mac 上的 iOS 模拟器中。...我已经检查过了,当我单击并按住(长按)时,没有出现 console.logs。
所以两个问题:
- 我明白为什么
@click
不触发,因为这是@mousedown
和的组合@mouseup
。但是,当我长按时,为什么不会@mousedown
触发? - 如何使用 Vue(或 JavaScript)在移动设备上定位长按?
解决方案
您需要使用TouchEvent API或PointerEvent API。
两者的浏览器兼容性都很好:
它们每个都有与 MouseEvent API 相似的事件,即touchstart
= mousedown
。
我个人发现 TouchEvents 比 PointerEvents 更好,但是,您可能需要进行一些测试才能确定哪种情况最适合您。
所以,你可以用 Vue 猜到,你可以使用@touchstart
:
<button
v-if="!videoIsPlaying"
@click="playVideo()"
@mousedown="playVideo()"
@touchstart="playVideo()"
/>
如果您想将其确定为长按,则必须存储一个值touchstart
并将其更改为touchend
:
<button
@touchstart="touching = true"
@touchend="touching = false"
/>
...
data() {
return {
touching: false
}
}
推荐阅读
- javascript - 在 fadeOut() 之后,内容再次淡入
- node.js - 在 Node.js 中使用 Mongoose 更新嵌套字段
- c# - 在 C# win 表单中使用 word 将字符串拆分为新行
- python - 从所述笔记本中关闭一个 jupyter 笔记本
- r - 将 3D 激光雷达点从笛卡尔坐标系转换为球坐标系和立体投影
- android - 如何在没有 arFragment 的情况下使用 ARcore 在平面上的锚点之间绘制一条线
- php - 如何修复此错误:请您的托管服务提供商为 HTTP 和 CLI 使用 PHP 7.2.5 或更高版本?
- ios - 在数据库之前更新 UI 以提高应用程序性能?
- python - 将鼠标位置写入 .txt 文件
- ios - 安装 Cocoa Pod 依赖项而没有它的子依赖项之一