告诉javascript中何时完成多个onLoad事件

告诉javascript中何时完成多个onLoad事件,javascript,jquery,onload-event,Javascript,Jquery,Onload Event,我必须加载两个API。YouTube api在加载时调用onYouTubePlayerReady,另一个用于SoundManager的api在加载时调用SoundManager.onready(…)。我在每个ready函数中都做了大量工作来准备站点。但是,我还需要知道这两个都是何时完成的,这样我就可以进行更多的初始化,这需要两个都完全加载。知道如何在调用这两个ready函数时调用一个函数吗?对这两个函数都使用回调 var callback = (function(){ var coun

我必须加载两个API。YouTube api在加载时调用
onYouTubePlayerReady
,另一个用于SoundManager的api在加载时调用
SoundManager.onready(…)
。我在每个
ready
函数中都做了大量工作来准备站点。但是,我还需要知道这两个都是何时完成的,这样我就可以进行更多的初始化,这需要两个都完全加载。知道如何在调用这两个
ready
函数时调用一个函数吗?

对这两个函数都使用回调

var callback = (function(){

    var count = 0;

    return function(){
         count++;
         if(count === 2){
            //both ran and do something
         }
    }

})();
然后,在两个OnLoad结束时,只需执行以下操作:

callback();
if语句中的内容只会在第二次调用此函数时运行


小提琴演示:

对它们都使用回调

var callback = (function(){

    var count = 0;

    return function(){
         count++;
         if(count === 2){
            //both ran and do something
         }
    }

})();
然后,在两个OnLoad结束时,只需执行以下操作:

callback();
if语句中的内容只会在第二次调用此函数时运行


小提琴演示:

只需设置几个标志:

var aDone = false;
var bDone = false;

function whenADone(){
  // do your other stuff

  aDone = true;

  if(bDone) whenBothDone();
}

function whenBDone(){
  // do your other stuff

  bDone = true;

  if(aDone) whenBothDone();
}

只需设置几个标志:

var aDone = false;
var bDone = false;

function whenADone(){
  // do your other stuff

  aDone = true;

  if(bDone) whenBothDone();
}

function whenBDone(){
  // do your other stuff

  bDone = true;

  if(aDone) whenBothDone();
}

您可以让两个
ready
将布尔值设置为true,然后对
$(document.ready)进行测试(函数(){if(youTube==true&&soundManager==true){//Do stuff})

您可以让您的两个
ready设置一个布尔值为true,然后针对这些布尔值测试
$(document).ready(函数(){if(youTube==true&&soundManager==true){//Do stuff})

可能有更好的方法处理延迟的,但这很简单,应该可以工作。只需记录加载的内容和未加载的内容

var status = {
  youtube: false,
  sound: false
};

var loaded = function() {
  if (!status.youtube) return;
  if (!status.sound) return;

  // load stuff!
};

var onYoutubePlayerReady = function() {
  status.youtube = true;
  loaded();
};

soundManager.onready = function() {
  status.sound = true;
  loaded();
}

也许有更好的方法来处理延迟的问题,但这很简单,应该可以奏效。只需记录加载的内容和未加载的内容

var status = {
  youtube: false,
  sound: false
};

var loaded = function() {
  if (!status.youtube) return;
  if (!status.sound) return;

  // load stuff!
};

var onYoutubePlayerReady = function() {
  status.youtube = true;
  loaded();
};

soundManager.onready = function() {
  status.sound = true;
  loaded();
}

如果使用jQuery,请查看以下内容:


谢谢

如果使用jQuery,请查看以下内容:

感谢使用,您可以为每个就绪功能构建承诺,并将其与结合起来以触发最终操作。比如说

function promiseYoutube() {
    var dfd = $.Deferred();
    window.onYoutubePlayerReady = function() {
        console.log("Youtube");
        dfd.resolve();
    };
    return dfd.promise();
}

function promiseSoundManager() {
    var dfd = $.Deferred();
    window.soundManager.onready = function() {
        console.log("SoundManager");
        dfd.resolve();
    };
    return dfd.promise();
}

$.when( promiseYoutube(), promiseSoundManager() ).then(function(){
    console.log('Youtube+SoundManager');
});
通过一个Fiddle模拟这些回调

,您可以为每个就绪函数构建承诺,并将它们与结合起来以触发最终操作。比如说

function promiseYoutube() {
    var dfd = $.Deferred();
    window.onYoutubePlayerReady = function() {
        console.log("Youtube");
        dfd.resolve();
    };
    return dfd.promise();
}

function promiseSoundManager() {
    var dfd = $.Deferred();
    window.soundManager.onready = function() {
        console.log("SoundManager");
        dfd.resolve();
    };
    return dfd.promise();
}

$.when( promiseYoutube(), promiseSoundManager() ).then(function(){
    console.log('Youtube+SoundManager');
});

而一把小提琴模拟这些回调

答案,只使用链接并没有那么有用,请解释延迟回复在这种情况下是如何有用的。链接是可以的,但我不需要转到其他页面来了解你的意思。一个进一步解释的链接是可以的。只有链接的答案没有那么有用,请解释延迟回答在这种情况下是如何有用的。链接是可以的,但我不需要转到其他页面来了解你的意思。进一步解释的链接是可以的。@Raynos哈哈,我甚至不知道abt:-P@AlexisK没问题,我很乐意help@Raynos哈哈,我甚至不知道:-P@AlexisK没问题,很乐意帮忙,很酷。谢谢你的回答。它会起作用,但对于问题来说要复杂一点。不过,我下次一定会记住这一点。谢谢,很酷。谢谢你的回答。它会起作用,但对于问题来说要复杂一点。不过,我下次一定会记住这一点。谢谢