从函数内部声明一个全局变量

我有以下代码,需要使用Javascript API在我的页面中跟踪嵌入的Youtube视频:

function onYouTubePlayerReady(playerId) {
      var youtubeplayer = document.getElementById('youtubeplayer');
      youtubeplayer.addEventListener("onStateChange", "onytplayerStateChange");
      youtubeplayer.setPlaybackQuality('large');
      }

function onytplayerStateChange(newState) {
    //Make it autoplay on page load
    if (newState == -1) {
        youtubeplayer.playVideo();
        }

    var tiempo = youtubeplayer.getCurrentTime();
    //Rounds to 2 decimals
    var tiempo = Math.round(tiempo*100)/100;
    alert(tiempo);
    }

(有关Youtube API的细节并不重要,但如果您好奇,他们在我以前的问题Youtube Javascript API:不在IE中工作)。

现在,我的问题是,onYoutubePlayerReady()函数声明“youtubeplayer”,它是一个DOM对象的引用,我需要从另一个函数onytplayerstateChange()中访问该变量......但是“youtubeplayer”正在声明中作为局部变量。 这适用于IE 8,Safari ...,但在Firefox 12中不起作用。当然,我可以通过以下方式获得对“youtubeplayer”的引用,而不使用“var”:

youtubeplayer = document.getElementById('youtubeplayer');

事实上,这就是它在Youtube示例代码中的样子,但是如果我这样编写代码,代码在IE 8中不起作用(虽然它在Firefox 12中工作;请参阅我的上一个问题以获取更多详细信息)。

...所有这些让我:有没有办法从函数内部声明一个全局变量(比如上面的“youtubeplayer”),以便它可以被其他函数访问? 什么东西适用于所有浏览器?


另一种声明全局变量的方法是将其作为全局“窗口”对象的一个​​额外属性来创建它 - 也是如此

window.youtubeplayer = document.getElementById('youtubeplayer'); 

这应该可以在页面上的任何其他位置访问。 所以你的完整代码看起来像这样;

function onYouTubePlayerReady(playerId) {
  window.youtubeplayer = document.getElementById('youtubeplayer');
  window.youtubeplayer.addEventListener("onStateChange", "onytplayerStateChange");
  window.youtubeplayer.setPlaybackQuality('large');
}

function onytplayerStateChange(newState) {
  //Make it autoplay on page load
  if (newState == -1) {
    window.youtubeplayer.playVideo();
  }

  var tiempo = window.youtubeplayer.getCurrentTime();
  //Rounds to 2 decimals
  var tiempo = Math.round(tiempo*100)/100;
  alert(tiempo);
}

您可以在ready函数中创建一个事件处理函数,并直接传递它,如下所示,而不是将onytplayerStateChange函数的字符串引用传递给事件侦听器:

function onYouTubePlayerReady(playerId) {
    var youtubeplayer = document.getElementById('youtubeplayer');
    var stateChangeHandler = function (newState) {
        //Make it autoplay on page load
        if (newState == -1) {
            youtubeplayer.playVideo();
        }
        var tiempo = youtubeplayer.getCurrentTime();
        //Rounds to 2 decimals
        var tiempo = Math.round(tiempo*100)/100;
        alert(tiempo);
    };
    youtubeplayer.addEventListener("onStateChange", stateChangeHandler);
    youtubeplayer.setPlaybackQuality('large');
}

甚至直接传递匿名函数:

function onYouTubePlayerReady(playerId) {
    var youtubeplayer = document.getElementById('youtubeplayer');
    youtubeplayer.addEventListener("onStateChange", function (newState) {
        //Make it autoplay on page load
        if (newState == -1) {
            youtubeplayer.playVideo();
        }
        var tiempo = youtubeplayer.getCurrentTime();
        //Rounds to 2 decimals
        var tiempo = Math.round(tiempo*100)/100;
        alert(tiempo);
    });
    youtubeplayer.setPlaybackQuality('large');
}

这保留了“onYouTubePlayerReady”函数内youtubeplayer变量的范围,并绕过了建立全局变量的需要。

链接地址: http://www.djcxy.com/p/95033.html

上一篇: Declare a global variable from inside a function

下一篇: html/javascript/php: how do i use a "global variable"?