qingtianyzl

晴天blog(QQ:14493558)
  博客园  :: 新随笔  :: 联系 :: 管理

Javascript(3)

Posted on 2007-04-02 07:41  晴天  阅读(949)  评论(2)    收藏  举报

                               第二部分 客户端 Javascript
 第二部分包括第十二章到第二十二章的内容,描述了web浏览器中实现的Javascript,在这些章节中引入了
 大量的新的Javascript对象,这些对象用于表示web浏览器和html文档的内容,其中许多例子展示的都是
 这些客户端对象的典型用法
                         
                              第十二章  Web 浏览器中的Javascript
 
 本书的第一部分描述了Javascript语言的核心,现在我们要介绍在web浏览器中使用的javascript,通常
 我们称它为客户端javascript,迄今为止,我们看的大部分例子虽然是合法的javascript代码,但是没有
 特定的环境,也就是它们不过是一些运行在没有说明在环境中的javascript片段,本章给它们提供了这个
 环境,首先,我们将对web浏览器的程序设计环境昨基本的客户端Javascript代码的概念进行了一般介绍
 ,然后我们将讨论怎样才能将javascript代码嵌入html文档便让它在web浏览器中运行,最后本章详细介绍了
 一个在web浏览器中如何执行Javascript程序


 12.1 web浏览器环境
    要理解客户端javascript,必须理解web浏览器所提供的程序设计环境的概念性框架,接下来几节介绍的是程序
    设计的环境的三个重要特性
  
   对术语"客户端Javascript"解释
     从"客户端javascript"是从javascript用于web浏览器和web服务器流传下来的,由于采用javascript作为脚本语言的环境
     越来越多,"客户端"这个术语也就失去意义,因为它没有指明是什么样的客户端
   
    注:经常可以看到"客户端javascript"这样的术语,现在知道了其实相对于它用于web服务器


 
 12.1.1 作为全局执行环境的windows对象
      web 浏览器的主要任务是在一个窗口中显示html文档,在客户端的javascript,表示html文档的是document对象,Window对象
      代表显示该文档的窗口(或框架),虽然对于客户端Javascript来说,Document对象和windows对象都很重要,但是相比较而言,
      windows对象更重要一些,本质上的原因是windows对象是客户程序设计中全局对象
   
      注: 1:web 浏览器的主要任务是在一个窗口中显示html文档
          2:表示html文档的是document对象,Window对象代表显示该文档的窗口(或框架)
          3:是windows对象是客户程序设计中全局对象


      javascript的每一个实现都有一个全局对象,该对象位于作用域的头部,这个全局对象属性也是全局变量,这个全局对象的属性也就是
      全局变量,客户端javascript的windows对象是全局对象,它定义了大量的属性和方法,使用用户可以对web浏览器进行操作,它还定义了
      引用其它重要对象的属性,如引用Document对象的doucument属性,此外windows对象还包括两个自发我引用的属性,window和self
      可以使用这两个全局变量来直接引用window对象
  
       注: 1: javascript的每一个实现都有一个全局对象
           2: 客户端javascript的windows对象是全局对象,它定义了大量的属性和方法,
              使用用户可以对web浏览器进行操作,它还定义了引用其它重要对象的属性
           3: windows对象还包括两个自发我引用的属性,window和self
              可以使用这两个全局变量来直接引用window对象

      
      由于在客户端Javascript中window对象全局对象,因此所有的全局变量都被定义为该对象的属性
      例:
           var ansewer =42 //声明并初始化一个全局变量
           wondow.answer=42// 创建windows对象的一个新属性


      window对象代表的是一个web浏览器窗口中的一个框架,在客户端Javascript中,顶层窗口中和框架本质上是相当的,编写使用多框架
     javascript程序很常见,而且编写使用多框架的javascript应用程序很是可能的尽管不是那么常见,一个应用程序中出现的每个窗口
     和框架都对应一个windows对象,而且都为客户端javascript代码定义了一个惟一的执行环境.换句话说, Javascript代码在一个框架
     中声明的全局变量并不是另一个框架的全局变量,但是第二个框架却可以在取第一个框架的全局变量     

    
     注: 1:window对象代表的是一个web浏览器窗口中的一个框架
         2:客户端Javascript中,顶层窗口中和框架本质上是相当的,编写使用多框架javascript程序很常见
         3:一个应用程序中出现的每个窗口和框架都对应一个windows对象,而且都为客户端javascript代码定义了一个惟一的执行环境

        
     注:上面重点讲了就是作为全局执行环境的windows对象,同时也讲到的document对象


 12.1.2 客户端的对象层次和文档对象模型
       windows对象是客户端javascript中的一个关键对象,其它所有的客户端对象都和这个对象连在一起.例如,每个windows对象都包含一个
       document属性,该属性引用与这个窗口关联在一起的document对象,location属性引用与窗口关联在一起location对象.此外windows对象
      还包含一个frames[],它引用代表原始窗口听框架的windows对象,因此,doucmente代表的是当前窗口的doucment对象,而frames[1].document
      引用的是当前窗口的第二个子框架的Document对象
    
      由当前窗口或其它windows对象引用的对象本身还有可以引用其它对象,例如,每个doucument对象都有一个forms[]数组,它包含的是
      代表该文档中出现的所有html表单对象,要引用这些表单,可以编写如下代码:
      windows.document.form[0]期
   
      继续使用上面的例子,每个Form对象都有一个elementes[]数组,该数组包含了出现在表单中的和各种html表单元素的对象,在极其特殊
      的情况下,可以编写引用整个对象链底部的对象代码,其表达式的复杂程序如下:
       parent.frames[0].document.forms[0].elements[3].options[2].text

     我们已经知道,windows对象是位于作用域链头部的全局对象,javascript中的所有客户端对象都是作为其他对象的属性来存取的,这就是
     说,存在一个javascript对象的层次,这个层次的根是一个windows对象 在page214

     
     当前窗口

      顶级
            当前窗口
      下一级
   
             -----  seft,window,parent,top各种windows对象
             ------ navigator Navigator对象
             -------frames[] windows对象数组
             -------location location对象
             -------history history 对象
             -------document doucment对象
             -------screen screen对象
     
     document doucment对象 下一级

             ---forms[] forms对象数组
             ---anchors[] anchor对象数组
             ---links[] links对象数组
             ---images[] images对象数组
             ---appletes[] applets数组
             ---embeds[]   嵌入对象数组

   --forms[] forms对象数组 下一级
             ---elements[]
             html表单元素
             ----object: button checkbox  fileupload hidden password 
                  raido  reset  select submit text textaera
   
   下一级
           options[] options对象 数组
 


 
     表:12-1 说明了这个情况
     仔细研究这幅图,理解其中的层次以及它所包含的对象,对成功设计客户端Javascript的程序至关重要,本图仅仅列出了
     那些引用其它对象的属性,图中所示的大部分对象具有的属性都比显示出来的要多.

     图中显示的许多对象都继成了Document对象,大型的客户端对象层次的子树被称作文档对象模型(DOM)它很有趣,因为它已经成为
     标准化进程的焦点图12-1显示Document对象已经成为实际标准,因为所有的主流浏览器都统一实现了它,它们统称为0级DOM,因为它们
     构成了文档功能的基本级别,javascript的程序设计者在所有浏览器中都可以广泛应用级别,这些基本的Document对象是第十四章和十五章
     的主题,w3c标准化的更高级的文档对象模型是第十七章和第十八章的主题


