2014-06-10 70 views
0

错误再现步骤:使用一个回调函数在Javascript

  • 打开http://jaminweb.com/YoutubePlaylist.html
  • 输入sMqNFAU0tOw(或任何其他YouTube视频ID)到播放列表
  • 点击播放影片!
  • JavaScript控制台应该说,像未捕获TypeError: undefined is not a function

在尝试诊断问题:

播放影片!按钮调用下面的函数

 this.playAll = function() 
     { 
      var vidtexts = document.getElementsByClassName('vidtxt'); 
      for (var i = 0, j = vidtexts.length; i < j; ++i) 
      { 
       var thisid = vidtexts[i].value; 
       if (thisid.length > 0) 
       { 
        var thisurl = "http://www.youtube.com/v/" + thisid + "?enablejsapi=1&playerapiid=ytplayer&version=3";      
        var atts = { id: "myytplayer" }; 
        var params = { allowScriptAccess: "always" }; 

        swfobject.embedSWF(thisurl, "playerdiv", "425", "356", "8", null, null, params, atts, this.playVid); 

       } 
      } 
     } 

依次调用下面的函数

 this.playVid = function(e) 
     { 
      /* Callback function for swfobject.embedSWF(...), to play the video 
       if the flash player was loaded successfully. */ 
      if (e.success) 
      { 
       var ytplayer = document.getElementById("myytplayer"); 
       ytplayer.playVideo(); 
       while (ytplayer.getPlayerState() == 1) {;} // need to change this sometime lol 
      } 
     } 

控制台错误指向行

ytplayer.playVideo(); 

所以问题是对象ytplayer在调用playVideo()时尚未实例化。我不明白这是为什么,因为当我用我包括作为可选参数的函数

    swfobject.embedSWF(thisurl, "playerdiv", "425", "356", "8", null, null, params, atts, this.playVid); 

回调函数this.playVid我写信给调用只有当与ID myytplayer一个swf对象被创建ytplayer.playVideo();

相关文章:

https://code.google.com/p/swfobject/wiki/api#swfobject.embedSWF%28swfUrlStr,_replaceElemIdStr,_widthStr,_height

回答

0

这个工程铬。并在IE 10中。

VideoPlayer = function() { 
     this.addVideo = function() { 
      var newVidElement = document.createElement("div"); 
      newVidElement.className = "videl"; 
      newVidElement.innerHTML = "<p><textarea class='vidtxt'></textarea><img class='rembtn' src='remicon.png' width=20 height=20></img></p>"; 
      document.getElementById("vidplaydiv").appendChild(newVidElement); 
     } 
     this.playAll = function() { 
      var vidtexts = document.getElementsByClassName('vidtxt'); 
      for (var i = 0, j = vidtexts.length; i < j; ++i) { 
       var thisid = vidtexts[i].value; 
       if (thisid.length > 0) { 
        var thisurl = "http://www.youtube.com/v/" + thisid + "?enablejsapi=1&playerapiid=ytplayer&version=3"; 
        var atts = { 
         id: "myytplayer" 
        }; 
        var params = { 
         allowScriptAccess: "always" 
        }; 

        swfobject.embedSWF(thisurl, "playerdiv", "425", "356", "8", null, null, params, atts, this.playVid); 

       } 
      } 
     } 
     this.playVid = function (e) { 
      /* Callback function for swfobject.embedSWF(...), to play the video 
       if the flash player was loaded successfully. */ 
      if (e.success) { 
       var ytplayer = document.getElementById("myytplayer"); 
       ytplayer.playVideo(); 
       while (ytplayer.getPlayerState() == 1) {; 
       } // need to change this 
      } 
     } 
    }