在Javascript中使用回调函数

时间:2014-06-10 23:57:38

标签: javascript html asynchronous youtube

错误再现步骤:

  • 打开http://jaminweb.com/YoutubePlaylist.html
  • 在播放列表中输入sMqNFAU0tOw(或任何其他Youtube视频ID)
  • 点击播放视频!
  • JavaScript控制台应该说像Uncaught 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,仅当已创建标识为ytplayer.playVideo();的{​​{1}}对象时,我才会调用swf

相关文档:

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

1 个答案:

答案 0 :(得分:0)

这适用于chrome。在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
            }
        }
    } 
相关问题