2012-03-02 5 views
3

У меня есть video элемент и сценарий, который присоединяет onplay обработчик видео с помощью JQuery:Может ли события DOM запускаться до запуска моего скрипта?

<video id="vid" /> 
<!-- ... --> 
<script type="text/javascript"> 
    $('#vid').on('play', function() { 
     $(this).addClass('playing'); 
    }); 
</script> 

Согласно this answer, пользователей может быть в состоянии взаимодействовать с видеоплеером до загрузки сценария. Но мне нужно убедиться, что мой обработчик событий прикреплен до того, как событие onplay может быть запущено.

Чтобы проверить это, я добавил скрипт сразу после video, который вызывает play(). Обработчик запускается во всех основных браузерах, кроме WebKit, который вообще не воспроизводит видео. Даже перенос оператора jQuery в функцию $().ready() по-прежнему позволяет привязать обработчик до onplay.

Гарантировано, что мой скрипт никогда не пропустит какие-либо события из видео в HTML5? То же самое относится ко всем событиям DOM? Что, если я добавлю async к скрипту?

ответ

1

состояние гонки в этом случае используется возможным:

<video autoplay src="…"></video> 
<script>alert("wait!")</script> 
<script>$('video').on('play',…)</script> 

Однако, спецификация была изменена, чтобы решить эту проблему. Теперь браузеры должны queue firing of events until next event loop run, вместо того, чтобы немедленно их запустить.

Если сценарий подключения обработчиков событий является рядным скрипта сразу после <video>, работает , не дожидаясь для DOMReady, то состояние гонки не будет в совместимых браузерах.

Если вы используете внешний или асинхронный сценарий, дождитесь DOMReady, используйте setTimeout или синхронный XHR, тогда вы можете пропустить эти события, поскольку эти вещи могут вызвать обработку цикла обработки событий (хотя я не уверен на 100%, будь то сеть stall позволяет браузерам обрабатывать цикл событий).


Я не знаю, был ли обновлен WebKit для обеспечения более безопасного поведения. Если у вас есть проблемы, то вы можете использовать методы, которые работают даже тогда, когда события запускаются мгновенно:

  1. Использование встроенного обработчика событий:

    <video onplay="…"> 
    
  2. Создать элемент программно (document.createElement('video')) с обработчиками прилагается прежде чем он будет вставлен в документ.

+0

У меня были проблемы с переопределением события щелчка элемента привязки на iPad.Если я нажимаю элемент перед его визуализацией, он часто перемещается, даже несмотря на то, что мой обработчик событий всегда предотвращает действие по умолчанию. Я закончил тем, что сделал свою разметку не-js-friendly, так что это стало проблемой. – Timothy003

+0

Я возвращаюсь к этому вопросу три года спустя, потому что Chrome запускает события 'error' на элементах' source', прежде чем мой скрипт сможет присоединить обработчик событий. Встроенный скрипт не гарантирует, что состояние гонки не произойдет; действительно, если я добавлю мегабайт пробелов внутри или перед скриптом, Chrome запустит цикл событий при загрузке пробелов. – Timothy003

0

Лучший способ гарантировать, что следует использовать RequireJS, и убедитесь, что вы гнездились в правильном порядке, если это необходимо, или используйте orderPlugin для RequireJS.

модернизатор первый.

+0

Таким образом, вы можете добавлять модули и все эти дрянные вещи и загружать только код, который вам нужен после его выполнения. – Relic

+1

Как именно это связано с вопросом? –

+0

Это гарантирует, что видеопроигрыватель не будет загружен до того, как его обработчик событий будет готов ... или же. Это в основном устраняет угадывание того, что загружает в первую очередь. – Relic

Смежные вопросы