Событие с обновлением времени в HTML5 видео не запускается - PullRequest
6 голосов
/ 19 марта 2012

У меня есть элемент <video> на моей странице:

<video id="myVideo">
    <source src="vid.mp4" type="video/mp4" />
    <source src="vid.ogg" type="video/ogg" />
</video>

В моем JS написано:

var v = $('#myVideo')[0];
v.addEventListener('timeupdate',function(){
   alert('I changed');
},false);

Теперь я включу консоль и наберу:

$('#myVideo')[0].currentTime = 2;

Отображаемый кадр изменится, но событие не сработает. Согласно спецификации timeupdate должен срабатывать при currentTime was changed, поэтому я не думаю, что использую неправильное событие? Все остальные события, которыми я пользуюсь (т. Е. play & ended), работают нормально.

Есть много подобных вопросов, но все они кажутся устаревшими ошибками? Это еще одна ошибка (я тестировал в Chrome 17 и FF10) или что-то изменилось в структуре событий? Или я что-то упускаю совсем другое?

EDIT: Я просто заметил, что эта проблема возникнет только тогда, когда видео еще не воспроизводилось. Поэтому, когда я делаю:

$('#myVideo')[0].play();
$('#myVideo')[0].pause();
$('#myVideo')[0].currentTime = 2;

Событие будет происходить так же, как и должно.

Ответы [ 3 ]

2 голосов
/ 11 августа 2013

Используемое событие не является «timeupdate», я думаю, что оно «ищется».
Когда вы меняете currentTime, сначала происходит событие «seeking», а затем, как только видео синхронизируется с выбранным временем, «искомое» событие запускается.

Я проверил это с помощью Google 28, и оно работало без необходимости .play () + .pause () на элементе управления.

2 голосов
/ 19 марта 2012

событие отправляется только после инициализации видео.как вы только что указали в своем комментарии редактирования, где вы воспроизводите () и пауза () видео, которое предварительно загружает видео.то же самое должно произойти, если вы используете атрибут preload с auto (auto = author считает, что браузер должен загружать все видео при загрузке страницы)

<video preload="auto|metadata|none">

но я думаю, вы сами ответили на свой вопрос?1004 *

1 голос
/ 20 марта 2012

Итак, как уже говорилось в редактировании моего вопроса, я решил это простым и довольно глупым подходом. Просто сделай:

video.play();
video.pause();

для «инициализации» точки воспроизведения. Тогда нужно иметь возможность получать timeupdate событий, даже если никто никогда не запускал видео.

С другой стороны: странно, установка preload на auto вызывает предварительную загрузку видео, но, похоже, не инициализирует точку воспроизведения.

...