今天在阅读网上一些模拟Jq的ready方法时,发现一些小细节,就是网上的ready事件大部分都是在onload事件执行后加载,而jquery确能在onload加载前,dom加载完后执行,一直不了解,基于对网上的一些方法逻辑不了解,所以去看了《jquery源代码研究(ready函数) 》这篇文章后自己写入如下代码(已有详细说明):

代码 <! DOCTYPEhtmlPUBLIC " -//W3C//DTDXHTML1.0Transitional//EN " " http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd " >
< htmlxmlns = " http://www.w3.org/1999/xhtml " >
< head >
< metahttp - equiv = " Content-Type " content = " text/html;charset=utf-8 " / >
< title > document.ready < / title>
< scripttype = " text/javascript " src = " js/jquery-1.3.2.js " >< / script>
< scripttype = " text/javascript " >
var Darren;
(
function (){
var isReady = false ; // 是否已经加载完毕
var readBound = false ; // 判断是否已经调用过循环事件
var readylist = []; // 把需要执行的方法先暂存在这个数组里

// 判断浏览器,该方法来自CloudgamerJavaScriptLibraryv0.1
var Browser = ( function (ua){
var b = {
msie:
/ msie / .test(ua) && ! / opera / .test(ua),
opera:
/ opera / .test(ua),
safari:
/ webkit / .test(ua) && ! / chrome / .test(ua),
firefox:
/ firefox / .test(ua),
chrome:
/ chrome / .test(ua)
};
var vMark = "" ;
for ( var i in b){
if (b[i]){
vMark
= i;
}
}
if (b.safari){
vMark
= " version " ;
}
b.version
= RegExp( " (?: " + vMark + " )[\\/:]([\\d.]+) " ).test(ua) ? RegExp.$ 1 : " 0 " ;

b.ie
= b.msie;
b.ie6
= b.msie && parseInt(b.version) == 6 ;
b.ie7
= b.msie && parseInt(b.version) == 7 ;
b.ie8
= b.msie && parseInt(b.version) == 8 ;

return b;
})(window.navigator.userAgent.toLowerCase());

function bindReady()
{
if (readBound){ // 保证bindReady方法只执行一遍
return ;
}
readBound
= true ;

// ForIE并且不是嵌套在frame中
if (Browser.msie && window == top)
{
(
function (){
if (isReady){
return ;
}
try {
document.documentElement.doScroll(
" left " ); // 如果没加载dom完毕这个会报错
}
catch (error){
setTimeout(arguments.callee,
0 ); // 循环调用父函数,也就是ready方法
return ;
}
Test.Done();
})();
}
else if (Browser.firefox) // ForFF
{
document.addEventListener(
" DOMContentLoaded " ,Test.Done, false );
}
}
var Test = {
ready:
function (fn){
bindReady();
// 判断是否加载完毕
if (isReady)
{
fn.call(document);
// 加载完毕,直接调用
} else {
readylist.push(fn);
// 如果还没加载完成则将该方法暂存到readylist数组中,以便以后调用
}
return this ;
}
};
// 静态方法:加载完毕执行
Test.Done = function (){
if ( ! isReady){
isReady
= true ;
}
readylist[
0 ].call(document);
}
Darren
= Test;
})();


// 测试
Darren.ready( function (){
alert(
" my " );
document.getElementById(
" test " ).innerHTML = " haha " // 成功读取dom
});
$(
function (){alert( " jq " )});
window.onload
= function (){alert( " default " )}
< / script>
< / head>
< body >
< divid = " test " > test < / div>
< / body>
< / html>

更多相关文章

  1. 有什么方法可以让jQuery循环在到达终点或开始时不循环?
  2. js限制文本框只能输入数字方法
  3. jquery Loading图片延迟加载特效
  4. html 页面内锚点定位及跳转方法总结
  5. 是否有更快的方法来遍历HTMLDocument中的每一个元素呢?
  6. Jquery-如何使用prop方法更改backgroundColor?
  7. 使用jQuery和AJAX从JSON文件加载数据
  8. 关于 客户端发现响应内容类型为“text/html; charset=utf-8”,但
  9. IOS学习之WebView加载本地HTML代码或网络资源

随机推荐

  1. 转Launcher研究之AndroidManifest.xml分
  2. Android中的Menu点滴记录
  3. 《Android取证实战:调查、分析与移动安全
  4. Android(安卓)Retrofit OkHttp添加Interc
  5. Android源码 半小时下完Android系统源码
  6. [转]快速切换Android工程版本的方法
  7. [原创]Android在eclipse下出现Failed to
  8. android 8.0 Notification 的处理
  9. android进程创建分析
  10. [转]有关Android线程的学习