Если вы динамически добавляете <video>
на свою страницу, которой нет в HTML, полученном с сервера, вы можете столкнуться с условием гонки, которое может привести к тому, что событие ended
не будет распознано - даже если оно было добавлено правильно.
Я использую knockoutjs
, чтобы добавить другой шаблон для телефона и рабочего стола.
<div data-bind="template: { name: videoTemplate, afterRender: initializeVideo }">
Это динамически создает мне элемент <video
> и затем вызывает initializeVideo()
после того, как шаблон визуализирован (добавлен в DOM), чтобы связать события:
$('video#flexVideo').off('ended').on('ended', (evt) =>
{
alert('ended fired');
}).css('border', '2px solid yellow'); // add yellow border so we know element existed
На моем экране видео получает желтую рамку (доказательство того, что видео присутствовало в DOM и опечаток не было). Однако по какой-то причине браузер еще не может прикрепить к нему событие ended
- я предполагаю, что оно, возможно, еще не было инициализировано.
Инструменты отладки Chrome показывают, что он добавлен, но на самом деле он не работает!
Это происходит в Firefox, Chrome + IE10, что немного удивляет.
Одним из решений является следующее:
$('video#flexVideo').off('loadstart').on('loadstart', (evt) =>
{
$('video#flexVideo').off('ended').on('ended', (evt) =>
{
alert('ended fired');
}).css('border', '2px solid yellow');
}).css('border', '2px solid orange');
Событие loadstart
кажется связываемым сразу.
Другой, возможно, просто setTimeout
- или просто связать событие при игре.