Это сообщение об ошибке, которое я получаю:
Failed to execute 'postMessage' on 'DOMWindow': The target origin provided
('https://www.youtube.com') does not match the recipient window's origin
('http://localhost:9000').
Я видел другие подобные проблемы, где источник цели http://www.youtube.com
и источник получателя есть https://www.youtube.com
, но ни одна, как моя, где цель https://www.youtube.com
и источник http://localhost:9000
.
- Я не понимаю проблемы. В чем проблема?
- Как я могу это исправить?
javascript
angularjs
youtube
youtube-api
youtube-iframe-api
Адам Зернер
источник
источник
Ответы:
Я считаю, что это проблема с целевым происхождением
https
. Я подозреваю, что это потому, что ваш iFrame URL используетhttp
вместоhttps
. Попробуйте изменить URL-адрес файла, который вы хотите вставитьhttps
.Например:
быть:
источник
http
противhttps
? Неважно, что домены отличаются (YouTube против localhost)? И что именно является целевым происхождением против получателя? Как то, что вы сказали, изменило происхождение получателя (мой URL все еще localhost: 9000)?localhost:9000
. Проблема была в том, как вы использовали API-интерфейс YouTube. Когда вы объявляете API какtag.src = "https://www.youtube.com/iframe_api";
в своем коде, вы говорите YouTube, что хотите использовать ssl. Таким образом, предложенные мной изменения позволили вам использовать ssl для запроса видео. Ошибка просто говорила, что вы смешиваете ssl и non-ssl вызовы.playerEl = document.querySelector('iframe#ytplayer'); anotherEl.appendChild(playerEl); // yt complains on subsequent api calls
Просто добавьте параметр
"origin"
с URL вашего сайта вparamVars
атрибут плеера, например так:источник
window.location.origin
..window.location
это объект.window.location.host
Установка это, кажется, исправить это:
источник
http
(вместоhttps
) решил мою проблему.host: `${window.location.protocol}//www.youtube.com`
,Вы можете сохранить JavaScript в локальных файлах:
В первый файл
player_api
поместите этот код:Во втором файле найдите код:
this.a.contentWindow.postMessage(a,b[c]);
и заменить его на:
Конечно, вы можете объединить в один файл - будет эффективнее. Это не идеальное решение, но оно работает!
Мой источник: yt_api-concat
источник
Убедитесь, что вы загружаете с URL, например:
https://www.youtube.com/embed/HIbAz29L-FA?modestbranding=1&playsinline=0&showinfo=0&enablejsapi=1&origin=https%3A%2F%2Fintercoin.org&widgetid=1
Обратите внимание на компонент origin, а также enablejsapi = 1. Источник должен соответствовать вашему домену, и тогда он будет в белом списке и будет работать.
источник
Попробуйте использовать
window.location.href
для URL, чтобы соответствовать происхождению окна.источник
Я получил ту же ошибку. Моя ошибка состояла в том, что
enablejsapi=1
параметр не присутствовал вiframe
src.источник
Я думаю, что описание ошибки вводит в заблуждение и изначально связано с неправильным использованием объекта player.
У меня была такая же проблема при переключении на новые видео в слайдере.
При простом использовании
player.destroy()
функции, описанной здесь, проблема исчезла.источник
У меня была такая же проблема, и оказалось, что это потому, что у меня было запущено расширение Chrome "HTTPS Everywhere". Отключение расширения решило мою проблему.
источник
Эта точная ошибка была связана с блокировкой контента Youtube при «воспроизведении на определенных сайтах или в приложениях». В частности, от WMG (Warner Music Group).
Однако в сообщении об ошибке указывалось, что проблема заключается в импорте iframe https на сайт http, чего в данном случае не было.
источник
Удаление DNS Prefetch решит эту проблему.
Если вы используете WordPress, добавьте эту строку в functions.php вашей темы
источник
Вы можете изменить свой iframe таким образом и добавить источник, чтобы он был вашим текущим сайтом. Это устраняет ошибку в моем браузере.
ссылка: https://developers.google.com/youtube/iframe_api_reference#Loading_a_Video_Player
источник
Может быть любое из следующего, но все они ведут в DOM, не загруженный до того, как к нему обращается javascript.
Итак, вот что вы должны убедиться перед фактическим вызовом кода JS: * Убедитесь, что контейнер загружен до вызова любого javascript * Убедитесь, что целевой URL загружен в любой контейнер, который он должен
Я сталкивался с подобной проблемой, но на моем локальном компьютере, когда я пытаюсь запустить мой Javascript задолго до onLoad главной страницы, что вызывает сообщение об ошибке. Я исправил это, просто ожидая загрузки всей страницы и затем вызывая требуемую функцию.
Вы можете просто сделать это, добавив функцию тайм-аута, когда страница загрузится, и вызвать событие onload, например:
window.onload = new function () {setTimeout (function () {// некоторое событие загрузки), 10); }
это гарантирует, что то, что вы пытаетесь, будет хорошо выполняться после запуска onLoad.
источник
document.addEventListener("DOMContentLoaded", function () {
к сожалению, не помогло.Вы также получаете это сообщение, когда вы не указываете targetOrigin в вызовах
window.postMessage()
.В этом примере мы
*
публикуем сообщение в первом iFrame и используем в качестве цели, что должно разрешить связь с любым targetOrigin.источник
В моем случае, по крайней мере, это похоже на безвредное условие «не готово», которое API повторяет до тех пор, пока не выполнится успешно.
Я получаю от двух до девяти из них (на моем тестере наихудшего случая, FossilBook 2009 года с 20 вкладками, открытыми через сотовую точку доступа) ... но тогда видео работает нормально. Как только он запускает мои вызовы на основе postMessage для поиска, чтобы определенно работать, не проверял других.
источник
В некоторых случаях (как упомянул один комментатор) это может быть вызвано тем, что вы перемещаете игрока в DOM, например,
append
или т. Д.источник
Можешь попробовать :
источник
Я также столкнулся с той же самой проблемой, тогда я захожу на официальный YouTube Iframe Api, где я нашел это:
и побродить, чтобы увидеть, что официальная страница также сталкивается с этой проблемой Просто зайдите на официальный Youtube Iframe Api и посмотрите логи консоли. Моя версия Chrome 79.0.3945.88.
источник
мой был:
Я просто удалил строку с playerVars, и она работала без ошибок на консоли.
источник