Добавил на сайт для фонового воспроизведения плагин
YTPlayer. Добавил так же на сайт для всплывающих окон плагин
Custombox, который при работе с ним переносит весь HTML код внутрь собственно созданного контейнера, а когда он уже не требуется - возвращает код обратно, как было. Таким образом меняется DOM страницы. Естественно, я понимаю, что в таком случае нужно пользоваться обработкой событий через
.on. Я добавил для фонового видео переключатель звука (вкл и выкл). Он, по факту, вызывается так:
$(document).on("click","#volume",function(){});
По такому событию клика видео всегда можно заглушить или наоборот, включить звук.
Теперь же рассмотрим основную проблему. Как я писал выше, модальное окно Custombox меняет всю DOM структуру при работе с ним. У меня стоит задача - после закрытия Custombox (а значит и перезагрузки видео) обратиться этому видео и повторно напомнить ему, что звук должен быть включен или выключен. Делается это у YTPlayer так (пример выключения звука):
$("#video").YTPMute();
То есть, вызывается метод YTPMute, который для объекта $("#video") заглушает звук. Но! Если DOM изменён, то так обрашаться к нему бессмысленно. Он просто не реагирует. Как инчае вызывать метод объекта, который находится в изменённом DOM-е?
Если что, вот
реальный проект, в котором встречается ошибка. Я там написал кучу консольных комментариев в
файле с основным кодом, чтобы следить чуть ли не за каждым шагом для смены состояния звука. Важнее всего обратить внимание на функцию PostVideo (
53 строка), в которой проверяется состояние переменной
video_vol_state (on или off), и в зависимости от значения, вызывается либо YTPMute, либо YTPUnmute. Проблема просто в том, что это не работает. Не хочет, хоть ты тресни!
Попробуйте перейти к видеоблоку, нажмите на "I", появится форма. В этой форме что-нибудь напишите, чтобы получилось отправить эти данные, и, собственно, нажмите на заказ обратного звонка. После смотрите внимательно в консоль. Там два однаразовых таймера. Первый через 5 секунд включает заново видео, ибо Custombox останавливает его + нужно время на показ текста об успешности отправки данных. Далее уже срабатывает через 7 секунд второй одноразовый таймер, который, по факту, ждёт 7 секунд (заранее завышенное, чтобы наверняка попасть на момент где слышен звук), чтобы уже у запустившегося видео выключить звук, если он включён. А он включён по умолчанию, как я понял. Это и бесит.