12.1.3 事件驱动的程序设计模式
     过去,计算机程序常常以批处理的模式运算,也是说,它们先读出一些数年,然后对这批数据进行计算,最后输出计算结果,随着时间片
     共享和基于文本的终端的出现,便开始进行有限的交互,程序要求用户输入数据,然后计算机对数据进行处理并在屏幕上显示出结果来
    
     现在出现了图形显示和像鼠标这么的点击设备,情况就有一点不同,程序通常都是事件驱动的,用户点击和键盘敲击的方式进行输入,程序
     则根据鼠标点击和键盘敲击的方式进行输入,程序刚根据鼠标指针的位置对这这种异步的用户输入进行响应,web浏览器恰恰就是这样一
     个图形环境,由于一个html文档包含嵌入式GUL,因此客户端javascript使用是就是这种事件驱动的程序设计模型
      
     编写一个不接受用户输入,每次都完成相同工作的静态Javascript程序也是完全可能的,有时候这种程序非常有用,但是,大多数,情况下
     我们需要编写能够和用户交互的动态程序,必须能够响应用户输入
  
     在客户端jagvascript中,web浏览器使用事件来通知程序有用户输入,事件的类型有很多种,例如按键盘事件,鼠标移动事件等等
     当一个事件发生时,web浏览器会先尝试调用一个合适的事件处理程序来响应那个事件,因此,要编写 一个动态的,交互性的客户端
     javascript程序,必须先定义一些适当事件处理程序,并将它们注册到系统中,这样浏览才能在适当的时刻调用它们

     如果你还不熟悉事件驱动的程序设计模型,那么熟悉使用这种模型还需要花费一番工夫,在旧的模型中,你可以编写一个大的代码块
     ,把它放在一些定义明确的控制流之后,并且从头到尾完整地运行一遍即可,但是事件驱动程序应该在不可预知的,异步的时候被调用
     ,地大部分时间里,程序根本就不运行,只是等侍系统调用它的某一个事件处理程序.
  
     注:这里讲的比较多,但是有一点就是程序必须由事件来驱动的


