#javascript #video #youtube-api
#javascript #Видео #youtube-api
Вопрос:
Когда я запускаю встроенное видео YouTube с iframe
помощью в моем браузере Chrome, используя API JavaScript встроенного видео YouTube, я получаю следующую ошибку в своей консоли:
www-widgetapi.js:581 Failed to execute 'postMessage' on 'DOMWindow': The target origin provided ('https://www.youtube.com') does not match the recipient window's origin ('https://symfony.XXXXXX.com')
.
Я обслуживаю веб-страницу, содержащую атрибут iframe
who src
, для которого установлен URL-адрес видео YouTube вместе с несколькими настройками в параметрах поиска URL, включая origin
параметр, установленный для URL-адреса моей веб-страницы. Вот iframe
:
"<iframe width="480" height="390" frameborder="0"
src="https://www.youtube.com/embed/rs50Ie1dHXg?autohide=1amp;autoplay=1amp;cc_load_policy=0amp;controls=0amp;disablekb=1amp;enablejsapi=1amp;fs=0amp;iv_load_policy=3amp;modestbranding=1amp;rel=0amp;showinfo=0amp;start=0amp;widgetid=1amp;origin=https://symfony.XXXXXX.com"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"></iframe>"
Я проверил вышеуказанное по содержимому объекта YouTube после выполнения следующих инструкций, и объект API YouTube правильно имел вышеуказанные значения. Вот инструкции, которые я использую для создания объекта API YouTube:
const IFRAME = document.querySelector( 'iframe#YouTube-Player.YouTube-iframe' );
const $IFRAME = $( IFRAME );
var switches = { 'autohide' : 1, 'autoplay' : 1,
'cc_load_policy' : 0, 'controls' : 0,
'disablekb' : 1, 'enablejsapi' : 1,
'fs' : 0, 'iv_load_policy' : 3,
'modestbranding' : 1, 'rel' : 0,
'showinfo' : 0, 'start' : 0,
'widgetid' : 1,
'origin' : window.location.origin };
//
// In my code I have a function that reads the switches object and assigns its
// contents them as a string to the iframe's src attribute, but for simplicity,
// I'm assigning that content directly to the end of the YouTube Video URL that
// I'm setting the iframe's src attribute to.
//
var str_switches = '?autohide=1amp;autoplay=1'
'amp;cc_load_policy=0amp;controls=0'
'amp;disablekb=1amp;enablejsapi=1'
'amp;fs=0amp;iv_load_policy=3'
'amp;modestbranding=1amp;rel=0'
'amp;showinfo=0amp;start=0'
'amp;widgetid=1'
'amp;origin=https://symfony.######.com";
IFRAME.src = 'https://www.youtube.com/embed/rs50Ie1dHXg'
'?autohide=1amp;autoplay=1'
'amp;cc_load_policy=0amp;controls=0'
'amp;disablekb=1amp;enablejsapi=1'
'amp;fs=0amp;iv_load_policy=3'
'amp;modestbranding=1amp;rel=0'
'amp;showinfo=0amp;start=0'
'amp;widgetid=1'
'amp;origin=https://symfony.######.com";
var youtubePlayer = new YT.Player( 'YouTube-Player',
{ videoId : 'rs50Ie1dHXg',
width : Math.max( IFRAME.clientWidth,
$IFRAME.width() ),
height : Math.max( IFRAME.clientHeight,
$IFRAME.height() ),
name : 'a_blank',
playerVars : switches,
events : { 'onError' : onError,
'onReady' : onPlayerReady,
'onStateChange' : onPlayerStateChange }
} );
Я не показываю обработчики onError
событий, onPlayerReady
, и onStateChange
, но они работают, видео воспроизводится, а функции onPlayerReady
и onStateChange
обработчики событий вызываются правильно, что позволяет мне отслеживать ход видео по мере его воспроизведения, паузы и завершения.
Как уже говорили другие, это сообщение вводит в заблуждение. Да, если бы я не запускал свой сайт с сайта YouTube, не было бы другой веской причины, по которой мой сайт origin
соответствовал бы цели origin
. Очевидно, что API YouTube жалуется на что-то еще.
Я рассмотрел все проблемы с переполнением стека по этому вопросу, а также то, что я мог найти в Интернете, но либо ответов не было, какие ответы были даны, не применялись, либо попытка нескольких, которые казались полезными, не устранила ошибку, которую я получаю, в том числе этоМне нужно было запустить свой веб-сайт с URL-адресом HTTPS и просто не указывать origin
параметр.
Почему возникает ошибка не удалось выполнить postMessage … и какое влияние это оказывает на мою способность отслеживать и контролировать воспроизведение видео.
Спасибо.
Комментарии:
1. Та же проблема. Удивлен, что никто еще не ответил на это. В каждом ответе, который я нахожу, говорится, что убедитесь, что и источник, и цель являются HTTPS. Но это не относится к вашей или моей проблеме. Вы когда-нибудь находили решение?
2. Аналогичная проблема, та же диагностика, она началась некоторое время назад на сайте WordPress (с редактором avia), где ранее видео загружалось без проблем. Насколько я могу судить, никаких обновлений или изменений на сайте не произошло, поэтому я списал это на некоторые изменения политики / API youtube. Оба сайта являются https, и использование http / https target / source ничего не меняет. К сожалению, сообщение, похоже, охватывает широкий спектр несвязанных проблем.
3. Похоже, что этот запрос, который вы делаете, похоже, имеет проблему с вашей стороны. Поскольку для меня это работает нормально. Я бы попробовал это на другом хосте, чтобы посмотреть, исправляет ли это что-нибудь.
4. Я когда-либо создавал приложение, которое управляло iframe Youtube, это было непросто. но это можно решить, сделав его PWA
5. Почти уверен, что это не имеет ничего общего с Youtube, кроме проблемы с вашим сайтом. Я просто скопировал приведенный выше iframe в codesandbox, и он загружается без указанной выше ошибки. Ссылка: codesandbox.io/s/snowy-moon-y5146?file=/src/index.js