关于 jQuery ready方法的疑问希望大神点通
我用jQuery也快2个月了,今天无聊的时候想弄懂 ready方法的机制发现此问题想了3小时无果来论坛求点拨一下
废话不多说了下面贴代码
<script>
for(var i=0;i<3;i++){
alert(i);
$(document).ready(function(){
alert('第'+i+'个ready');
});
}
alert('3333');
</script>
这边我专门还翻了一下jquery的API 上面说: 当 DOM(文档对象模型) 已经加载,并且页面(包括图像)已经完全呈现时,会发生 ready 事件。
这边贴的代码结果是
0
1
2
3333
第3个ready
第3个ready
第3个ready
循环里面没有执行ready方法(能理解 文档还没有加载完嘛)
但是相当不能理解是在打印完 0 1 2后i的值都成3(这点在 第3个ready可以证实)了,并不满足循环条件了为什么 在输出了 0 1 2 3333后 ready方法依然能执行3此
------解决方案--------------------1. for循环里面进行i<3判断后,无论是true还是false,都会执行i++;
顺便提一句va i 把i声明成了全局变量
------解决方案--------------------因为3个ready中的i是同一个变量,
你也说了循环里面没有执行ready方法,
页面完全呈现后才执行ready方法,这时才来读取i的值,这时循环已经结束了,输出的3是循环结束后i的值
------解决方案--------------------这个还要从ready是啥东西说起。
在现代浏览器上,document有一个事件叫DOMContentLoaded,意思就是DOM的内容加载完毕。
ready其实就是这个事件的jQuery写法(当然,那些古代浏览器,需要特殊的代码去兼容,因为他们没有提供这个事件,这是题外话);
$(document).ready(function(){}); 等价于:
$(document).on("DOMContentLoaded",function(){});
好了,了解了这其实是一个事件注册的话,那是不是问题迎刃而解了?
好比对一个div绑定了3次click事件,点击就会触发所有的事件监听器。循环中对DOMContentLoaded事件注册了3次事件监听器,文档加载完毕后,肯定会依次触发这3个监听器了。至于为什么是3个3,楼上的大大们都已经解释清楚了。
------解决方案--------------------再补充一些。
从内容输出顺序就可以看出,ready内部的函数最后才执行。原因是浏览器加载script标签,然后立马执行script之间的代码(如果是src引用的js文件,那也一样,js文件最外层的代码是会在加载后立马执行的),而执行这些代码的时候,例如LZ的这个for循环,这时DOM并没有加载完毕。等到文档加载完毕,DOMContentLoaded事件触发的时候,i的值已经是3了,3个事件回调函数用到的i其实都是3.
------解决方案--------------------不知,这能不能看懂。
var task = [];
function ready(fn) {
task.push(fn);
}
function go() {
var len = task.length;
for ( var i = 0; i < len; i++) {
task[i].call(this);
}
}
for ( var i = 0; i < 3; i++) {
alert(i);
ready(function() {
alert('第' + i + '个ready');
});
}
alert('3333');
go();