onload如何在Javascript中工作?

时间:2015-08-21 04:24:41

标签: javascript html5 onload

在Pro HTML5 Games专辑中,有以下代码:

    // Load all data and images for a specific level
load:function(number){
    // declare a new currentLevel object
    game.currentLevel = { number: number, hero: [] };
    game.score = 0;
    $('#score').html('Score: '+game.score);
    var level=levels.data[number];

    //load the background, foreground, and slingshot images
    game.currentLevel.backgroundImage=loader.loadImage("images/backgrounds/"+level.background+
    ".png");
    game.currentLevel.foregroundImage=loader.loadImage("images/backgrounds/"+level.foreground+
    ".png");
    game.slingshotImage=loader.loadImage("images/slingshot.png");
    game.slingshotFrontImage =loader.loadImage("images/slingshot-front.png");

    //Call game.start() once the assets have loaded
    if(loader.loaded){
        game.start()
    } else {
        loader.onload = game.start;
    }
}

loader对象如下:

var loader= {
loaded:true,
loadedCount:0, // Assets that have been loaded so far
totalCount:0, // Total number of assets that need to be loaded

init:function(){
    // check for sound support
    var mp3Support,oggSupport;
    var audio =document.createElement('audio');
    if (audio.canPlayType) {
        // Currently canPlayType() returns: "", "maybe" or "probably"
        mp3Support ="" != audio.canPlayType('audio/mpeg');
        oggSupport ="" != audio.canPlayType('audio/ogg; codecs="vorbis"');
    } else {
        //The audio tag is not supported
        mp3Support =false;
        oggSupport =false;
    }
    // Check for ogg, then mp3, and finally set soundFileExtn to undefined
    loader.soundFileExtn =oggSupport?".ogg":mp3Support?".mp3":undefined;
},

loadImage:function(url){
    this.totalCount++;
    this.loaded =false;
    $('#loadingscreen').show();
    var image =new Image();
    image.src =url;
    image.onload =loader.itemLoaded;
    return image;
},

soundFileExtn:".ogg",

loadSound:function(url){
    this.totalCount++;
    this.loaded =false;
    $('#loadingscreen').show();
    var audio =new Audio();
    audio.src =url +loader.soundFileExtn;
    audio.addEventListener("canplaythrough", loader.itemLoaded, false);
    return audio;
},

itemLoaded:function(){
    loader.loadedCount++;
    $('#loadingmessage').html('Loaded '+loader.loadedCount+' of '+loader.totalCount);
    if (loader.loadedCount === loader.totalCount){
        // Loader has loaded completely..
        loader.loaded=true;
        // Hide the loading screen
        $('#loadingscreen').hide();
        //and call the loader.onload method if it exists
        if(loader.onload){
            loader.onload();
            loader.onload =undefined;
        }
    }
}

我有以下问题:

1)如果onload是一种方法,我们不应该使用它,例如imageThatWeWantToLoad.onload(stuff we want to do after image has been loaded),而不是imageThatWeWantToLoad.onload = (do what we want to do after image has been loaded)

2)loader.onload=game.start;部分做什么(游戏是一个对象,start是游戏对象内部定义的方法)究竟是什么? 我想我明白loader.onload=game.start;意味着一旦加载了加载器对象,就会调用game.start,但由于game.start是一个方法,所以不应该是loader.onload=game.start();

3)此外,onload表示“浏览器收到的数据”?

4 个答案:

答案 0 :(得分:3)

属性loader.onload是一个指向函数的指针(从技术上讲,它只是一个普通的指针,但我们暂时忽略它)。

这样做的:

loader.onload = game.start;

将函数game.start指定给指针loader.onload

然后,在加载程序代码中,您会看到:

if(loader.onload){
    loader.onload();
    loader.onload =undefined;
}

它基本上检查loader.unload是否已分配任何内容(undefined在javascript中被视为false)。如果它已调用它指向的函数,则将指针设置回undefined

上面的解释掩盖了几个关于javascript的事实。但它基本上是在发生什么。

答案 1 :(得分:2)

1)image.onload本质上不是一种方法。它只是一个属性,就像name在执行

dog中的属性一样
dog = { name: null };

对象的属性是包含函数的方法。所以,

dog['bark'] = function() { console.log("Woof"); };

现在我们可以dog.bark()来调用此方法。

如果image.onload是加载图像时的方法(即,如果它包含函数),则它将由浏览器运行。它不是一种供我们调用的方法,而是我们定义

2)它的确如此 - 将game.start(一个函数)的内容分配给loader.onload。现在两个属性都引用相同的功能。如果我们执行了loader.onload = game.start(),它将执行game.start并将执行的结果分配给loader.onload;但是我们想要分配函数本身,所以没有括号。

答案 2 :(得分:0)

  1. Loader是对象,.state('first', { url: '/first', templateUrl: 'first.html', controller: 'FirstCtrl' }) .state('second', { url: '/second', templateUrl: 'second.html', controller: 'SecondCtrl' }) 是在其上定义的属性。

  2. 属性loadImage是指向函数的指针(匿名)

  3. loader.onload //使loader.onload指向game.start。即说loader.onload = game.start;

答案 3 :(得分:0)

JavaScript中的Onload可以描述为:

    这里的
  1. onload作为属性进行访问,我们将为该属性分配函数的结果。因此,函数将执行,最终结果将分配给属性。因此,基本上调用函数并将结果分配给属性已经在单行代码中同时完成。

  2. 在这种情况下,我们想通过检查loader.loaded属性来知道loader onload方法是否已执行。如果它已执行,则调用game.start()而不分配任何函数按顺序执行,因为onload方法已执行。如果它还没有执行,那么我们已经将game.start函数分配给loaded.onload函数,所以我们使用它们作为属性将函数分配给另一个函数,所以现在当调用onload方法时,它现在将执行game.start ()函数作为onload被game.start替换。

  3. Onload表示已加载对象。我们在html的body标签中使用onload事件来知道网页已经加载了所有内容,我们现在可以执行我们的操作以便顺利运行。