YouTube ビデオを含む Facebook タブ アプリケーション (おそらく関係ありません) があります。
ページが空のキャッシュから最初に読み込まれたときに、すべてが正常に機能します。ただし、その後のページの読み込みでは、ビデオの読み込みが停止するとonStateChange
、Internet Explorer でハンドラーが起動しなくなります。
Chrome と Firefox ではすべて正常に動作します。この問題は IE にのみ影響するようで、奇妙なことに、空でないキャッシュからのみ発生します。問題が. _Status: Fixed
コードの関連するチャンクは次のとおりです。
ページ
<!DOCTYPE html>
...
<div class="player-surround">
<div id="ytplayer">
You need Flash player 9+ and JavaScript enabled to view this video.
</div>
</div>
...
<script src="//ajax.googleapis.com/ajax/libs/swfobject/2.2/swfobject.js"></script>
<script type="text/javascript">
var params = { allowScriptAccess: "always" };
var atts = { id: "ytplayer" };
// YouTube video ID redacted here
swfobject.embedSWF("http://www.youtube.com/v/XXXXXXXXXXXXXX?enablejsapi=1&playerapiid=ytplayer&version=3",
"ytplayer", "587", "330", "8", null, null, params, atts);
</script>
<script src="//www.youtube.com/player_api"></script>
含まれる JavaScript
MFA.onPlayerStateChange = function(evt) {
var state = this.getPlayerState();
log('158: STATE CHANGED: ' + state);
// Then do some stuff, but the `log` call above doesn't fire
}
MFA.getPlayerState = function() {
var playerState;
if (this.ytplayer) {
playerState = this.ytplayer.getPlayerState();
switch (playerState) {
case 5: return 'video cued';
case 3: return 'buffering';
case 2: return 'paused';
case 1: return 'playing';
case 0: return 'ended';
case -1: return 'unstarted';
default: return 'Status uncertain';
}
}
};
(明らかに、私はこの問題に関係のないコードをたくさん見逃していました。)
IEが以前にページを見たことがない限り、なぜすべてがうまくいくのか、誰にも考えがありますか? IE では機能しなかったかどうかは理解できましたが、キャッシュが空の場合は問題なく機能しますが、ページをリロードすると失敗します。
すべてのアイデアに感謝します。
編集
Greg Schechterは、私のコード サンプルがiframe 埋め込みコードswfobject.embedSWF
ではなくコードを使用していることを指摘しました。
元々は iframe 埋め込みコードを使用していました。
var s = {
playerHeight: '330',
playerWidth: '587',
playerVars: { 'rel': 0 },
videos: {
stage1: 'XXXXXXXXXXXXXX', // ...
}
};
window.onYouTubePlayerAPIReady = function() {
MFA.ytplayer = new YT.Player('ytplayer', {
height: s.playerHeight,
width: s.playerWidth,
videoId: s.videos.stage1,
playerVars: s.playerVars,
events: {
'onReady': $.proxy(MFA.onPlayerReady, MFA),
'onStateChange': $.proxy(MFA.onPlayerStateChange, MFA),
'onError': $.proxy(MFA.onPlayerError, MFA)
}
});
}
、しかし、これは同じ問題を示していました。その後、問題を修正する試みとしてコードが追加されました。swfobject.embedSWF
これは、IE が iframe からドメインをまたがる API アクセスに過度に偏執的であるという問題が以前に見られたためです。