关于一个网页解析对JavaScript带来的找不到对象问题

本文为原创!

昨天,同事遇到一个JavaScript(下称JS区别于JScript,虽然两者从各个方面讲都差不多,但毕竟存在不同点)的问题。一个页面的DIV现在需要其通过在网页加载时通过JavaScript的来对其进行操作。但是,在加载过程中,并没有达到目的,如对DIV在加载时隐藏(虽然可以直接用style进行隐藏,但现在需要用JS),而且提示是找不到对象,但对象是存在的。我当时也觉得其怪,语法和用法都是正确的,就是找不到原因。

今天我突然想起到“网页解析”这个术语,才发现我们可能语法和对象都没有错,而在错在在解析过程中出现的问题,但这个问题不仅仅是网页解析造成的。网页解析是从上往下解析的,对象也是从上往下生成的。JS也是在网页中被顺序解释的。这就涉及到一个JS块的存放位置的问题。如果JS块放在其操作的对象前,在网页解析过程中,JS先于对象被解析,在这个过程中,JS要去查找对象,但此时对象并没有生成;如果JS块放在其操作对象后,对象先于JS块被解析,则在解析JS块时一定能找到对象,也就不会存在找不到对象的问题了。于是我编写了一段测试代码如下,证明我的想法是正确的(可能早有这个知识点,只是我们没有注意到):

<html xmlns="http://www.w3.org/1999/xhtml">
   <head>
   <meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
   <title>无标题文档</title>
   </head>
    <body>
   <script language="javascript" type="text/javascript">
      document.getElementById("a").style.display="";
   </script>
   <div id="a" style="display:none">aaaaaaaaaaa</div>
   <div id="b" style="display:none">bbbbbbbbbbb</div>
   <script language="javascript" type="text/javascript">
      document.getElementById("b").style.display="";
   </script>
    </body>
    </html>

运行结果:串a没有显示,而串b能正确显示。
总结:在使用JS时尽量避免把JS块写成过程让其在解析完就运行,而把JS块封成方法,用事件触发来解决