Oto komunikat o błędzie, który otrzymuję:
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').
Widziałem inne podobne problemy, w których znajduje się źródło docelowe http://www.youtube.com
i źródło odbiorcy https://www.youtube.com
, ale żaden nie przypomina mojego, gdzie jest cel https://www.youtube.com
i źródło jest http://localhost:9000
.
- Nie mam problemu. Jaki jest problem?
- Jak mogę to naprawić?
javascript
angularjs
youtube
youtube-api
youtube-iframe-api
Adam Zerner
źródło
źródło
Odpowiedzi:
Uważam, że jest to problem z docelowym pochodzeniem
https
. Podejrzewam, że dzieje się tak, ponieważ Twój adres URL iFrame używahttp
zamiasthttps
. Spróbuj zmienić adres URL pliku, który próbujesz osadzićhttps
.Na przykład:
być:
źródło
http
vs.https
? Nie ma znaczenia, że domeny się różnią (youtube vs. localhost)? A czym dokładnie jest pochodzenie docelowe w porównaniu do pochodzenia odbiorcy? Jak zmieniłeś pochodzenie odbiorcy (mój adres URL to nadal localhost: 9000)?localhost:9000
. Problem polegał w rzeczywistości na sposobie korzystania z interfejsu youtube-api. Deklarując api tak, jaktag.src = "https://www.youtube.com/iframe_api";
w kodzie, mówisz youtube, że chcesz używać ssl. Tak więc zmiana, którą zasugerowałem, zmieniła cię na używanie SSL do żądania filmów. Błąd był po prostu informacją, że mieszasz wywołania SSL i inne niż SSL.playerEl = document.querySelector('iframe#ytplayer'); anotherEl.appendChild(playerEl); // yt complains on subsequent api calls
Po prostu dodaj parametr
"origin"
z adresem URL swojej witryny doparamVars
atrybutu odtwarzacza, na przykład:źródło
window.location.origin
..window.location
to obiekt.window.location.host
Wydaje się, że ustawienie tego rozwiązuje problem:
źródło
http
(zamiasthttps
) rozwiązało mój problem.host: `${window.location.protocol}//www.youtube.com`
,Możesz zapisać JavaScript w lokalnych plikach:
W pierwszym pliku
player_api
umieść ten kod:W drugim pliku znajdź kod:
this.a.contentWindow.postMessage(a,b[c]);
i zamień na:
Oczywiście można połączyć w jeden plik - będzie bardziej wydajne. To nie jest idealne rozwiązanie, ale działa!
Moje źródło: yt_api-concat
źródło
Upewnij się, że ładujesz z adresu URL, takiego jak:
https://www.youtube.com/embed/HIbAz29L-FA?modestbranding=1&playsinline=0&showinfo=0&enablejsapi=1&origin=https%3A%2F%2Fintercoin.org&widgetid=1
Zwróć uwagę na składnik „origin”, a także „enablejsapi = 1”. Pochodzenie musi być zgodne z Twoją domeną, a wtedy zostanie umieszczone na białej liście i będzie działać.
źródło
Spróbuj użyć
window.location.href
adresu URL, aby dopasować pochodzenie okna.źródło
Mam ten sam błąd. Mój błąd polegał na tym, że
enablejsapi=1
parametr nie był obecny wiframe
src.źródło
Myślę, że opis błędu jest mylący i pierwotnie dotyczy złego użycia obiektu gracza.
Miałem ten sam problem podczas przełączania się na nowe filmy w suwaku.
Po prostu przy użyciu
player.destroy()
funkcji opisanej tu problem znika.źródło
Miałem ten sam problem i okazuje się, że było to spowodowane uruchomionym rozszerzeniem Chrome „HTTPS Everywhere”. Wyłączenie rozszerzenia rozwiązało mój problem.
źródło
Dokładnie ten błąd był związany z blokowaniem treści przez YouTube podczas „odtwarzania w niektórych witrynach lub aplikacjach”. Dokładniej przez WMG (Warner Music Group).
Komunikat o błędzie sugerował jednak, że problemem był import elementu iframe https do witryny http, czego nie było w tym przypadku.
źródło
Usuń DNS Prefetch rozwiąże ten problem.
Jeśli korzystasz z WordPressa, dodaj ten wiersz do pliku functions.php swojego motywu
źródło
Możesz zmienić element iframe na taki i dodać źródło do bieżącej witryny internetowej. Rozwiązuje to błąd w mojej przeglądarce.
ref: https://developers.google.com/youtube/iframe_api_reference#Loading_a_Video_Player
źródło
Może istnieć dowolna z poniższych sytuacji, ale wszystkie prowadzą do DOM, który nie został załadowany przed uzyskaniem do niego dostępu przez skrypt javascript.
Oto, co musisz upewnić się, zanim faktycznie wywołasz kod JS: * Upewnij się, że kontener został załadowany przed wywołaniem jakiegokolwiek kodu JavaScript * Upewnij się, że docelowy adres URL jest załadowany do dowolnego kontenera, który ma
Natknąłem się na podobny problem, ale na moim lokalnym, gdy próbuję uruchomić mój Javascript na długo przed onLoad strony głównej, co powoduje komunikat o błędzie. Naprawiłem to, po prostu czekając na załadowanie całej strony, a następnie wywołując wymaganą funkcję.
Możesz to po prostu zrobić, dodając funkcję limitu czasu po załadowaniu strony i wywołać zdarzenie onload, takie jak:
window.onload = new function () {setTimeout (function () {// jakieś zdarzenie onload}, 10); }
to zapewni, że to, co próbujesz, zostanie wykonane dobrze po wyzwoleniu onLoad.
źródło
document.addEventListener("DOMContentLoaded", function () {
niestety nie pomogło.Ten komunikat jest również wyświetlany, gdy nie określisz targetOrigin w wywołaniach funkcji
window.postMessage()
.W tym przykładzie wysyłamy wiadomość do pierwszego elementu iFrame i używamy go
*
jako celu, co powinno pozwolić na komunikację z dowolnym targetOrigin.źródło
W moim przypadku przynajmniej wydaje się to nieszkodliwym warunkiem „niegotowym”, że API ponawia próby, aż się powiedzie.
Dostaję od dwóch do dziewięciu z nich (na moim testerze najgorszych przypadków, FossilBook 2009 z 20 otwartymi zakładkami przez hotspot komórkowy) ... ale wtedy wideo działa poprawnie. Po uruchomieniu moich wywołań opartych na postMessage do seekTo zdecydowanie działa, nie testowałem innych.
źródło
W niektórych przypadkach (jak wspomniał jeden z komentatorów) może to być spowodowane przenoszeniem odtwarzacza w ramach DOM, np.
append
Itp.źródło
Możesz spróbować :
źródło
Miałem również ten sam problem, a potem odwiedziłem oficjalny interfejs YouTube Iframe Api, gdzie znalazłem to:
i wędruj, aby zobaczyć, że ta oficjalna strona również została dotknięta tym problemem. Po prostu odwiedź oficjalny interfejs API iframe w serwisie Youtube i zobacz dzienniki konsoli. Moja wersja Chrome to 79.0.3945.88.
źródło
Moje było:
Właśnie usunąłem linię z playerVars i działało bez błędów na konsoli.
źródło