我们有一个包含 YouTube 视频的 Facebook Tab 应用程序(可能不相关)。
第一次从空缓存加载页面时一切正常。然而,在随后的页面加载中,一旦视频停止加载,onStateChange
处理程序就不会在 Internet Explorer 中触发。
在 Chrome 和 Firefox 中一切正常,这个问题似乎只影响 IE,而且奇怪的是,只发生在非空缓存中。它看起来与gdata-issues #2942非常相似,除了那个问题有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指出我的代码示例使用了swfobject.embedSWF
代码,而不是iframe 嵌入代码。
我们最初确实使用了 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 的问题。