【发布时间】:2017-06-16 17:40:17
【问题描述】:
移动浏览器需要用户操作才能开始播放音频元素。 click 事件满足要求,但在 Android 或 iOS 上的 Chrome 中,touchstart 似乎不是可接受的启动事件。 (见下文)
有谁知道在哪里可以找到开始播放所需的事件上下文的精确定义。
(我试图使用 How to prevent doubletap zoom in iOS and Android 中的想法解决 UX 问题。自从发布我的原始问题以来,我找到了一个无需使用 touchstart 即可解决 UX 问题的解决方案,但我认为关于哪些事件被认为是用户操作的基本问题仍然有效。)
附录:
有人建议我对 touchstart 事件有误,所以为了记录,我提供了一个简单的测试程序。因为它需要一个真实的音乐文件和一个移动设备,所以 JSFiddle 不是一个合适的平台(除非有人知道如何在小提琴中模拟一个 touchstart 事件)。要重现我的观察结果,请编辑 javascript 以加载您自己的音频文件。
<!DOCTYPE html>
<html>
<body>
<br>
<button type="button" id="but1">click</button>
<button type="button" id="but2">touch</button>
<br>
<br>
<span id="message"></span>
<script>
var e;
e = document.getElementById('but1');
e.onclick = click;
e = document.getElementById('but2');
e.ontouchstart = touchstart;
function click() {
alert('caught click');
play();
event.preventDefault();
}
function touchstart() {
alert('caught touchstart');
play();
event.preventDefault();
}
var p;
var t;
function play() {
p = new Audio();
p.src = '/k487.mp3'; // CHANGE THIS
p.preload = 'auto';
p.play();
t = setInterval(report,1000);
}
function report() {
var s = 'Player readyState='+p.readyState+', currentTime='+p.currentTime;
var e = document.getElementById('message');
e.innerHTML = s;
}
</script>
</body>
</html>
当我在 Android 6.0.1 上的 Chrome 58 中加载此页面时,单击按钮按预期工作,产生一个弹出窗口,播放一些音乐并更新播放时间。
如果我重新加载页面并改为触摸触摸按钮,我会看到弹出窗口,但没有播放音乐。状态显示显示 readyState 为 4,currentTime 为 0。换句话说,touchstart 事件被允许加载音频但不允许开始播放。
由于我找不到关于哪些事件应该起作用的文档,我不知道是否将其视为 Chrome 错误或预期行为。
【问题讨论】:
-
是的,我这样做了,但我为此使用了 javascript 框架 (CreateJS)。他们在这里完美地解释了这个问题:createjs.com/tutorials/Mobile%20Safe%20Approach。也许你应该阅读它,它可能会给你一些关于如何修复它的提示。
-
据我所知,您的参考仅提供标准的 onclick 解决方案。问题是是否有任何其他事件可以开始播放 - touchstart 不起作用。
-
我认为你是对的。 Touchstart 将不起作用。我读过有人在 touchend 上使用此功能的文章,但 touchend 并不是真正的最佳选择,因为它永远不会触发(例如,当您的手指在 touchstart 事件中移动一点时)。我认为使用“点击”事件的唯一稳定选项。
标签: javascript android ios html audio