文章出處
文章列表
第一種實現方式:
var dom = new function() { var dom = []; dom.isReady = false; dom.isFunction = function(obj) { return Object.prototype.toString.call(obj) === "[object Function]"; } //先會執行下面的分支函數,然后執行dom.initReady()函數,因為要等到DOM建完后才會執行 dom.Ready = function(fn) { dom.initReady();//如果沒有建成DOM樹,則走第二步,存儲起來一起殺 if(dom.isFunction(fn)) { if(dom.isReady) { fn();//如果已經建成DOM,則來一個殺一個 } else { dom.push(fn);//存儲加載事件 } } } dom.fireReady = function() { if (dom.isReady) return; dom.isReady = true; for(var i=0, n=dom.length; i<n; i++) { dom[i](); } dom.length = 0;//清空事件 } dom.initReady = function() { if (document.addEventListener) { document.addEventListener( "DOMContentLoaded", function() { document.removeEventListener( "DOMContentLoaded", arguments.callee, false );//清除加載函數 dom.fireReady(); }, false ); } else { if (document.getElementById) { document.write("<script id=\"ie-domReady\" defer='defer'src=\"//:\"><\/script>"); document.getElementById("ie-domReady").onreadystatechange = function() { if (this.readyState === "complete") { dom.fireReady(); this.onreadystatechange = null; this.parentNode.removeChild(this) } }; } } } return dom; }
第二種實現方式
//瀏覽器檢測 (function () { window.sys = {}; var ua = navigator.userAgent.toLowerCase(); var s; (s = ua.match(/msie ([\d.]+)/)) ? sys.ie = s[1] : (s = ua.match(/firefox\/([\d.]+)/)) ? sys.firefox = s[1] : (s = ua.match(/chrome\/([\d.]+)/)) ? sys.chrome = s[1] : (s = ua.match(/opera\/.*version\/([\d.]+)/)) ? sys.opera = s[1] : (s = ua.match(/version\/([\d.]+).*safari/)) ? sys.safari = s[1] : 0; if (/webkit/.test(ua)) sys.webkit = ua.match(/webkit\/([\d.]+)/)[1]; })(); //DOM加載 function Ready(fn) { var isReady = false; var timer = null; function doReady() { if (timer) clearInterval(timer); if (isReady) return; isReady = true; fn(); } if ((sys.opera && sys.opera < 9) || (sys.firefox && sys.firefox < 3) || (sys.webkit && sys.webkit < 525)) { timer = setInterval(function () { if (document && document.getElementById && document.getElementsByTagName && document.body) { doReady(); } }, 1); } else if (document.addEventListener) {//W3C addEvent(document, 'DOMContentLoaded', function () { fn(); removeEvent(document, 'DOMContentLoaded', arguments.callee); }); } else if (sys.ie && sys.ie < 9){ var timer = null; timer = setInterval(function () { try { document.documentElement.doScroll('left'); doReady(); } catch (e) {}; }, 1); } }
當然上面的Ready函數需要依賴addEvent和removeEvent函數,這兩個函數是經過兼容處理的函數,兼容所有瀏覽器,無任何bug,代碼:
//跨瀏覽器添加事件綁定 function addEvent(obj, type, fn) { if (typeof obj.addEventListener != 'undefined') { obj.addEventListener(type, fn, false); } else { //創建一個存放事件的哈希表(散列表) if (!obj.events) obj.events = {}; //第一次執行時執行 if (!obj.events[type]) { //創建一個存放事件處理函數的數組 obj.events[type] = []; //把第一次的事件處理函數先儲存到第一個位置上 if (obj['on' + type]) obj.events[type][0] = fn; } else { //同一個注冊函數進行屏蔽,不添加到計數器中 if (addEvent.equal(obj.events[type], fn)) return false; } //從第二次開始我們用事件計數器來存儲 obj.events[type][addEvent.ID++] = fn; //執行事件處理函數 obj['on' + type] = addEvent.exec; } } //為每個事件分配一個計數器 addEvent.ID = 1; //執行事件處理函數 addEvent.exec = function (event) { var e = event || addEvent.fixEvent(window.event); var es = this.events[e.type]; for (var i in es) { es[i].call(this, e); } }; //同一個注冊函數進行屏蔽 addEvent.equal = function (es, fn) { for (var i in es) { if (es[i] == fn) return true; } return false; } //把IE常用的Event對象配對到W3C中去 addEvent.fixEvent = function (event) { event.preventDefault = addEvent.fixEvent.preventDefault; event.stopPropagation = addEvent.fixEvent.stopPropagation; event.target = event.srcElement; return event; }; //IE阻止默認行為 addEvent.fixEvent.preventDefault = function () { this.returnValue = false; }; //IE取消冒泡 addEvent.fixEvent.stopPropagation = function () { this.cancelBubble = true; }; //跨瀏覽器刪除事件 function removeEvent(obj, type, fn) { if (typeof obj.removeEventListener != 'undefined') { obj.removeEventListener(type, fn, false); } else { if (obj.events) { for (var i in obj.events[type]) { if (obj.events[type][i] == fn) { delete obj.events[type][i]; } } } } }
文章列表
全站熱搜