解决方法
是的,它必须等待.
特别是,在其他脚本有机会执行之前,您不能依赖jQuery(document).ready().
ready可以绑定到DOMContentReady,readystatechanged或onload,无论哪个可用.
特别是,在其他脚本有机会执行之前,您不能依赖jQuery(document).ready().
ready可以绑定到DOMContentReady,readystatechanged或onload,无论哪个可用.
该文档指出“在大多数情况下,只要DOM层次结构已完全构建,脚本就可以运行”.请注意,唯一的保证是在此事件触发时DOM已准备就绪.
它不能保证你的任何其他东西 – 因为它不能.
例如,这在IE,Firefox或Chromium中不起作用,无论您如何随机播放脚本标记,都会在ready()处理程序有机会执行之前调用brilliant.js:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>Test</title> <script src="http://ajax.microsoft.com/ajax/jQuery/jquery-1.4.2.js" charset="utf-8" type="text/javascript" ></script> </head> <body> <script type="text/javascript" > // <![CDATA[ alert("attaching event"); $(document).ready(function () { alert("fired"); }); // ]]> </script> <script type="text/javascript" src="brilliant.js" ></script> </body> </html>
仅供参考,这是jquery-1.4.2的相关代码:
bindReady: function() { if ( readyBound ) { return; } readyBound = true; // Catch cases where $(document).ready() is called after the // browser event has already occurred. if ( document.readyState === "complete" ) { return jQuery.ready(); } // Mozilla,Opera and webkit nightlies currently support this event if ( document.addEventListener ) { // Use the handy event callback document.addEventListener( "DOMContentLoaded",DOMContentLoaded,false ); // A fallback to window.onload,that will always work window.addEventListener( "load",jQuery.ready,false ); // If IE event model is used } else if ( document.attachEvent ) { // ensure firing before onload,// maybe late but safe also for iframes document.attachEvent("onreadystatechange",DOMContentLoaded); // A fallback to window.onload,that will always work window.attachEvent( "onload",jQuery.ready ); // If IE and not a frame // continually check to see if the document is ready var toplevel = false; try { toplevel = window.frameElement == null; } catch(e) {} if ( document.documentElement.doScroll && toplevel ) { doScrollCheck(); } } },