我可以在整个页面加载之前运行JavaScript?
我想在整个页面加载之前运行一些JavaScript。 这可能吗? 或者代码开始在</html>
上执行?
你不仅可以 ,而且如果你不想要的话,你不得不做出特别的努力。 🙂
当浏览器在parsingHTML时遇到script
标记时,它会停止parsing并交给运行脚本的Javascript解释器。 只有脚本完成后,浏览器才会继续parsing页面(因为脚本可能会执行document.write
调用来输出parsing器应该处理的标记)。 这是默认行为; 有script
标签属性,可以防止这个( defer
和async
)。
所以考虑一下:
<!DOCTYPE HTML> <html><head><!-- yada yada yada --></head> <body> <p>Line 1</p> <script type='text/javascript'> alert("Stop that parsing!"); </script> <p>Line two</p> </body> </html>
如果您加载该页面,则会在显示警报时看到“第1行”段落,并在完成后显示“第2行”段落。
哪里有点棘手是与DOM进行交互,因为DOM是由parsing器构build的,因为它正在做它的事情,并且您的脚本可能在DOM完全准备好被操纵之前运行。 一般来说,如果您只访问文件中script
标记之前的元素,那么您很好,但为了安全起见,最好在DOM完全构build之前暂停所有的DOM交互。
但大多数情况下,您可以愉快地访问早期的元素。 考虑:
<!DOCTYPE HTML> <html><head><!-- yada yada yada --></head> <body> <p id='p1'>Line 1</p> <script type='text/javascript'> document.write("<p>p1 is null? " + (document.getElementById('p1') == null ? "yes" : "no") + "</p>"); document.write("<p>p2 is null? " + (document.getElementById('p2') == null ? "yes" : "no") + "</p>"); </script> <p id='p2'>Line two</p> </body> </html>
你看到的输出是:
1号线 p1是空的? 假 p2是空的? 真正 2号线
…因为p1
存在于脚本运行时,但p2
不存在。
我没有一个方便的链接,但是 在这个消息中 ,Google Closure库的开发人员说,他们没有看到Prototype,jQuery,ExtJS,Dojo和其他大多数人提供,因为如果你把脚本放在你想要与之交互的元素之后,你很好; 这符合YUI的build议 ,即您只需在closures</html>
标记之前放置脚本(因为您必须将它们放在某处 ,并且在那里它们不会阻止您的页面显示)。 现在,我个人认为在这些事件中有一些价值,尽pipe我认为它们是过度使用的,但是我的观点是很显然你可以很早就开始与事物进行交互。
您可以随时运行JavaScript代码。 AFAIK是在浏览器到达它所在的<script>标签的时候执行的,但是你不能访问尚未加载的元素。
所以如果你需要访问元素,你应该等到DOM被加载(这并不意味着整个页面被加载,包括图像和东西,只是文件的结构,加载更早,所以你通常赢注意DOMContentLoaded
延迟),在jQuery中使用DOMContentLoaded
事件或$.ready
等函数。
我想如果在整个页面加载之前尝试引用BODY中的控件,就会出现错误。