12.2 在html中嵌入javascript
     把客户端javascirpt代码嵌入html文档有很多方法
     1:放置在标记对<script></script>之间
     2:放置在<script>和</script>之间
     3:放置在事件处理程序中,该事件处理程序由onclick或onmouseover这样的html属性值指定
     4:作为url的主体,这个url使用特殊的javascript:协议
    
    12.1 <script>标记
      注: 1: 客户端的javascript脚本是html文件的一部分
            2: 语句通常放置在<script>和</script>之间
            3: 可以在这个两个标记之间放置任意多条javascipt语句
           4: 放置这些语句的顺序,就是它们在文档中出现的顺序 
            5: 在一个html页中,可以出现很多的<script></script>这样的片断,我们可以在另一个片断中引用其它片断中的变量,
               因为系统认为它们都是同一个javascript程序的组成部分

           
             <html>
             <head>
             <title>Today's Date</title>
              <script language="JavaScript">
                                function print_todays_date() {
                                     var d = new Date();             
                                      document.write(d.toLocaleString());   }
                 </script>
             </head>
             <body>

               The date and time are:<br>
             <script language="JavaScript">
                    print_todays_date();
             </script>
                </body>
              </html>


     12.2.1.1 属性language和type
           1: <script>可以用language指定那种类型语言javascript还是vascript
      2: javascript是web默认脚本,如果省略了langeuage 会认为认为脚本是用javascript编的
           3: 如果计划把javascript作为一个文件中使用的一种语言,只需要在文档的<head>部分加入如下代码
               <meta http-equiv="content-Script-Type" content="text/javascript">
           4: 在用language="Javascript"中我们可以指定javascript版本,但是我觉得最好不定就是language属性不
              要,免得产生冲突

 
   12.2.1.2 <script>标记
           1: 你会发现自己编写的脚本用,document.write()方法向另一个浏览器窗口或框架输出文本,如果编写了这样一个脚本
            
]


 就应该加上</script>标记来终止它
             
                <script>
                document.write("<script>");
                document.write("document.write('<h2>this is sa</h2>')");
                document.write("</"+"script>");  
                </script>


 
12.2.1.3 defer性质
       html定义了<script>标记的一个性质,虽然该性质还不常用,但是仍然很重要,如果你编写的脚本不会生成任何文本输出就可以
       在<script>标记中使用defer性质.暗示浏览器可以继续解析html文档
       ,推迟执行脚本,直到它遇到了不能推迟执行的脚本为止,这样做可以提高利用defer性质的浏览器的性能,注意defer是一个值
       只是必须出现在标记中
       <script defer>
          //不调用document.write()方法的javascript 代码
       </script>
       
                  

12.2.2 包括javascript文件
       src这个性质指定了一个javascript代码的url,它用的语法如下,
    <script src="../../javascript/util.js"></script>
       Javascript文件扩展名通常是.js,它只是包含纯粹的javascript代码,其中既没有<script>标记也没有其它html标记
       支持src性质的浏览器会忽略<script>和</script>之间的代码

       使用src性质有很多好处
        1:它可以把大javascrip代码块移出其html文件,从而间化了html文档

        2:当某个函数或者Javascript代码由几个不同的html文档共享时,可以将它放置在一个单独的文件中,然后由那些需要它的
          html文件读取,这样不仅减少硬盘空间的使用,而且使代码易于维护
       
        3:如果使用Javascript函数的页面不一个,那么可以将它们放置在单独的Javascript文件中使用浏览器将其缓存起来,这样
          装载它们时的速度更快,由于多个页面共享Javascript代码时,虽然初次打开打开一个Javascript文件要求浏览器打开
          一个单独的网络连接,以便下载那个Javascript文件,但是高速缓存节省的时间远远大于这个迟延
       
        4:由于性质src的值可以是任意的url,因此来自一个web服务器的Javascript程序或网页可以使用由另一个web服务器输出
          的代码


12.2.3 事件处理程序
       在包含的html文件被进浏览器的时候,脚本中的javascript代码只执行一次,仅使用这种静态脚本的程序不能动态地响应用户
       很多动态性的程序都定义了事件处理程序,当某个事件发生时,web浏览器就会自动调用相应的事件处理程序,由于多个客户端
       Javascript事件是由于Html对象引发的,因此事件处理程序被定义为这些对象的性质,例如,要定义在用户击表单的复边框的
       html标记的性质
       <input type="checkbox" name="opts" value="ingnore-case" onclick="igonore-case=this.checked;">

       我们可以将事件处理程序标记为<script></script>之间的一个函数,然后就可以从事件处理程序中调用这一函数,这样一来
       ,大部分Javascript代码都存放在脚本中,从而减少javascript和html的混合
     
       事件处理程序列表
       onclick,onmuosedown,onmouseup,onmouseover,onmouseout,onchange,onsubmit,onreset
  


