2012-03-20 147 views
7

我将youtube视频添加到公司网站,并希望它们能够在非闪存设备上显示。我一直在玩YouTube的iframe API,并更新了其中的一个示例,以允许用户点击链接来更改iframe中的视频。编辑的代码是:youtube iframe api loadVideoById()error

<!DOCTYPE HTML> 
<html> 
<body> 
<div id="player"></div> 
<script> 
var tag = document.createElement('script'); 
tag.src = "http://www.youtube.com/player_api"; 
var firstScriptTag = document.getElementsByTagName('script')[0]; 
firstScriptTag.parentNode.insertBefore(tag, firstScriptTag); 
var done = false; 
var player; 
function onYouTubePlayerAPIReady() { 
    player = new YT.Player('player', { 
     height: '390', 
     width: '640', 
     videoId: 'JW5meKfy3fY', 
     events: { 
     'onReady': onPlayerReady, 
     'onStateChange': onPlayerStateChange 
     } 
    }); 
} 
function onPlayerReady(evt) { 
    evt.target.playVideo(); 
} 
function onPlayerStateChange(evt) { 
    if (evt.data == YT.PlayerState.PLAYING && !done) { 
     setTimeout(stopVideo, 6000); 
     done = true; 
    } 
} 
function stopVideo() { 
    player.stopVideo(); 
} 

function loadVideo(videoID) { 
    if(player) { player.loadVideoById(videoID); } 
} 

</script> 

<a href="javascript:loadVideo('kGIjetX6TBk');">Click me to change video</a> 

</body> 
</html> 

我说的唯一的事情是:

function loadVideo(videoID) { 
    if(player) { player.loadVideoById(videoID); } 
} 

能正常工作在Safari,Chrome和Firefox,但在IE7中,8或9不起作用在IE7和8它会返回一个错误“对象不支持这个属性或方法”。

这是API的问题还是我做错了什么?

回答

5

我也有类似的问题,事实证明,你不应该调用任何YT.Player对象(包括loadVideoById)的方法,只要onPlayerReady没有被调用。

做检查if(player) {...}是不够的,Player对象将被创建,并且一些属性已经可用,没有你需要的方法可用。

+4

解决了它。 '...事件:{'onReady':function(){...}' – Xeoncross 2013-07-09 16:52:07

3

您将需要从onPlayerReady事件调用加载视频功能。

例如,如果你想点击缩略图做到这一点,当视频加载(这可能需要jQuery的,但它应该传达出点):

function onPlayerReady(evt) { 

    evt.target.playVideo(); 

    //declare the click even function you want 
    $('#thumbs a).click(function(){ 

    //get a data-video-id attr from the <a data-video-id="XXXXXX"> 
    var myvideo = $(this).attr('data-video-id'); 

    //call your custom function 
    loadVideo(myvideo); 

    //prevent click propagation 
    return false; 
    }); 
} 

这样可以确保玩家加载。

+0

嘿,我正面临同样的问题。我确信在调用loadVideo()之前调用了onPlayerReady。虽然我没有在onPlayerReady函数中调用loadVideo。我在onPlayerStateChange函数中调用它。可能是什么问题? – 2013-12-27 04:42:51

0

在我的点击事件处理程序中调用player.loadVideoById之后,通过return false防止点击传播对我来说确实有效。