Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Воспроизвести видео html 5 при помощи jquery (https://javascript.ru/forum/misc/82970-vosproizvesti-video-html-5-pri-pomoshhi-jquery.html)

StartGames 18.08.2021 11:19

Воспроизвести видео html 5 при помощи jquery
 
Есть код:

<div class="owl-item active">
<div class="scrollflow -slide-top s22">
    <div class="video_block video_block3 ani2">
         <video id="video_slays140" width="100%" preload="metadata" class="scrollflow -slide-top -opacity" loop playsinline>
              <source src="https://kulibinstudio.com/image/catalog/video/Mob/video0002.mp4" type="video/mp4;codecs=&quot;avc1.42E01E, mp4a.40.2&quot;">
          </video>         
    </div>
</div>
</div>



let block_show140 = null;
let video140 = $("#video_slays140");
 
$(window).scroll(function(){
  scro_play140();
});

function scro_play140() {
  let wt = $(window).scrollTop();
  let wh = $(window).height();
  let et140 = $('#video_slays140').offset().top;
  let eh140 = $('#video_slays140').outerHeight();
 
  if (wt + wh >= et140 && wt + wh - eh140 * 2 <= et140 + (wh - eh140)){
    if (block_show140 == null || block_show140 == false) {
      video140.pause();
    }
    block_show140 = true;
  } else {
    if (block_show140 == null || block_show140 == true) {
      video140.play();
    }
    block_show140 = false;
  }
}



его суть: при прокрутке к элементу происходит событие. все отлично работает.

проблема: но видео не запускается. консоль гугла пишет: Uncaught TypeError: video140.play is not a function

скрин: http://joxi.ru/52apWXWUgBnqQm

рони 18.08.2021 11:52

StartGames,
video140 у вас это объект jquery, у этого объекта нет никаких play.
вам нужен сам элемент, в объекте он хранится под индексом ноль.
video140.pause();
video140[0].pause();

video140.play();
video140[0].play();

StartGames 18.08.2021 13:19

спасибо, вы совершенно правы)

StartGames 18.08.2021 14:26

спасибо еще раз, но не подскажите как включить или отключить звук?

пробовал так:
video140[0].unmuted();

и так:
video140[0].muted();

не помогает.

рони 18.08.2021 14:31

StartGames,
video140[0].muted = false;
 video140[0].muted = true;

StartGames 18.08.2021 14:37

ого как все просто то))

Но к сожалению после такого получил ошибки: http://joxi.ru/bmoKyRyH7k5PYm

(index):4091 Uncaught (in promise) DOMException: play() failed because the user didn't interact with the document first. https://goo.gl/xX8pDD

рони 18.08.2021 14:41

StartGames,
при отсутствии на странице живого юзера играть ничего не будет!!!

StartGames 18.08.2021 14:42

Цитата:

Сообщение от рони (Сообщение 539479)
StartGames,
при отсутствии на странице живого юзера играть ничего не будет!!!

а как понять "живого юзера?" Я вроде еще живой))

рони 18.08.2021 14:48

StartGames,
автоматом звук и видио запрещены, пока по странице не кликнут или ещё как-то произведут событие на странице руками, а не скриптом.

рони 18.08.2021 16:13

StartGames,
SuperZen, про play

voraa 18.08.2021 16:20

Цитата:

Сообщение от рони
пока по странице не кликнут или ещё как-то произведут событие на странице руками, а не скриптом.

Причем разные браузеры по разному оценивают, что вызвано действиями пользователя, а что автоматом.

StartGames 18.08.2021 16:23

Цитата:

Сообщение от рони (Сообщение 539481)
StartGames,
автоматом звук и видио запрещены, пока по странице не кликнут или ещё как-то произведут событие на странице руками, а не скриптом.

вот оно что... Действительно. Правда я до этого каким то чудом умудрился пару раз запустить со звуком на автомате, но только... ааа, я повесил действие что при клике на сам блок овл карусели, будет воспроизводиться все видео в блоке. Хотел проверить работает ли само действие, так как не был уверен в работоспособности фокуса (слайдер в видимой части экрана). Но я не кликал на блок, при наведении все само проигрывалось. Возможно натолкнулся на баг))

В любом случае огромное Вам спасибо)) Не первый раз выручаете.:yes:

StartGames 18.08.2021 17:23

Решил отключать видео при клике на баннер.

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

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

$('#banner_slays_{{ module_id }}').click(function() {
        $('#banner_slays_{{ module_id }} .owl-item video').pause();
    });


Но опять же, он не сработает по причине которую вы описывали ранее. Сработает только такая конструкция:

$('#banner_slays_{{ module_id }}').click(function() {
        $('#banner_slays_{{ module_id }} .owl-item video')[0].pause();
    });




Проблема:
Я бы мог создать действие для каждого видео в этом блоке. На данный момент их 4. Но я не знаю буду ли в будущем добавлять слайды, и тогда придется опять идти в код и добавлять событие. А это неудобно очень.



Вопрос:
Можно как то одним действием отключить все видео в этом блоке?



Зачем:
Я не знаю какой слайд был перед включен перед тем как пользователь переключил слайд. И соответственно это видео будет продолжать играть. А так, после клика я просто отключаю их всех и сразу включаю только то что содержит в пути класс .active

Таким образом я и неактивные отрубаю, и активный слайд включаю.

рони 18.08.2021 18:08

Цитата:

Сообщение от StartGames
Можно как то одним действием отключить все видео в этом блоке?

$('#banner_slays_{{ module_id }}').click(function() {
        $('#banner_slays_{{ module_id }} .owl-item video').each((i, video) => video.pause());
    })

StartGames 19.08.2021 13:31

Цитата:

Сообщение от рони (Сообщение 539494)
$('#banner_slays_{{ module_id }}').click(function() {
        $('#banner_slays_{{ module_id }} .owl-item video').each((i, video) => video.pause());
    })

Ну вы просто Бог яваскрипта)) Спасибо Вам за помощь) :thanks:


Часовой пояс GMT +3, время: 02:12.