12.2.4 URL中的Javascript
       必须使用分号将这些语句隔开:
       Javascript:var now = new  date();"<h1>the time is:</h1>"+now;
  
       javascript Url还可以含有只执行动作,但不返回值的javascript语句, 例如
       Javascript:alert("hello, Word")
  
       通常我们想用Javascript:Url执行某些不改变当前文档的javascript代码,要做到这一点,必须确保UrL中的最后一条语句没有返回值
       一种方法是用void运算显式的地返回值指定为undefined,只需要在javascript:url的结尾使用语句void 0;即可,例如,下面,
       下面的Url将打开一个新的空浏览器窗口,而不是改变当前窗口,而不是改变当前窗口的内容:
       javascript:window.open("obout:blank");void 0;
   
       如果使用这个UrL中没有void运算符,Window.open()方法返回的值将被转换成字符串并被显示出来
       [object window]
  
       使用url可以使用我们不要借助于编辑来创建一个包含该代码的的html文件


12.2.5 非标准环境中的Javascript
        <table border +"&{getBorderwidth9)};">


12.3 Javascript程序的执行  
     前面说了将Javascript代码集成到一个html文件的方法,现在我们将重点介绍Javascript解释器是如何执行Javascript代码中

     12.3.1 脚本
    
     1:Javascript语句是按照它们出现的顺序执行的

     2:如果代表文档主体内容的Javascript对象,还没有被创建,脚本就不能对它进行操作
       注:因为文档是有执行顺序的,我们在文档如果用script调用文档的某个部分 也一定是要按照解析文档的顺序 如果那个文挡
      还没有被解析出来那么,那么我们就不能够用script去

     3:由于脚本在解析和显示包含它们的html文件执行,因此每个脚本的运行时间都不会太长,如果每个脚本执行了繁琐的计算任务
    需要花费较长的运行时间,那么等文挡完全显示出来,用户早已不耐烦了
   
   4:使用src性质从外部javascript文件中读取的脚本的执行方式和直接包含在html文件中的脚本完全一样
       这就是说,html解析器和javascript解释器都会停下来等侍外部的Javascript文件装载进来,装载javascript外部文件时
       即使使用的是相对较快的modem连接,也会引起装载和执行网页的显著延迟,当然,如果高速缓存Javascript代码,这个问题
       就不存在了  
       
   12.3.2  函数 
       定义和执行一个函数不同 我们定义函数可以定义还没有解析出来的对象 但是我们在调用的时候一定要解析出了
  
   12.3.3 事件处理程序
       1: 事件处理程序的执行是异步的,即它们的时间不会太长,我们已经知道,脚本必须去运行得很快,因为脚本在结束运行这前html解析器
          不能继续进行交互,如果一个事件处理程序执行是耗时的操作,给用户的感觉就是程序已经挂起,冻结或者崩溃了,而事件处理程序
          不能运行过久则是因为在程序结束对事件的处理前,用户不能继续和程序进行交互
   
       2: 如果出于某种原因你必须事件处理程序执行一个耗时的操作,那么要确保用户明确地请求了这一操作,而且通知用户需要短时间
          等待,如果程序需要大量的后台处理,可以用方法setTimeout()安排一个函数,在空闲时间反复调用这一函数
      
       3: 事件处理程序可以在一个网页被完全装载之前并解析之胶执行
   
       4: 必须确保事件处理程序不会操作还没有创建和解析的html对象
      
       5:在较为复杂程序中,可以不必确事件处理程序操作的都是在它之前定义了对象,因此你要对这样的程序格外小心,如果一个事件处理
         只是操作和它在同一个表单中定义的对象,那么你就不会遇到什么麻烦,但是如果你要操作的对象在另一个表单中,或者在其它 
         框架中,那么问题就出现了,一种解决的方法就是在操作一个对象之前检测它的存在性,要做到这一点要较一下
       例:
          <script>
           function set_Name_other_frame(name)
            {
              if(Parent.frames[1]==null) return //还没有定其他框架
              if(Parent.frames[1]==null) return //文档还没有装载它
              if(Parent.frames[1].document.myform)return; //还没有定义表单
              if(Parent.frames[1].document.myform.name) return; //还没有定义字段
            }
          </script>
      <input type="text" name="lastname" onchange="set_name_other_frame(this.value)";>
     
      6: 在javascript1.5和其后的版本中,可以忽略上面代码的存在性测试,而在无需在完全装载文档之前调用函数,抛出一个异常,
         使用try/catch语句扑捉这个异常


      7: 在onload事件处理程序设置了一个标志,那么其它事件处理程序通过测试这个标志来判断它们是否能够安全运行,其依据
         就是如果文档已经被完全装载,并且包含的所有对象已经完全被定义了
         <body onload="window.fullyLoaded=true;">
             <form>
                  <input type="button" value="do It!"
                                OnClick="if(window.fullyLoaded) doit();">
             </form>
         </body>
 

  12.3.3.1  onload()和onunload()事件处理程序
            onload():是文档或框架被完全装载时调用,这是说明所有的图像已经被下载并显示出来了,所有子框架已经被装载进来了
            onunload():是则要卸载页之前执行的,如你在显示一个新的窗口的时候,用onunload()处理程序把原来的那窗口给关掉


  12.3.4   javascriptUrl
            它通常用于代替事件处理程序,所以和事件处理程序类似,这种URL中的代码可以在一个文档被完全
            装载之前执行,这种URl通常用于代替事件处理程序,因此对于Javascript:URL,你必须抱有和事件处理程序一样的警觉,要确保
            它们不会引用 还没有定义的对象(或者函数)
  
  
  12.3.5  window 对象和变量的生存期
          window对象是全局对象,所有的全局变量属性都是window对象属性,那么当浏览器从一个页面转而显示下一个页面的时候,
          window对象和它们所包含的属性的变量会发生变化为那个窗口或框架的window对象会被恢复为它的默认状态,即使从新开始
          以前的所有的东西变量什么的都没有了
          但是如果你在使用多框架或多窗口,那么某个窗口中脚本可以引用表示其他窗口或者框架的windows对象,所以除了window
          对象中定义的变量和函数的持续性外,还必须考虑windows对象自身的持续性.

          只要浏览器的顶级窗口存在,那么代表的window对象就会一直存在,无论这个窗口装载和卸载了多少页面,对它的window对象
          引用都有效,这个顶级窗口打开多久,它的window对象就会存活多久,
 

          代表一个框架的windows对象仍然有效,只要那个框架仍然存在于包含它的框架或窗口中.

          这就意味着,无论windows对象代表的是顶级窗口还是框架,它的存在都是相当持久,windows对象的生存可能能比它包含和显示和网页          长,也可能比它显示的网页所包含的脚本长.
           
      
            
                     

                                       第十三章 窗口和框架
         
      就windows自身来说,它也是一个重要对象,每个浏览器窗口以及窗口中的框架都是由windows对象表示的,windows对象定义了许多属性
      和方法,这些属性和方法在客户端javascript程序设计中相当重要,本章对这些属性和方法进行了探讨,而且说明了用窗口和框架进行
      程序设计的一些重要方法

      13.1  window对象概述

            注:在参考部分列出了全部属性和方法
     
            属性: Closed:一个布尔值,只有当窗口关闭时,它才为true;

                  defaultstatus, status:在浏览状态栏中显示的文本

                  document:该对象代表在窗口中显示的html文档,我们将在下一章详细的介绍document对象

                  frames[]:window对象数组,代表窗口中的各个框架(如果存在)

                  history:该对象代表用户浏览窗口的历史

                  Location对象的引用,该对象代表在窗口中显示的文档的url,设置这个属性会引发浏器装载一个新文档

                  name:窗口的名称,可被html标记<a>和target使用

                  opener:对打开当前窗口的window对象的引用,如果当前窗口被用户打开,则它的值为null

                  parent:如果当前的窗口是框架,它就是对窗口中包含这个框架的引用

                  self:自身用属性,是对当前window对象引用,与window属性同义
                  top:如果当前窗口是框架,它就是对这个框架的顶级窗口的window对象的引用,注意,对于嵌套在其他框架中的框架
                      top不等于parent

                  window:自引用属性,是对当前window对象的引用,与selt属性同义

           
            方法:  alert(),confirm(),prompt()
                     向用户显示简单的对话框,confirm()和prompt()用于获取用户的响应

                   close:关闭窗口
                   
                   focus(),blur() 请求或放弃窗口的键盘焦点,focus()方法还通过把窗口提到堆栈顺序的最前面,从而确保窗口可见

                   moveBy(),moveTO():移动窗口
                  
                   open() 打开新的顶窗口,用指定特性显示指定的url

                   print():打印窗口或框架中的内容,就像用户点击了窗口工具档中的print按钮一样(只是Netscape4和其后的版本以
                           及IE5和其后的版本支持该方法
                 
                   resizeBY(),scrollTo():滚动窗口显示的文档

                   setInterval(),clearInterval():设置或者取消重复调用函数,该函数在两次调用之间指定的迟疑
                   
                   setTimout(),cleartimeOut():设置或者取消在指定的若干毫秒后要调用一次的函数

                          
         
                   
  13.2  三种常用的window方法是alert(),confirm()和Prompt() 它们的功能都是弹出简单的对话框
        alert()用于向用户显示消息
        confirm()要求用户点击Ok或Cancel按钮来确认或cancel按钮来确认或取消某个操作
        prompt() 要求用户输入一个字符串
       
        注意:1:这些对话框中显示的文本是纯文本,而不是html格式的文本,而不是html格式的文本,只能使用空格,换行符和各种标点符号
              来格式化这些对话框,调整其布局通常要求来测试,而且会出错,但是要记住,在不同的平台和不同的浏览中的对话框看来会
              有所不同,因此你不能指望自己的格式在所有的浏览器中看起来都正确

             2:有些浏览器会在alert(),confirm()和prompt()生成的对话的标题栏或左上角显示"javascript" 虽然看起来比较讨厌
               但是应该将它看作一个特性,这样防止了编写欺骗程序
         
             3:方法confirm()和prompt()都会产阻塞,在大多数浏览器中 alert()方法也产生阻塞
                <script>
                   alert("aa");
                   var ssg="hello888";
                   if(confirm("你想到下页"))
                     location.replace("dd.html");
                  else
                     document.write("yes");
                     n=prompt(ssg,"good");
                     document.write(n);
                </script>

 

 13.3 状态栏
       在程序中的状栏,它的内容由window对象的两个属性控制,即status和defaultstatus
     
       status:
       当用户将鼠标指针移动到一个超级链接上,浏览器会显出这个链接的url,虽然这是一种通用的情况,但是你在浏览网页的时候,却会发现
       一些链接的行为并非如此,它们显示一些文本,而不是链接的URL,这是通过window对象的status属性和超级链接的事件处理程序
       onmouseover实现的
       <a href="good.html" onmouseover="status='浏览器'; return true;">
       stie Map
       </a>

      
      defaultstatus
      这个属性指定了显示在状态栏中的文本,这条文本可以在鼠标指针移到一个超链接或浏览器的控制按钮上暂时的被url上下文帮助信息
      或者其它瞬时文本所代替,但是当鼠标离开那些区域时,又会恢复到默认文本
      例:
         <script>
               defaultstatus="welcome! click on underlined blue text to  naviagete";
         </script>
     


13.4 超时设定和时间间隔
     SetTimeOut()用来按排一个Javascript代码在将来的某个指定的时间运行,它通常用于一个动画或者其它重复性动作
     ClearTimeOut()用于取消那段代码的运行
   
     settimeout和clearTimeOut()相似,只不过它们会自动重新高度要反复运行的代码,无需代码自己进行再调度
     Javascript1.2添加了setIntrval()和ClearInterval()方法它们功能与setTimeout()和ClearTimeout()相似,只不过是它们会自动
     地重新调度要反复运行的代码,无需代码自己进行再调度


13.5 错误处理
      window对象的onerror属性比较特殊,如果给这个属性赋予一个函数,那么只要这个窗口中发生了Javascript错识,该函数就会被调用
      即它成为窗口的错误处理函数
      传递给错误处理程序的参数有三个:
      第一个参数: 描述错误的消息,它可以是;表达式运算符,只读的,或还没有定义的
      第二个参数:是一个字符串,它存放引发错误的javascript代码所在的文档的URL
      第三个参数:文档中发生错误的行代码
   
      这里还有一个就是 onerror的返回值也很重要,当浏览器通常在一个对话或状态栏中显示错误消息,如果onerror返回true,它
      通知系统处理程序将处理错误,无需其他打操作,换句说就是系统无需显示自己的错误消息,例如你不想让错误消息打扰用户
      ,那么无论你编写多少的bug,都可以在所的javascript程序的开头使用如下代码
       self.onerror = function(){ return true;}


      我们还有另一种处理错误的方法就是使用try/catch语句

13.6  Navigator对象
      属性window.navigator引用的是包含web浏览器总体信息的Navigator对象,Navigator对象是在Netscape Navigator之后命名的
      ,不过Internet Explorer也支持它,IE还支持属性clientINformation它是navigator的同义词
      Navigator对象有五个主要属性用于提供正在运行的浏览器的版本信息

      appname:web浏览器的简单名称
      appVersion:浏览器的版本号和基他版本信息 注意:这应该被视为内部版本号,因为它不总是与显示给用户的版本号一致
   userAgent:浏览器在它user-AGENT HTTP标题中发送的字符串,这个属性通常包含appName和appVersion中所有信息
      appCodeName:浏览器的代码名,Netscape用代码名"Mozilla"作为这一属性的值,为了兼容,IE也采用这种方式
      platfrom:运行浏览在硬件平台,这一属性是Javascript1.2新加的
      
      下面通过一个对话框显示出Navigator对象的这些属性
       Navigator对象属性值有时比我们所想象的要复杂得多,例如我们通常注意的只是appversion属性的第一个数字,当使用Naviagator对   象来检测浏览器信息时,我们通常使用pareint()和string.IndexOf()方法将我们需要的信息提取出来,

     

13.7  Screen对象
      window对象的screen属引用screen对象,这个screen对象提供了用户显示器的大小和可用的颜色数量的信息,属性width和height指定
      是以像素为单位的显示器大小,属性availwidth和availheight指定的是实际可用的显示器大小,它们排除像windows任务栏这样的特性
      所占有的空间.可以使用这些属性来确定要加入文档的图像的大小,或者在创建多个浏览器窗口的应用程序中确定要创建的窗口的大小
     
      属性colordepth指定可以显示的颜色数的以2为底的对数

13.8 window对象的控制方法

    13.8.1 打开窗口
         window.open方法可以打开一个窗口,这个窗口有四个参数
     第一个参数是要在新窗口中显示的文档的Url,可以是null,也可以是空字符串)那么新打开的窗口将是空的

          第二个参数是新打开的窗口的名字,这个名字可以用作为<a>标记或<form>标记的target属性的值,如果你指定的是一个已经
                存在的窗口的名字,那么open()使用的就是只是那个已经存在的窗口,而不是打开一个新的窗口

          第三个参数是特性列表,这些特性声明了窗口的大小和它的GUI装饰,如果省略了这个参数,那么新窗口就会用一个默认的大小
                ,而且具有一套标准的特性,即菜单栏,工具栏等,如果指定了这个参数,就可以明确规定新窗口的大小和要具有特性
                例如:要打开的是一个较小的,可调整的浏览器窗口,它具有状态栏,但是没有菜单栏,工具栏和地址栏,可以使用
                 如下的javascript代码
        var w =window.open("smallwin.html","smallwin","width=400,heigth=350,status=yes,resizable=yes");  
 
          第四个参数只有在第二个参数命名的是一个已经存在的窗口时才有用,它是一个布尔值,声明了由第一个参数指定的url是应该
               替换掉窗口浏览历史的当前项(true),还是应试在窗口浏览历史创建一个新的项(false),后者是默认的设置
   
          open()返回值是代表新创建的窗口的window对象,你可以在自己的Javascript代码中使用这个windows对象来引用新创建的窗口
          ,就像你使用隐式的window对象window来引用运行代码的窗口一样,但是如果在新窗口中运行的Javascript代码要引用的是打开它的
          窗口,如果当前窗口是由用户创建的,而不是由Javascript代码创建的,那么它的opener属性就是null
  
         有关open()方法重要一点是调用它的方式总是window.open(),即使window引用的是全局对象,原则上说来它是可以省略的,明确
         声明window是因为Document方法也有open方法,因此指定window.open()有助于清楚地说明我们要做什么,这不仅是一个具有
         帮助性的好习惯,而且在某些环境下,也是必须的,例如,在执行一个html按钮的事件处理程序时,作用域就包括button对象,包含按
         钮的From对象,包含表单的document对象以及包含文档的window对象,这样一来,如果该事件处理程序只引用了open()方法,该
         标识符在document对象中停止解析,事件处理程序打开的是一个新的文档,而不是一个新的窗口


  13.8.2 关闭窗口
        就像方法open() 如果我们已经创建了一个windows对象w,可以使用如下方法把将它关掉
        w.close();
   
        运行在那个窗口的Javascrpt代码则可以使用下面的代码关闭
        window.close()

        要明确的使用window,这样可以避免混淆window对象的clolse()方法和doucoment()对象的close()方法

        大多数浏览器只允许你自动关闭由自己的javascript代码创建的窗口,如果要关闭其它窗口,可以用一个对话框提示用户,要求他对
        关闭对话框进行确认(取消),这样就可以防止那些不顾及别人脚本编写者编写关闭你的主浏览器窗口的代码


 13.8.3 窗口的几何大小
        movetTo() 可以将窗口移动到指定的位置
        moverBy() 可以将窗口左移,右移指定数量的像素
        resize()和resizeBy()可以按照相对数量调整窗口的大小
      

 13.8.4 键盘的焦点和可见性
        方法focus()和blur()提供了对窗口高级控制
        调用focus()还会把窗口移到堆栈顺序的顶部,使窗口可见,
        在使用window.open()方法打开新窗口时,浏览器会自动在顶部创建窗口,如果它的第二个窗口名已经存在,open()方法不会
        自动的使那个窗口可见,因此,在调用open()后调用focus()很常见


 
 13.8.5 滚动
       window对象还具有一些在窗口或框架中滚动文档的方法,scrollby()会将窗口中显示的文档向左,向右或者向上,向下滚动
       指定数量的像素,scrollto()会将文档滚动到一个绝对的位置,它移动文档以便在窗口文档的左上角显示指定的文档坐标
      
      

 13.9 Location对象
      窗口的Location属性引用的是Loacation对象,它代表的是该窗口中显示的文档的URL laocaiton对象的herf属性是一个字符串
      它包含完整的URL文本,这个对象的其他属性(protocol,host,pathname和search等)则分别声明了URL的各个部分

      Loaction对象的search属性比较有趣,它包含的是问号之后的那个部分URL,这个部分通常是某种类型的查询字符串,一般说来,
      在URL中使用问号是一种在URL中嵌入参数的方法,虽然这些参数数通用于运行在服务器上的CGI脚本,但是没有任何理由阻止使用
      Jvascript的页面使用它们
          
  
      Location属性可以导入一个页面
      reload()会从web服务器上再次装入当前显示的页面
      replace()会装载并显示指定的url

 

 13.10 History对象
       History最初是把用来把窗口的浏览器历史构造成近来访问过的URL的数组,但是这种设计非常驻机构拙劣,出于重要的安全性
       和隐私性的原因,使用脚本能够访问用户以前访问过的站点列表绝不合适,尽管history对象的数组元素不能访问,但它支持
       三种方法 方法back()和forward()可以在窗口的浏览历史中前后移动,用前面浏览过的文档替换当前显救援文档,这与用户  
       点击浏览器的back和ForWord按钮的作用相同,第三个方法go()有一个整数参数,可以在历史列表中向前或向后跳过多个页
     
       

 13.11 多窗口和多框架
       很多地方都有多窗口的现象出现,那么每个窗口中的javascript是如何与其他窗口中以及这些窗口运行的脚本交互的

       13.11 框架之间的关系
 
  
       
          

      
      
        

 

 

     

 

 

 

 

 

 

 

    
    
  
  
     

