私の問題で非常に混乱しているので、前もってお詫び申し上げます。これが私の本番サイトで問題を引き起こしているので、私は本当に困っています。
私のサイトには、youtube、soundcloud、または vimeo でホストできる曲リストを再生する JavaScript プレーヤーがあります。昨日、プレーヤー ボタンで「スキップ」して新しい曲をロードしようとすると、通常このエラーが発生することに気付きました。このエラーは、ここ 1 日か 2 日で始まったばかりです。YouTube API のリリース ノートに新しい情報は見当たりません。このエラーは Chrome、Firefox、および Safari を使用して発生するため、ブラウザの変更とは関係ない可能性が高いです。ただし、18 日間新しいコードをプッシュしていないため、使用しているものは変更されています。
プレイリストの例はこちら: http://www.muusical.com/playlists/programming-music
エラーを再現する方法を分離したと思います。手順は次のとおりです。
- YouTube でホストされている曲を再生します。
- リスト内の他の曲にスキップします (スキップ ボタンを押すか、曲の行項目の再生ボタンを直接押します)。
*プレイリストの最初の曲が YouTube の曲の場合、最初に読み込まれた YouTube の曲を再生せずに別の曲にスキップすると、エラーが発生することに注意してください。
基本的に、YouTube の曲を読み込んだり再生したりして、別の曲にスキップしようとすると、エラーが発生するようです。
この動作の例外を見つけた場合はお知らせください。
コンソールに次のエラーが表示されます。
Failed to execute 'postMessage' on 'DOMWindow': The target origin provided ('https://www.muusical.com') does not match the recipient window's origin ('http://www.muusical.com').
YouTube JavaScript API を使用してプレーヤーをロードします。
new YT.Player('playlist-player', {
playerVars: { 'autoplay': 1, 'fs': 0 },
videoId: "gJ6APKIjFQY",
events: {
'onReady': @initPlayerControls,
'onStateChange': @onPlayerStateChange
}
})
この iframe を生成するもの:
<iframe id="playlist-player" frameborder="0" allowfullscreen="1" title="YouTube video player" width="640" height="360" src="https://www.youtube.com/embed/gJ6APKIjFQY?autoplay=1&enablejsapi=1&origin=http%3A%2F%2Fwww.muusical.com"></iframe>
上記の YouTube の曲からスキップすると、iframe に次のように読み込まれます。
<iframe id="playlist-player" frameborder="0" allowfullscreen="1" title="YouTube video player" width="640" height="360" src=""></iframe>
YouTube、soundcloud、vimeo の曲をサポートしています。YouTube の曲が読み込まれると、「オリジン」が http から https に変わるようです。プレイリスト全体が youtube のみの場合でもこのエラーが発生し、soundcloud と vimeo の曲のみで構成されるプレイリストでは発生しないため、他のホストの埋め込み方法を含める必要はないと思います。
また、これはYouTubeのjavascriptをロードする方法です:
// Load the IFrame Player API code asynchronously.
var tag = document.createElement('script');
tag.src = "https://www.youtube.com/player_api";
var firstScriptTag = document.getElementsByTagName('script')[0];
firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);
何か明確にする必要がある場合はお知らせください。ご覧いただきありがとうございます。