在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
表示“浏览器收到的数据”?
答案 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)
Loader是对象,.state('first', {
url: '/first',
templateUrl: 'first.html',
controller: 'FirstCtrl'
})
.state('second', {
url: '/second',
templateUrl: 'second.html',
controller: 'SecondCtrl'
})
是在其上定义的属性。
属性loadImage
是指向函数的指针(匿名)
loader.onload
//使loader.onload指向game.start。即说loader.onload = game.start;
答案 3 :(得分:0)
JavaScript中的Onload可以描述为:
onload作为属性进行访问,我们将为该属性分配函数的结果。因此,函数将执行,最终结果将分配给属性。因此,基本上调用函数并将结果分配给属性已经在单行代码中同时完成。
在这种情况下,我们想通过检查loader.loaded属性来知道loader onload方法是否已执行。如果它已执行,则调用game.start()而不分配任何函数按顺序执行,因为onload方法已执行。如果它还没有执行,那么我们已经将game.start函数分配给loaded.onload函数,所以我们使用它们作为属性将函数分配给另一个函数,所以现在当调用onload方法时,它现在将执行game.start ()函数作为onload被game.start替换。
Onload表示已加载对象。我们在html的body标签中使用onload事件来知道网页已经加载了所有内容,我们现在可以执行我们的操作以便顺利运行。