60多年前,一个朋友给我讲了一个笑话,把我笑翻了,后来由于肚子太疼进了医院。医生给我做手术前,问我 为什么笑成这样,我就讲给他听。他听后狂笑不止,最后竟然笑死了。 我被送上了法庭。法官让我把那个笑话讲出来,由陪审团判定是否与过失杀人的事实要件符合,我要求签订免责合同。法官宣布休庭,一天后重新开庭,宣布接纳我的意见。于是,我当庭把那个笑话讲了出来,结果有人笑得敲桌子,有人笑得在地上打滚。后来,当天所有听到这个笑话的人都笑死了。 我瞬间成了名人,各路记者纷纷要求采访我,我知道这笑话讲出去可能构成公共侵害,于是对着镜头,我含糊地说了一番话,大意就是:“理由永远是谎言,信仰永远是自慰。节目播出后,引起巨大反响。可没想到,有一天,几个神秘便衣闯进我的卧室,把我连拖带拽拉到一个黑屋子里。过了好久,一束强光照到我脸上。我勉强睁开眼睛,惊呆了,坐在我面前的人是目前惟一与我一样家喻户晓的人——总统。 总统大致交待了抓我的目的,很简单:把这个笑话录下来,然后送到中东敌对国家的独裁者那儿,笑死他。我只好答应他的要求,同时提出此笑话属于大规模杀伤性武器,不可针对平民。总统答应了。 两星期后,总统宣布已经掌握了那个笑话的关键技术,并且在沙漠地区试用成功。这在国际间引起轩然大波,很多国家惊慌失措,国际军事学家将此命名为“笑威慑”。就在此时,东方一个国家突然宣布也掌握了该笑话,原来给我讲笑话的那哥们投靠了该国。于是,我们之间形成了“笑威慑平衡”。 三年后,4月1日,我终日担心的终于发生了:中东一个恐怖组织盗取了那个笑话的原始技术。结果,文明遭到前所未有的破坏,各国政府惶惶不可终日。联合国只好召开全球首脑大会,最后将4月1日设定为愚人节。 60多年过去了,我已经风烛残年。在离开世界之前,作为历史见证人,我想有必要把这个笑话讲给大家。那天,我朋友给我讲的这个笑话很简单,很短,就一句话: http://www.tf-studio.com/WORK/FUN/15.HTML 必须回复后,才能查看