'DOMWindow'에서 'postMessage'를 실행하지 못했습니다 : https://www.youtube.com! == http : // localhost : 9000


167

이것은 내가 얻는 오류 메시지입니다.

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.

  1. 문제가 없습니다. 무엇이 문제입니까?
  2. 어떻게 고칠 수 있습니까?


4
나는 같은 문제가 있었고 @ChrisFranklin의 아래 수정은 나를 위해 수정했습니다. 그러나 이상한 점은 내 문제로 약 절반의 시간 만 오류가 발생하지만 비디오가 여전히로드된다는 것입니다 (다른 것은 깨질 것입니다).
dgo

1
@ dgo와 같은 문제로 페이지로드시 무작위였습니다. 실제 iframe 컨텐츠가 다른 무언가가 postMessage를 시도 할 때 완전히 준비되지 않았기 때문에 그 결과가 나옵니다. 경쟁 조건입니다. 그리고 postMessage가 나중에 발생하면 (사용자 작업) 오류없이 정상적으로 작동합니다.
IncredibleHat

구글조차도 그 자체가 오류가 있습니다 -콘솔을 열고 여기에서 비디오를 재생하십시오 : developers.google.com/youtube/iframe_api_reference
T.Todua

답변:


92

나는 이것이 목표 원점 인 문제라고 생각합니다 https. iFrame URL http대신을 사용하고 있기 때문 입니다 https. 포함시키려는 파일의 URL을로 변경하십시오 https.

예를 들어 :

'//www.youtube.com/embed/' + id + '?showinfo=0&enablejsapi=1&origin=http://localhost:9000';

되려고:

'https://www.youtube.com/embed/' + id + '?showinfo=0&enablejsapi=1&origin=http://localhost:9000';

2
그것은 효과가 있었던 것 같습니다. 감사! 따라서 문제는 httpvs. https? 도메인이 다르더라도 상관 없습니다 (youtube와 localhost)? 대상 출처와 수신자 출처는 정확히 무엇입니까? 수신자의 출처를 변경 한 내용을 어떻게 수행 했습니까 (내 URL은 여전히 ​​localhost : 9000입니다)?
Adam Zerner

30
오류는 약간 오해의 소지가 있습니다. 그것은 실제로 당신과 관계가 없습니다 localhost:9000. 문제는 실제로 youtube-api를 사용하는 방식에 있습니다. tag.src = "https://www.youtube.com/iframe_api";코드에서 와 같이 api를 선언하면 ssl을 사용하고 싶다고 YouTube에 알립니다. 그래서 제안한 변경 사항으로 인해 ssl을 사용하여 비디오를 요청했습니다. 오류는 ssl과 non-ssl 호출을 혼합하고 있다고 말하는 것입니다.
Chris Franklin

9
돔에서 iframe을 움직일 때이 문제가 발생했습니다. playerEl = document.querySelector('iframe#ytplayer'); anotherEl.appendChild(playerEl); // yt complains on subsequent api calls
posit labs

1
YouTube 플레이어를로드하기 위해 자바 스크립트를 사용하는 경우 어떻게 되나요?
N3R4ZZuRR0 2016 년

5
YouTube의 경우 https : //로 변경되었으며 도메인이 https : //인데도 여전히 문제가 해결되지 않습니다. 'DOMWindow'에서 'postMessage'를 실행하지 못했습니다 : 제공된 대상 출처 ( ' youtube.com ')가 수신자 창의 출처 ( ' test.dev ') 와 일치하지 않습니다 .
vee

24

다음 과 같이 플레이어 속성에 "origin"사이트의 URL과 매개 변수 를 추가하십시오 paramVars.

