saytik
@saytik
Веб-разработчик

JS — нарушается порядок запуска функций. Как исправить?

Сегодня задавал уже вопрос в рамках этой задачи, но теперь вопрос другой.

Суть: Надо сначала прочитать метатеги видео, чтобы получить истинный размер видео, а потом изменять размер в зависимости от размеров окна.

var videoH = new Array,videoW = new Array;

$(document).ready(function(){
        $(window).on("resize", function () {
            scaleVideoContainer();
            scaleBannerVideoSize('.video-container video');
        }); 
        $('.video-container video').each(function(){
            $(this).bind("loadedmetadata", function () {
                videoH.push(this.videoHeight);
                videoW.push(this.videoWidth);
            });
        });
        scaleVideoContainer(); // ресайзим контейнер
        scaleBannerVideoSize('.video-container video'); // ресайзим видео
});


function scaleBannerVideoSize(element){
    var row = 0;
    $(element).each(function(){
            var videoHeight, videoWidth;
            !function(row){
                    videoHeight = videoH[row];
                    videoWidth = videoW[row];
                    console.log(videoHeight); // пусто при первичном рендере, а при ресайзе все ОК.
           }.call(this, row);
           ++row;
    });
});


Проблема в том, что сначала выполняется функция scaleBannerVideoSize а уже потом $(this).bind("loadedmetadata", function () {}
  • Вопрос задан
  • 172 просмотра
Пригласить эксперта
Ответы на вопрос 1
IonDen
@IonDen
JavaScript developer. IonDen.com
Помните что код выполняется синхронно. И любые переменные которые появятся в будущем после загрузки видео, в данный момент отсутствуют. По этому продолжение выполнения кода вы должны перенести в коллбэк metadata ready.

var videoH = [],
    videoW = [];

$(document).ready(function(){
        $(window).on("resize", function () {
            scaleVideoContainer();
            scaleBannerVideoSize('.video-container video');
        }); 
        $('.video-container video').each(function(){
            $(this).bind("loadedmetadata", function () {
                videoH.push(this.videoHeight);
                videoW.push(this.videoWidth);

                // ставим сюда
                scaleVideoContainer(); // ресайзим контейнер
                scaleBannerVideoSize('.video-container video'); // ресайзим видео
            });
        });
        // удаляем отсюда
        // scaleVideoContainer(); // ресайзим контейнер
        // scaleBannerVideoSize('.video-container video'); // ресайзим видео
});
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы