2015-09-18 7 views
7

есть ли способ определить, разрешен ли вызов play() на видеоэлементе без жестов пользователя? На Android Chrome это выдается предупреждение:Функция обнаружения, если пользовательский жест необходим

Failed to execute 'play' on 'HTMLMediaElement': API can only be initiated by a user gesture.

Так на Chrome Android требуется жест пользователя, чтобы начать воспроизведение видео, а не на рабочем столе Chrome. Есть ли способ определить, какое поведение я получу?

Я хочу иметь немного другое поведение в своем приложении в зависимости от того, разрешена ли игра с программным обеспечением или нет.

Я попытался использовать Modernizr.videoautoplay, но это проверяет, есть ли свойство autoplay на элементе, что не то же самое. Это дает ложные отрицания для IE11 и Edge.

Редактировать: добавлено an example. Видео начнет автоматически воспроизводиться на рабочем столе Chrome и IE11 или Edge (с задержкой 3 секунды) в окнах 8 или 10. Для Chrome @ Android требуется взаимодействие с пользователем (нажатие кнопки), и сообщение об ошибке можно увидеть в консоли.

+0

Вы можете отправить пример кода, который имеет эту ошибку? – Patrick

+0

Привет @Patrick Я обновил вопрос со ссылкой на пример. Его бит сложный (добавление кадров к видео по частям), но проблема может быть видна – oskbor

+0

Привет @oskbor, вы получили исправление для этого? – Biswarup

ответ

4

Метод воспроизведения возвращает обещание, которое может быть использовано для обнаружения ошибки.

Не все браузеры следуют the specification, поэтому вам нужно будет проверить, является ли то, что возвращается, это обещание.

var autoPlayAllowed = true; 
var promise = document.createElement("video").play(); 
if(promise instanceof Promise) { 
    promise.catch(function(error) { 
     // Check if it is the right error 
     if(error.name == "NotAllowedError") { 
      autoPlayAllowed = false; 
     } else { 
      throw error; 
     } 
    }).then(function() { 
     if(autoPlayAllowed) { 
      // Allowed 
     } else { 
      // Not allowed 
     } 
    }); 
} else { 
    // Unknown if allowed 
} 
+1

Я думаю, что для этого нужно проверить, существует ли 'window.Promise', в противном случае вы получите ссылочную ошибку в браузерах, которые не поддерживают обещания. – JayPea