IE要兼容的吧,所以要做Hack方式
我从网上找的例子中总结一下,你制定了一条规则,你自己做事的时候遵守了这条规则,是直调,你要求别人做事,而别人必须去调用你的规则并且在你的规则下做事,那么这个规则就是回调函数.
1,onload事件不是有可能正在加载外部信息,而是必须等外部数据全部加载完才能触发。
2,return是用来跳出setTimeout所创建的递归函数的外层,在外层阻止运行init(),但是当这个递归执行到调用doScroll不抛出错误的时候(也就是DOMReady的时候)就没有return了,此时会执行一次init()。而不是题住理解的return直接跳过了一次性函数去执行后面的readystatechang事件监听。因此,只要顺利,这个一次性函数里的init()是一定会被调用一次的。而且实际应用中setTimeout的第二次参数是0(浏览器最短时间内重复执行)而不是50。
3,d.onreadystatechange=function(){}是绑定事件处理函数,这个绑定过程是在函数编译的时候就完成的,至于触发这个事件,则是document.readyState发生变化时触发,因此题主的表述是有点问题的,当readyState为"complete"时,这个事件监听函数里的init()也是一定会被调用一次的。
综合2和3,确实是在比两个逻辑谁快,但理论上肯定是2的逻辑更快,至于为什么要有3,我印象中是为了应付没有实现DOMContentLoaded也没有document.documentElement.doScroll在DOM没准备好时会报错的特性(这个特性只有低版本的IE有)的非IE浏览器准备的。
以上是我的理解,欢迎指正~
相当于初始化,DOM加载完只需要执行一次,当done等于false时执行,执行完了之后就赋值为true代表已经加载完了
是的。
里面应该有默认值吧,不设置为空就是默认值
http://www.imooc.com/learn/36 基础篇
http://www.imooc.com/learn/10 进阶篇
可能有这方面原因 个人理解 仅供参考
package control插件再建立emmet
就是你在调myReady时 传进来的方法呀。
6666666666666666666666666
1、我并没有看到你在哪儿定义了一个变量叫做,蛋
dan
var init = function(){
if(!done){
dan = true; // 这个蛋是从哪儿来的 ???
fn();
}
};
2、 document.addEventListener("DOMContentLoaded", fn(), false);
应该写成
document.addEventListener("DOMContentLoaded", fn, false);
上面有笔误,更正一下。
d.readyState == 'complete' 这句判断的是页面是否加载完成。立即调用函数里判断的是dom树创建完成之后执行init();,而上面那句指网页加载完之后执行吧。我是这样理解的。
可以的 你可以指定
是很不错
return 我觉得不用写也可以吧