.play () для аудио тегов отстает на iOS (и, возможно, на других мобильных устройствах) - PullRequest
0 голосов
/ 12 декабря 2018

Я пытаюсь пересобрать игру, которая работает на зуде, чтобы она была совместима с большинством основных устройств и браузеров.У меня проблема с тем, что на iOS (и, возможно, на других мобильных устройствах) вызов для воспроизведения звуковых тегов от событий нажатия и касания имеет довольно значительную задержку.

Я читал о нескольких возможных причинах, включая задержку в 300 мс, предотвращение повторного нажатия для события второго щелчка, остановка пропуска для потенциальных родительских щелчков, различные форматы аудио, вызывающие задержку при распаковке и т. Д. Кажется, ничего не работает.

Изначально я намеревался хранить все в vanilla js без внешних библиотек, чтобы заставить себя по-настоящему узнать, что происходит под капотом.Тем не менее, у меня был некоторый успех с некоторыми внешними библиотеками для других проблем, поэтому я попробовал fastclick.js для этой проблемы.Это тоже не сработало для меня.Так что, если кто-то знает, как решить эту проблему без библиотеки, это было бы замечательно, но после просмотра кода fastclick, это может быть выше моего уровня понимания.

Текущую сборку можно найти по адресу www.teachersteve.net/assett_loading_with_ian/assett_loading_with_ian.html

Некоторые объяснения моего мыслительного процесса:

  1. Iудалили все, что на самом деле связано с игрой, чтобы попытаться изолировать проблему.Я поместил все активы непосредственно в html, чтобы упростить процесс загрузки, и жду, чтобы запустить JS после загрузки DOM

    document.addEventListener("DOMContentLoaded", doSomething);
    
  2. В настоящее время я вызываю только один аудио-тег для воспроизведения какЯ где-то читал, что вызов нескольких тегов может перегрузить процесс распаковки и вызвать задержку.Это, кажется, не проблема.

  3. У меня есть 3 различных формата файлов для попыток совместимости ... Я читал, что LEI16 (формат WAV) может быть лучше, потому что он устраняетсжатие, хотя я еще не пробовал.

  4. Это остальная часть функции doSomething ()

    function doSomething() {
      document.body.style.opacity = 1;
      document.addEventListener("click", playAudio);
      document.addEventListener('click', preventInputDefault);
      document.addEventListener('ontouchend', preventInputDefault);
      console.log("assetts loaded");
    
      if ('addEventListener' in document) {
        document.addEventListener('DOMContentLoaded', function() {
            FastClick.attach(document.body);
        }, false);
      }
    
    
      function playAudio() {
    
              // backgroundMusic.play();
    
          letterAudio.play();
    
          // correctAnswerAudio.play();
    
          // letterAudio.play();
          // correctAnswerAudio.play();
      }
    
      function preventInputDefault(evt) {
        evt.preventDefault();
        console.log("hello preventInputDefault");
        evt.stopPropagation();
        console.log("hello stopPropagation");
      }
    }
    

Спасибо!

...