关于javascript中window.onload的混淆
我有一段javascript代码。我不太明白。 你能为我逐行解释一下吗?非常感谢关于javascript中window.onload的混淆,javascript,Javascript,我有一段javascript代码。我不太明白。 你能为我逐行解释一下吗?非常感谢 function addLoadEvent(func) { var oldonload = window.onload; if (typeof window.onload != 'function') { window.onload = func; } else { window.onload = function() { oldonload(); func()
function addLoadEvent(func) {
var oldonload = window.onload;
if (typeof window.onload != 'function') {
window.onload = func;
} else {
window.onload = function() {
oldonload();
func();
}
}
}
以下是我的想法:
function addLoadEvent(func) { //define a function with a parameter 'func'
var oldonload = window.onload; //assign window.onload event to variable oldonload
if (typeof window.onload != 'function') { //if window.onload is not a function, then...
window.onload = func; //assign 'func' to window.onload event. what does func mean?
} else { //if window.onlad is a function
window.onload = function() { //don't understand
oldonload(); //call function oldonload()
func(); //call function func()
}
}
}
困惑:
window.onload已经是一个事件,为什么要使用typeof
函数addLoadEvent(func),window.onload=func,func()。这些函数之间有什么区别
我很抱歉发布了一个新手问题。但是感谢给我一些指导的人
编辑:
这是Simon Willison改进的原始代码
function addLoadEvent(func) {
var oldonload = window.onload;
if (typeof window.onload != 'function') {
window.onload = func;
} else {
window.onload = function() {
if (oldonload) {
oldonload();
}
func();
}
}
}
这很简单
检查是否已经注册了onload函数
如果没有的话,
1.将传递给onload的函数赋值为“func”
如果有,,
创建一个新的onload函数,该函数将:
function addLoadEvent(func) { //define a new function called addLoadEvent which takes in one param which should be function
var oldonload = window.onload; //assign window.onload event to variable oldonload
if (typeof window.onload != 'function') { //if window.onload is not a function, and thus has never been defined before elsewhere
window.onload = func; //assign 'func' to window.onload event. set the function you passed in as the onload function
} else { //if window.onlad is a function - thus already defined, we dont want to overwrite it so we will..
window.onload = function() { //define a new onload function that does the following:
oldonload(); //do whatever the old onload function did
func(); //and then do whatever your new passed in function does
}
}
}
//then call it like this:
addLoadEvent(function() {
alert("hi there");
});
addLoadEvent(function() {
alert("this will be alerted after hi there");
});
//or like this:
var fn = function(){
alert("this will be the last thing alerted");
};
addLoadEvent(fn);
你能为我逐行解释一下吗
我太懒了,但简而言之:
- 复制onload到另一个变量
- 如果onload If函数,则将其设置为运行传递函数的新函数,然后设置为旧函数
- 如果不是,只需使传递的函数在加载时运行即可
作为旁白,不要用这个。使用或跨浏览器(如或)对其进行正常化的库。定义的函数
addLoadEvent(func)
旨在向现有的窗口添加附加函数。onLoad
事件。因此,它要做的第一件事就是检查window.onLoad
事件是否是而不是函数。如果不是,它只是将传入的函数分配给window.onLoad
事件
但是,如果已经定义了window.onload
,它将重置它以调用原始的onload
函数以及您传入的函数(func)
您可以使用它将自己的事件添加到“堆栈”:
这会将匿名函数传递给addLoadEvent函数。这就是上面代码中的window.onload=function(){…}
中发生的情况。您还可以预先定义函数并按如下方式传递:
var myOnloadEvent = function() {
alert('Hello! I run after the original window.onload event if it exists!');
};
addLoadEvent(myOnloadEvent);
在javascript中,“函数”是一个变量可以采用的基本变量类型。Javascript也是松散类型的,因此变量的值取决于最后分配给它的内容。“事件”只是窗口对象的一个成员变量。因此,您可以将其分配给您喜欢的任何对象。如果它从未被分配给任何对象,它将在javascipt中接受“undefined”的原始值。因此,检查:
if (typeof window.onload != 'function') {
正在实际检查是否已定义window.onload事件处理程序
如果尚未定义,则此函数将func分配给window.onload事件处理程序(即当窗口加载时将调用func)
如果以前定义过,则此函数将创建一个新函数,在加载窗口时调用现有的onload处理程序,后跟func。本例还使用了javascript的一个名为“closure”的属性/语言特性,以便新定义的“compose”函数可以访问其作用域上方的变量,这些变量在外部函数失去作用域后仍然存在
也许一个更有意义的检查是:
if (typeof window.onload === 'undefined') {
你能用代码逐行纠正我吗?我不太精通javascript。@非常感谢你,mkoryak。我只想确保第2行的“窗口。加载”。“窗口加载”的可能性是什么?因为David Dorward说过“这不是一个事件,它是一个属性,可能是函数,也可能是未定义的”。你怎么看?是的,他是对的。因为在JS中,所有函数也是变量/属性。如果未设置,则未定义。如果设置了,它可以是函数的类型。我们通常称之为“onload事件”,但实际上它是一个onload函数。semantics@myoryak,谢谢你的解释。现在我明白了window.onload也可以是一个字符串,当事件触发时将对其进行评估。这是Simon Willison在2004年最初编写的一些代码的旧版本:请注意,Simon在2006年更新了该代码以处理IE7上的潜在问题-您可能希望合并他的更新。感谢您提供的信息NickFitz。我已经查过了。谢谢大家的回复和解释。:)@David Dorward,非常感谢逐行更正。你是
if (typeof window.onload === 'undefined') {