解析Web(asp)网页执行的顺序
    导言:未来web程序设计语言的发展趋势如何?Asp、php、jsp几大主要的设计语言谁更是潜力股?作为一个web网络程序设计语言的爱好者该何去何从?应选择那种语言?不管别人怎么想,我选择了asp,因为它简单,不管它前景怎样,至少目前还是流行的。作为一个web(asp)爱好者,经过N久的磨练和在M次挫折中思索总结外加不懂就百度的精神,我将我在网站建设中遇到的一些常识问题总结出来供同为致力于asp设计的asp星迷们参考借鉴。在本文,你将了解以下几大知识点:
Asp中脚本执行的顺序问题
    Asp文件引用
Javascript在页面加载时的执行顺序
以下正文开始,懒得仔细看的直接按照1234要点看。
一个asp网页常见的组成部分有脚本、html标记语言和css。脚本包括服务器端脚本和客户端脚
本。服务器端脚本指在服务器上运行的那部分脚本,标识为<%......%><script ranat="server">....</script>及#include命令引用的外部文件,输出表现形式为response.write。服务器端脚本可使用vbscript和javascript等语言书写;
客户端脚本是在客户端浏览器上运行的脚本语言,常见的标识为<script>...</script>、<script language="vbscript/javascript">...</scrip>及<script type="txt/javascript src=".....js" ></script>调用的外部文件,输出表现形式为document.write,网页弹出的消息框这个就是客户端脚本做的(alert、msgbox),注意这种弹出消息框效果只能用于客户端,也即服务器端脚本做不到。试想服务器端远在天边如弹出一个消息框无人操作不就光荣罢工了?
此外客户端脚本与服务器端脚本还有一个很大的区别,就是客户端脚本可以访问文档对象(doc)可以动态操作页面中的对象(比如修改页面标题、字体大小),而服务器端脚本则不能,这关乎于web(asp)页面执行的顺序问题,因为在服务器端执行的时候,web文档结构尚未形成,也就是整个房屋还没建立起来,只是把一些必须的材料准备好了,你怎么能预先知道那层楼的哪个房号及房间里住着什么样的人?也即web页面的框架及下辖元素(节点)和属性。接下来,我们讨论web(asp)是如何执行的。
(1)客户端浏览器(即用户)向服务器(iis)发送一个请求(即网页地址)要求查看页面,出示请柬。
(2)Iis服务器到asp文件,提交给asp引擎(一般是asp.dll)处理。
(3)引擎打开这个asp文件,出<%  %>、<script runat="server">...</script>及之间的内容,称为脚本块,只有脚本块里的内容被引擎解析,其他内容不管,作为没有意义的字符插在脚本块之间。而<%  %>、<script runat="server">...</script>及之间也有执行的先后顺序,先被执行,而后其他脚本块按先后顺序。这里重点介绍一下<1--#include-->指令引用。
        Asp文件引用
  #include 指令用于在多重页面上创建需重复使用的函数、页眉、页脚或者其他元素等,通过使用 #include 指令,我们可以在服务器执行 ASP 文件之前,把另一个ASP文件插入这个文件中。另言之即为,在服务器端执行<%  %>、<script runat="server">...</script>之前,被引用的文件就会被处理和插入。简单说,#include引进的文件执行顺序优先于asp其他服务器端脚本。飘香书院整理
举例说明一下,下面的代码无法执行,这是由于 ASP 会在为变量赋值之前执行 #include 命令。
<% name="header.inc"  %>
还要废话的解释一下,因为asp首先要执行的是#includ命令,它不管前面排着的是国防部长还是军区司令,首先跳过忽略你没话说,把#includ命令执行完之后再回头开始一个一个按顺序检阅,所以此时#includ命令中的变量name是没被定义的,也就无法引用外部文件了(都没这个人的资料,你叫我在茫茫文件中哪一个?Include委屈!)。
值得注意的是不能在脚本分隔符之间包含文件引用:
<%  For i = 1 To n
 
Next    %>
但是这段脚本可以工作:
  <% For i = 1 to n %>
 
  <% Next %>
