在移动 Chrome 中启动 HTML5 音频播放可以接受哪些事件

gaw*_*ter 5 html javascript audio android ios

移动浏览器需要用户操作才能开始播放音频元素。在点击事件满足条件,但现在看来,touchstart是无法在Chrome Android或iOS上可接受的始发事件。(见下文)

有谁知道在哪里可以找到开始游戏所需的事件上下文的精确定义。

(我试图使用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>
Run Code Online (Sandbox Code Playgroud)

当我在 Android 6.0.1 上的 Chrome 58 中加载此页面时,单击按钮按预期工作,产生一个弹出窗口,播放一些音乐并更新播放时间。

如果我重新加载页面并改为触摸“触摸”按钮,则会出现弹出窗口,但不会播放音乐。状态显示显示 readyState 为 4 和 currentTime 为 0。换句话说,允许touchstart事件加载音频但不能启动播放。

由于我找不到有关哪些事件应该起作用的文档,因此我不知道是否将此视为 Chrome 错误或预期行为。

Nik*_*kic 0

在此页面中您将找到该问题的答案。

使用一些弹出窗口或任何美观的动画来吸引用户点击。

在我的记忆中...... android和iOS没有相同的行为,它是关于我们可以用这个技巧启动缓冲区的最大音频数量。

    var EXE_JUST_ONE_TIME = false;

    document.addEventListener("touchstart" , function(e) {

    if (EXE_JUST_ONE_TIME == false){
    EXE_JUST_ONE_TIME = true;

    document.getElementById("LaserShot").play(); // need for play pause just for buffering start
    document.getElementById("LaserShot").pause();
    // now you can play programmability from js 
    document.getElementById("LaserShot_CLONE").play();
    document.getElementById("LaserShot_CLONE").pause();

    }
  else if(EXE_JUST_ONE_TIME = true){

    document.getElementById("MakeReadyotherAudio1").play();
    document.getElementById("MakeReadyotherAudio1").pause();

     EXE_JUST_ONE_TIME = 'NOMORE'

  } 


    }
Run Code Online (Sandbox Code Playgroud)

如果您有问题,我可以为您制作带有工作示例的代码片段!

我在开始的事件函数中将 90% 放入移动网络开发中:

   document.getElementById("myAnchor").addEventListener("click", function(event){
    event.preventDefault()
});
Run Code Online (Sandbox Code Playgroud)

//有时即使您不使用某些事件也可以覆盖:

  window.addEventListener('touchstart', function(e){
      e.preventDefault()

    }, false)

    window.addEventListener('touchmove', function(e){
        e.preventDefault()

    }, false)

    window.addEventListener('touchend', function(e){    
        e.preventDefault()


    }, false)

    window.addEventListener('touchleave', function(e){    
        e.preventDefault()


    }, false)
    window.addEventListener('touchcancel', function(e){    
        e.preventDefault()


    }, false)
    window.addEventListener('touchenter', function(e){    
        e.preventDefault()


    }, false)
Run Code Online (Sandbox Code Playgroud)

如果您愿意,可以使用此库: desktop/mobile event optimization for canvas