区别:
(1)JS的window.onload事件必须要等到所有内容,以及外部图片之类的文件加载完之后,才会去执行。
(2)JQuery入口函数是在所有标签加载完之后,就会去执行。
接着,通过JS的一个覆盖问题引出对JQuery入口函数实现的解释。
JS的入口函数window.onload函数有一个覆盖的问题,当文档中出现2个window.onload函数的时候,后者会覆盖前者,导致功能实现不了。但是JQuery却没有这样的问题,重要是因为JQuery入口函数只是对封装好了的方法的一个调用,只不过传的参数不同而已。
最后,说说JQuery入口函数($(document).ready();)的实现方式。
var $ = function() {
return {};
}
$();
首先,我们在script标签中我们先创建一个函数变量就叫 , 然 后 , 在 后 面 调 用 。 现 在 并 没 有 任 何 效 果 , 因 为 这 个 调 用 的 只 是 一 个 空 的 对 象 , 没 有 任 何 参 数 。 如 果 我 们 想 在 ,然后,在后面调用。现在并没有任何效果,因为这个调用的只是一个空的对象,没有任何参数。如果我们想在 ,然后,在后面调用。现在并没有任何效果,因为这个调用的只是一个空的对象,没有任何参数。如果我们想在()后面继续调用,还需要做一些事情。我们看JQuery入口函数中是不是有个ready方法,那我们可以创建一个对象的属性就叫ready,然后将ready指向一个匿名的函数,现在我们就可以通过$().ready()来调用了。
var $ = function() {
var obj = {
ready: function() {},
}
}
$().ready();
我们可以用一个具体的函数测试一下:
var $ = function() {
var obj = {
ready: function() {
console.log("我是ready!");
},
}
}
$().ready();
接着,JQuery入口函数可以传一个函数(作为变量传入)进来,即$().ready(function(){}),然后用一个形参(func)变量接收,那么严执行接收的这个方法,只要调用一下(func())就行。
var $ = function() {
var obj = {
ready: function(func) {
// console.log("我是ready");
func();
},
}
return obj;
}
$().ready(function(){});
下面再看看JQuery入口函数前面的document参数,即$(document).ready(function(){}),这样和JQuery的入口函数就一模一样了。同样需要用一个变量接收。最后只要在ready函数里面去判断一下这个onload事件有没有(或者说有没有被赋值):
(1)有(被赋值),接收一个旧的函数,重新赋值onload事件,然后先去调用新的函数,接着再调用旧的函数,这样就不会有覆盖的问题,他俩个函数都实现了。
(2)没有,直接赋值个onload事件。
var $ = function() {
var obj = {
ready: function(func) {
// console.log("我是ready");
if (typeof dom.onload === "function") {
var oldFunc = dom.onload;
dom.onload = func() {
func();
oldFunc();
}
} else {
dom.onload = func;
}
},
}
return obj;
}
$(document).ready(function() {});
最后,我们来测试一下,由于document没有onload事件,我们可以用window来试一下。
var $ = function() {
var obj = {
ready: function(func) {
// console.log("我是ready");
if (typeof dom.onload === "function") {
var oldFunc = dom.onload;
dom.onload = func() {
func();
oldFunc();
}
} else {
dom.onload = func;
}
},
}
return obj;
}
$(window).ready(function() {
console.log("第一次调用");
});
$(window).ready(function() {
console.log("第二次调用");
});