从上文中可能已经清楚了#include的用法,但我还是要啰嗦一下#include引用文件的语法。
  或
  为注释标签,在asp文件引用外部文件,要把#include命令置于注释标签中。
      关键词 virtual 指示路径以虚拟目录开始。如果 "header.inc" 文件位于虚拟目录 /html 中,下面这行代码会插入文件 "header.inc" 中的内容:
      关键词 File 指示一个相对的路径。相对路径起始于含有引用文件的目录。假设文件位于 html 文件夹的子文件夹 headers 中,下面这段代码可引用 "header.inc" 文件的内容:
注意:被引用文件的路径是相对于引用文件的。假如包含 #include 声明的文件不在 html 目
录中,这个声明就不会起效。也可以使用关键词 file 和语法 (..\) 来引用上级目录中的文件。
举例说明如何使用#include命令:
这里有一个名为 "mypage.asp" 的文件:。
<html> <body>
<h2>举例说明:</h2>
<p></p>
<h2>时间:</h2>
<p></p>
</body>
</html> 这是 "dom.inc" 文件:
"好好学习天天向上."
这是 "time.inc" 文件:
<%Response.Write(Time)%>
在浏览器中查看的源代码应该类似这样:
<html>
<body>
<h2><h2>举例说明:</h2>
<p>"好好学习天天向上."</p>
<h2>时间:</h2>
<p>11:33:42 AM</p>
</body>
</html>
在上例要注意的是,我们使用 ".inc" 来作为被引用文件的后缀,假如用户尝试直接浏览 INC 文件,这个文件中内容就会暴露。假如被引用的文件中的内容涉及机密,那么最好还是使用 "asp" 作为后缀。ASP 文件中的源代码被编译后是不可见的。被引用的文件也可引用其他文件,同时一个 ASP 文件可以对同一个文件引用多次。
  (4)上述可知,如果asp包含#include指令,则按#include的先后顺序执行,再按先后顺序执行<%  %>、<script runat="server">...</script>脚本代码块。注意:引擎执行脚本块中的脚本,这些服务器端的脚本是作为一个整体被执行的,也就是说,可以写出如下的代码:
<%  Dim i  For i=1 to 5    %> Hello World!    <% Next %>
“引擎并不会将这些脚本块分开解析,而使两个脚本块都发生语法错误。所以我们得到如下结论:并非所有非服务器脚本的代码都会被发送到客户端,有可能这段非服务器脚本的代码被脚本块限制了。服务器是一定不会操心客户端脚本的执行问题的,但是可以通过服务器端的脚本输出不同的客户端脚本。”温馨提示:此段话为引用,具体出自哪位仁兄之口无从查证了,认为很有道理加以借鉴。
asp网站页面(5)asp引擎经过编译产生一个文本流或者说是脚本的执行结果(可以认为这是一个字符串,就是发送到客户端浏览器的网页代码)和其他被asp引擎忽略的非服务器代码一起发送到客户端浏览器。
(6)接受到服务器返回的代码,浏览器是按照代码的先后顺序解析的。代码通常包含有html标记语言和客户端脚本(常见有javascript和vbscript),html解析按顺序进行,当遇到一个脚本,它按常规终止对文档的解析,并等待脚本执行后继续执行下面的html。那么脚本语言是按何种顺序执行的?这里着重接受javascript在页面的执行顺序。
飘香书院整理
            Javascript在页面加载时的执行顺序
    页面上的Javascript代码是HTML文档的一部分,所以Javascript在页面装载时执行的顺序就是其引入标记<script >的出现顺序,< script >标记里面的或者通过src引入的外部JS或asp,都是按照其语句出现的顺序执行,而且执行过程是文档装载的一部分。强调几点:
      (一)每个脚本定义的全局变量和函数,都可以被后面执行的脚本所调用,而后面脚本
定义的全局变量不能被前面所调用,而全局函数可以。因为变量的调用必须是前面声明了的,否则获取的变量值是undefined。原因很简单,脚本执行过程是按先后顺序的,就如流水一样,下游的污水不能影响到上游。至于函数为什么可以。下面有阐释。