this.player = new window['YT'].Player('player', {
    videoId: this.mediaid,
    width:'100%',
    playerVars: { 'autoplay': 1, 'controls': 0,'autohide':1,'wmode':'opaque','origin':'http://localhost:8100' },
}

7
원산지 : window.location, 개발 및 생산을 다루는 속성
James Bailey

3
@JamesBailey window.location.origin.. window.location는 객체입니다.
Acidic9

API 문서에서 알 수 있듯이 origin playerVar는 순수한 iframe 구현에서만 사용됩니다. JS API가 아닙니다.
Damien C

1
이러한 모든 '수정 사항'은 2020 년에 여기에서 작동하지 않습니다. 또한 오류가 표시되면 페이지 당 임의의 부하가 추가됩니다. 우리 사이트와 YouTube 간의 경쟁 조건입니다.
IncredibleHat

window.location.host
LeeGee

19

이것을 설정하면 해결되는 것 같습니다.

  this$1.player = new YouTube.Player(this$1.elementId, {
    videoId: videoId,
    host: 'https://www.youtube.com',

3
그것을 만들기 http (대신 https) 내 문제를 해결했다.
T.Todua

5
이것은 나를 위해 그것을 고쳤다. 또한 수행 할 수 있습니다 host: `${window.location.protocol}//www.youtube.com`,
조엘 Worsham

2
이러한 모든 '수정 사항'은 2020 년에 여기에서 작동하지 않습니다. 또한 오류가 표시되면 페이지 당 임의의 부하가 추가됩니다. 우리 사이트와 YouTube 간의 경쟁 조건입니다.
IncredibleHat

8

JavaScript를 로컬 파일로 저장할 수 있습니다 :

첫 번째 파일 player_api에 다음 코드를 입력하십시오.

if(!window.YT)var YT={loading:0,loaded:0};if(!window.YTConfig)var YTConfig={host:"https://www.youtube.com"};YT.loading||(YT.loading=1,function(){var o=[];YT.ready=function(n){YT.loaded?n():o.push(n)},window.onYTReady=function(){YT.loaded=1;for(var n=0;n<o.length;n++)try{o[n]()}catch(i){}},YT.setConfig=function(o){for(var n in o)o.hasOwnProperty(n)&&(YTConfig[n]=o[n])}}());

두 번째 파일에서 코드를 찾으십시오. this.a.contentWindow.postMessage(a,b[c]);

그것을 다음으로 대체하십시오 :

if(this._skiped){
    this.a.contentWindow.postMessage(a,b[c]); 
}
this._skiped = true;

물론 하나의 파일로 연결할 수 있습니다-더 효율적입니다. 이것은 완벽한 솔루션은 아니지만 작동합니다!

내 출처 : yt_api-concat


나를 위해 고쳤다. 어쨌든 파일이 로컬에 있었으므로 사용 사례에 맞았습니다.
자주

이것은 나에게도 효과가 있었지만 왜 그런지 잘 모르겠습니다. 이것이 왜 해결되는지 설명 할 수 있습니까?
jchavannes

1
감사합니다, 두 번째 아약스 전화에 내 질문에 대답 : stackoverflow.com/questions/58232081/…
Diogo Almeida

필자의 견해로는 라이브러리, 특히 타사 서비스 라이브러리에 로컬 파일을 사용하는 것은 코딩하기에 매우 나쁜 방법입니다. 아니 ?
Damien C

@DamienC 확실히 이상적이지는 않습니다. 그러나이 스레드의 다른 모든 "수정 사항"을 기반으로 API 코드를 수동으로 변경하는 다른 개발자는 놀랍지 않습니다.
Erutan409


3

window.location.href창의 원점과 일치하도록 URL을 사용해보십시오 .


니스, 나는 다른 모든 대답을 시도했고 이것은 나를 위해 일했다!
Kloshar4o

3

같은 오류가 발생했습니다. 내 실수는 enablejsapi=1매개 변수가 iframesrc 에 없다는 것 입니다.


0

나는 그 오류에 대한 설명이 오해의 소지가 있으며 원래 플레이어 객체의 잘못된 사용법과 관련이 있다고 생각합니다.

슬라이더에서 새 비디오로 전환 할 때도 같은 문제가있었습니다.

여기설명player.destroy()기능을 사용하면 문제가 사라집니다.


YouTube에서 내가 겪고있는 일과 관련이 있는지 이해해 주시겠습니까? stackoverflow.com/q/57649870/470749 아마도 대답이있을 것입니다. 감사!
Ryan

0

동일한 문제가 발생했으며 Chrome 확장 프로그램 'HTTPS Everywhere'가 실행 중이었기 때문입니다. 확장 기능을 비활성화하면 문제가 해결되었습니다.


0

이 정확한 오류는 "특정 사이트 나 응용 프로그램에서 재생 될 때"Youtube의 콘텐츠 블록과 관련이 있습니다. 더 구체적으로 WMG (Warner Music Group).

그러나 오류 메시지는 http 사이트로의 https iframe 가져 오기가이 문제가 아니라고 제안했습니다.


0

DNS 프리 페치를 제거하면이 문제가 해결됩니다.

WordPress를 사용하는 경우 테마의 함수에이 줄을 추가하십시오.

remove_action( 'wp_head', 'wp_resource_hints', 2 );


0

다음 중 하나가있을 수 있지만 모두 자바 스크립트가 액세스하기 전에 DOM으로로드되지 않습니다.

실제로 JS 코드를 호출하기 전에 확인해야 할 사항은 다음과 같습니다. * 자바 스크립트를 호출하기 전에 컨테이너가로드되었는지 확인하십시오.

비슷한 문제가 발생했지만 메인 페이지의 onLoad 전에 Javascript를 제대로 실행하려고하면 로컬에서 오류 메시지가 발생했습니다. 전체 페이지가로드 될 때까지 기다린 다음 필요한 함수를 호출하여 문제를 해결했습니다.

페이지가로드 될 때 타임 아웃 기능을 추가하고 다음과 같이 onload 이벤트를 호출하면됩니다.

window.onload = new function () {setTimeout (function () {// 일부 onload 이벤트}, 10); }

onLoad가 트리거 된 후에 시도중인 것이 잘 실행될 것입니다.


document.addEventListener("DOMContentLoaded", function () {불행히도 모든 것을 안에 넣는 것은 도움이되지 않았습니다.
Ryan

0

에 대한 호출에서 targetOrigin 을 지정하지 않으면이 메시지가 표시됩니다 window.postMessage().

이 예제에서는 첫 번째 iFrame에 메시지를 게시하고 *targetOrigin과의 통신을 허용하는 대상으로 사용 합니다.

window.frames[0].postMessage({
                    message : "Hi there",
                    command :"hi-there-command",
                    data : "Some Data"
                }, '*')

0

필자의 경우 적어도 이것은 API가 성공할 때까지 재 시도하는 무해한 "준비되지 않은"상태 인 것 같습니다.

나는 이것들 중 2에서 9까지 (내 최악의 경우 테스터, 셀룰러 핫스팟을 통해 열린 20 개의 탭이있는 2009 FossilBook) ....하지만 비디오가 올바르게 작동합니다. 그것이 내가 제대로 작동하기 위해 postMessage 기반 호출을 실행하면 다른 사람을 테스트하지 않았습니다.


0

경우에 따라 (한 의견자가 언급 한 것처럼) 플레이어를 DOM 등에서 플레이어 내에서 이동하는 경우이 문제가 발생할 수 있습니다 append.


-1

당신은 시도 할 수 있습니다 :

document.getElementById('your_id_iframe').contentWindow.postMessage('your_message', 'your_domain_iframe')

-1

나는 또한 같은 문제에 직면했다 . 나는 이것을 발견 한 공식 Youtube Iframe Api를 방문 한다.

사용자의 브라우저는 HTML5 postMessage 기능을 지원해야합니다. 대부분의 최신 브라우저는 postMessage를 지원합니다

공식 페이지에서도이 문제가 발생했음을 확인하십시오. 공식 Youtube Iframe Api를 방문 하여 콘솔 로그를 확인하십시오. 내 Chrome 버전은 79.0.3945.88입니다.


-2

광산은 :

<youtube-player
  [videoId]="'paxSz8UblDs'"
  [playerVars]="playerVars"
  [width]="291"
  [height]="194">
</youtube-player>

나는 playerVars로 라인을 제거했으며 콘솔에서 오류없이 작동했습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.