DOM Ready 原生写法
1 /*! 2 * contentloaded.js 3 * 4 * Author: Diego Perini (diego.perini at gmail.com) 5 * Summary: cross-browser wrapper for DOMContentLoaded 6 * Updated: 20101020 7 * License: MIT 8 * Version: 1.2 9 * 10 * URL: 11 * http://javascript.nwbox.com/ContentLoaded/ 12 * http://javascript.nwbox.com/ContentLoaded/MIT-LICENSE 13 * 14 */ 15 16 // @win window reference 17 // @fn function reference 18 19 function contentLoaded(win, fn) { 20 21 var done = false, 22 top = true, 23 24 doc = win.document, 25 root = doc.documentElement, 26 modern = doc.addEventListener, 27 28 add = modern ? 'addEventListener' : 'attachEvent', 29 rem = modern ? 'removeEventListener' : 'detachEvent', 30 pre = modern ? '' : 'on', 31 32 init = function(e) { 33 if (e.type == 'readystatechange' && doc.readyState != 'complete') return; 34 (e.type == 'load' ? win : doc)[rem](pre + e.type, init, false); 35 if (!done && (done = true)) fn.call(win, e.type || e); 36 }, 37 38 poll = function() { 39 try { 40 root.doScroll('left'); 41 } catch (e) { 42 setTimeout(poll, 50); 43 return; 44 } 45 init('poll'); 46 }; 47 48 if (doc.readyState == 'complete') fn.call(win, 'lazy'); 49 else { 50 if (!modern && root.doScroll) { 51 try { 52 top = !win.frameElement; 53 } catch (e) {} 54 if (top) poll(); 55 } 56 doc[add](pre + 'DOMContentLoaded', init, false); 57 doc[add](pre + 'readystatechange', init, false); 58 win[add](pre + 'load', init, false); 59 } 60 61 }
https://raw.githubusercontent.com/dperini/ContentLoaded/master/src/contentloaded.js