[js教程]

JavaScript教程
  1.JS简介及特点
 2.JS与Java的区别
 3.JS的运行环境
 4.JS的数据类型和变量
 5.JS的语句及语法
 6.JS的对象及其属性和方法
 7.JS的事件处理 
*********************************************************************************************************

1.JS简介及特点
    JavaScript语言的前身叫作Livescript。自从Sun公司推出著名的Java语言之后,Netscape公司引进了Sun公司有关Java的程序概念,将自己原有的Livescript 重新进行设计,并改名为JavaScript。
   JavaScript是一种基于对象和事件驱动并具有安全性能的脚本语言,有了JavaScript,可使网页变得生动。使用它的目的是与HTML超文本标识语言、Java 脚本语言一起实现在一个网页中链接多个对象,与网络客户交互作用,从而可以开发客户端的应用程序。它是通过嵌入或调入在标准的HTML语言中实现的。
   JavaScript具有很多优点:
   1.简单性  JavaScript是一种脚本编写语言,它采用小程序段的方式实现编程,像其它脚本语言一样,JavaScript同样已是一种解释性语言,它提供了一个简易的开发过程。它的基本结构形式与C、C++、VB、Delphi十分类似。但它不像这些语言一样,需要先编译,而是在程序运行过程中被逐行地解释。它与HTML标识结合在一起,从而方便用户的使用操作。
   2.动态性  JavaScript是动态的,它可以直接对用户或客户输入做出响应,无须经过Web服务程序。它对用户的反映响应,是采用以事件驱动的方式进行的。所谓事件驱动,就是指在主页中执行了某种操作所产生的动作,就称为“事件”。比如按下鼠标、移动窗口、选择菜单等都可以视为事件。当事件发生后,可能会引起相应的事件响应。
   3.跨平台性  JavaScript是依赖于浏览器本身,与操作环境无关,只要能运行浏览器的计算机,并支持JavaScript的浏览器就可以正确执行。
   4.节省CGI的交互时间  随着WWW的迅速发展有许WWW服务器提供的服务要与浏览者进行交流,确浏览的身份、需服务的内等等,这项工作通常由CGI/PERL编写相应的接口程序与用户进行交互来完成。很显然,通过网络与用户的交互过程一方面增大了网络的通信量,另一方面影响了服务器的服务性能。服务器为一个用户运行一个CGI时,需要一个进程为它服务,它要占用服务器的资源(如CPU服务、内存耗费等),如果用户填表出现错误,交互服务占用的时间就会相应增加。被访问的热点主机与用户交互越多,服务器的性能影响就越大。
   JavaScript是一种基于客户端浏览器的语言,用户在浏览中填表、验证的交互过程只是通过浏览器对调入HTML文档中的JavaScript源代码进行解释执行来完成的,即使是必须调用CGI的部分,浏览器只将用户输入验证后的信息提交给远程的服务器,大大减少了服务器的开销。
2.JS与Java的区别
     JavaScript语言和Java语言是相关的,但它们之间的联系并不像想象中的那样紧密。
   二者的区别体现在:
   首先,它们是两个公司开发的不同的两个产品,Java是SUN公司推出的新一代面向对象的程序设计语言,特别适合于Internet应用程序开发;而JavaScript是Netscape公司的产品,其目的是为了扩展Netscape Navigator功能,而开发的一种可以嵌入Web页面中的基于对象和事件驱动的解释性语言。
   其次,JavaScript是基于对象的,而Java是面向对象的,即Java是一种真正的面向对象的语言,即使是开发简单的程序,必须设计对象。JavaScript是种脚本语言,它可以用来制作与网络无关的,与用户交互作用的复杂软件。它是一种基于对象和事件驱动的编程语言。因而它本身提供了非常丰富的内部对象供设计人员使用。
   第三,两种语言在其浏览器中所执行的方式不一样。Java的源代码在传递到客户端执行之前,必须经过编译,因而客户端上必须具有相应平台上的仿真器或解释器,它可以通过编译器或解释器实现独立于某个特定的平台编译代码的束缚。JavaScript是一种解释性编程语言,其源代码在发往客户端执行之前不需经过编译,而是将文本格式的字符代码发送给客户,由浏览器解释执行。
   第四,两种语言所采取的变量是不一样的。Java采用强类型变量检查,即所有变量在编译之前必须作声明。JavaScript中变量声明,采用其弱类型。即变量在使用前不需作声明,而是解释器在运行时检查其数据类型。
   第五,代码格式不一样。Java是一种与HTML无关的格式,必须通过像HTML中引用外媒体那么进行装载,其代码以字节代码的形式保存在独立的文档中。JavaScript的代码是一种文本字符格式,可以直接嵌入HTML文档中,并且可动态装载。编写HTML文档就像编辑文本文件一样方便。
   第六,嵌入方式不一样。在HTML文档中,两种编程语言的标识不同,JavaScript使用 <script>...</script> 来标识,而Java使用<applet> ... </applet>来标识。
   第七,静态绑定和动态绑定。Java采用静态联编,即Java的对象引用必须在编译时的进行,以使编译器能够实现强类型检查。JavaScript采用动态联编,即JavaScript的对象引用在运行时进行检查,如不经编译则就无法实现对象引用的检查。
3.JS的运行环境
    在目前流行的浏览器中,Netscape公司的Navigator 2.0以上版本的浏览器具都有处理JavaScript源代码的能力。JavaScript在其中实现了它的1.0版本,并在后来的Navigator 3.0实现了它的1.1版本,在现在推出的Navigator 4.0(Communicator)中,JavaScript在其中实现了它的1.2版本。
   微软公司从它的Internet Explorer 3.0版开始支持JavaScript。Microsoft把自己实现的JavaScript规范叫做JScript。这个规范与Netscape Navigator浏览器中的JavaScript规范在基本功能上和语法上是一致的,但是在个别的对象实现方面还有一定的差别,这里特别需要予以注意。
4.JS的数据类型和变量
    JavaScript 有六种数据类型。主要的类型有 number、string、object 以及 Boolean 类型,其他两种类型为 null 和 undefined。
   String 字符串类型:字符串是用单引号或双引号来说明的。(使用单引号来输入包含引号的字符串。)如:“The cow jumped over the moon.” 
  数值数据类型:JavaScript 支持整数和浮点数。整数可以为正数、0 或者负数;浮点数可以包含小数点、也可以包含一个 “e”(大小写均可,在科学记数法中表示“10的幂”)、或者同时包含这两项。 
  Boolean 类型:可能的 Boolean 值有 true 和 false。这是两个特殊值,不能用作 1 和 0。 
  Undefined 数据类型:一个为 undefined 的值就是指在变量被创建后,但未给该变量赋值以前所具有的值。 
  Null 数据类型:null 值就是没有任何值,什么也不表示。 
  object类型:除了上面提到的各种常用类型外,对象也是JavaScript中的重要组成部分,这部分将在后面章节详细介绍。 
  在 JavaScript 中变量用来存放脚本中的值,这样在需要用这个值的地方就可以用变量来代表,一个变量可以是一个数字,文本或其它一些东西。
   JavaScript是一种对数据类型变量要求不太严格的语言,所以不必声明每一个变量的类型,变量声明尽管不是必须的,但在使用变量之前先进行声明是一种好的习惯。可以使用 var 语句来进行变量声明。如:var men = true; // men 中存储的值为 Boolean 类型。 
  变量命名:JavaScript 是一种区分大小写的语言,因此将一个变量命名为 computer 和将其命名为 Computer是不一样的。
另外,变量名称的长度是任意的,但必须遵循以下规则: 
   1.第一个字符必须是一个字母(大小写均可)、或一个下划线(_)或一个美元符 ($)。 
   2.后续的字符可以是字母、数字、下划线或美元符。 
   3.变量名称不能是保留字。 
5.JS的语句及语法
    JavaScript所提供的语句分为以下几大类: 
   1.变量声明,赋值语句:var。
   语法如下: var 变量名称 [=初始值] 
   例:var computer = 32 //定义computer是一个变量,且有初值为32。
   2.函数定义语句:function,return。 
   语法如下: function 函数名称 (函数所带的参数) 
        { 
          函数执行部分 
         }
         return 表达式 //return语句指明将返回的值。 
   例:function square ( x ) 
     { 
       return x*x 
      } 
   3.条件和分支语句:if...else,switch。 
     if...else语句完成了程序流程块中分支功能:如果其中的条件成立,则程序执行紧接着条件的语句或语句块;否则程序执行else中的语句或语句块。     语法如下: if (条件)
         { 
            执行语句1 
          }else{ 
            执行语句2 
          } 
     例:if (result == true)
        { 
          response = “你答对了!” 
         }else{ 
          response = “你错了!” 
         }
   分支语句switch可以根据一个变量的不同取值采取不同的处理方法。 
   语法如下: switch (expression)
        { 
         case label1: 语句串1; 
         case label2: 语句串2; 
         case label3: 语句串3;
            ... 
         default: 语句串3;
        } 
   如果表达式取的值同程序中提供的任何一条语句都不匹配,将执行default 中的语句。 
   4. 循环语句:for, for...in,while,break,continue。 
     for语句的语法如下: for (初始化部分;条件部分;更新部分)
               { 
                 执行部分... 
                } 
     只要循环的条件成立,循环体就被反复的执行。 
     for...in语句与for语句有一点不同,它循环的范围是一个对象所有的属性或是一个数组的所有元素。
     for...in语句的语法如下: for (变量 in 对象或数组)
                 { 
                   语句... 
                  } 
     while语句所控制的循环不断的测试条件,如果条件始终成立,则一直循环,直到条件不再成立。 
     语法如下: while (条件)
           { 
             执行语句... 
            }
     break语句结束当前的各种循环,并执行循环的下一条语句。
     continue语句结束当前的循环,并马上开始下一个循环。
   5.对象操作语句:with,this,new。 
    with语句的语法如下:
             with (对象名称){
                      执行语句 
                     } 
    作用是这样的:如果你想使用某个对象的许多属性或方法时,只要在with语句的()中写出这个对象的名称,然后在下面的执行语句中直接写这个对象的属性名或方法名就可以了。 
    new语句是一种对象构造器,可以用new语句来定义一个新对象。 
     语法是这样的:新对象名称= new 真正的对象名 
     譬如说,我们可以这样定义一个新的日期对象: var curr= new Date(),然后,变量curr就具有了Date对象的属性。 
    this运算符总是指向当前的对象。 
   6.注释语句://,/*...*/。
    //这是单行注释 
    /*这可以多行注释.... */ 
6.JS的对象及其属性和方法
    在JavaScript中是基于对象的编程,而不是完全的面向对象的编程。 
   那麽什麽是对象呢?如果你学过一些VB的编程,对这个名词一定不会陌生。通俗的说,对象是变量的集合体,对象提供对于数据的一致的组织手段,描述了一类事物的共同属性。 
  在JavaScript中,可以使用以下几种对象: 
    1.由浏览器根据web页面的内容自动提供的对象。 
    2.JavaScript的内置对象,如Date,Math等。 
    3.服务器上的固有对象。 
    4.用户自定义的对象。 
   JavaScript中的对象是由属性和方法两个基本的元素的构成的。对象的属性是指对象的背景色,长度,名称等。对象的方法是指对属性所进行的操作,就是一个对象自己所属的函数,如对对象取整,使对象获得焦点,使对象获得个随机数等等一系列操作。
   举个例子来说,将汽车看成是一个对象,汽车的颜色,大小,品牌等叫做属性,而发动,刹车,拐弯等就叫做方法。 
   可以采用这样的方法来访问对象的属性:对象名称.属性名称,例:mycomputer.year=1996,mycomputer.owner = “me”。
   可以采用这样的方法,将对象的方法同函数联系起来:对象.方法名字=函数名字或对象.属性.方法名,例:this.display=display,document.writeln(“this is method”)。 
   多看或多写一些程序,就会理解对象的方法和属性的含义了!各个对象的各种属性和方法,可点击参考!
7.JS的事件处理
    事件是浏览器响应用户交互操作的一种机制,JavaScript的事件处理机制可以改变浏览器响应用户操作的方式,这样就开发出具有交互性,并易于使用的网页。
  浏览器为了响应某个事件而进行的处理过程,叫做事件处理。 
  事件定义了用户与页面交互时产生的各种操作,例如单击超级连接或按钮时,就产生一个单击(click)操作事件。浏览器在程序运行的大部分时间都等待交互事件的发生,并在事件发生时,自动调用事件处理函数,完成事件处理过程。 
  事件不仅可以在用户交互过程中产生,而且浏览器自己的一些动作也可以产生事件,例:当载入一个页面时,就会发生load事件,卸载一个页面时,就会发生unload事件等。
  归纳起来,必需使用的事件有三大类:
   1.引起页面之间跳转的事件,主要是超连接事件。 
   2.事件浏览器自己引起的事件。
   3.事件在表单内部同界面对象的交互。 
  各种JavaScript的事件可点这里参考。
*****************************************************************************************************

玩透弹出窗口 
(http://www.we9703.com/web/js-window/2002129100246.htm)
----------------------------------------------------------------------------------------------------

  经常上网的朋友可能会到过这样一些网站,一进入首页立刻会弹出一个窗口,或者按一个连接或按钮弹出,通常在这个窗口里会显示一些注意事项、版权信息、警告、欢迎光顾之类的话或者作者想要特别提示的信息。其实制作这样的页面效果非常的容易,只要往该页面的HTML里加入几段Javascript代码即可实现。下面俺就带您剖析它的奥秘。 

【1、最基本的弹出窗口代码】 

其实代码非常简单: 

<SCRIPT LANGUAGE="javascript"> 
<!-- 
window.open ('page.html') 
--> 
</SCRIPT> 
因为着是一段javascripts代码,所以它们应该放在 <SCRIPT LANGUAGE="javascript">标签和</script>之间。<!-- 和 -->是对一些版本低的浏览器起作用,在这些老浏览器中不会将标签中的代码作为文本显示出来。要养成这个好习惯啊。 
window.open ('page.html') 用于控制弹出新的窗口page.html,如果page.html不与主窗口在同一路径下,前面应写明路径,绝对路径(http://)和相对路径(../)均可。用单引号和双引号都可以,只是不要混用。 
这一段代码可以加入HTML的任意位置,<head>和</head>之间可以,<body>间</body>也可以,越前越早执行,尤其是页面代码长,又想使页面早点弹出就尽量往前放。 

【2、经过设置后的弹出窗口】 

下面再说一说弹出窗口的设置。只要再往上面的代码中加一点东西就可以了。 
我们来定制这个弹出的窗口的外观,尺寸大小,弹出的位置以适应该页面的具体情况。 
<SCRIPT LANGUAGE="javascript"> 
<!-- 
window.open ('page.html', 'newwindow', 'height=100, width=400, top=0,left=0, toolbar=no, menubar=no, scrollbars=no, resizable=no,location=no, status=no') 
//写成一行 
--> 
</SCRIPT> 
参数解释: 
<SCRIPT LANGUAGE="javascript"> js脚本开始; 
window.open 弹出新窗口的命令; 
'page.html' 弹出窗口的文件名; 
'newwindow' 弹出窗口的名字(不是文件名),非必须,可用空''代替; 
height=100 窗口高度; 
width=400 窗口宽度; 
top=0 窗口距离屏幕上方的象素值; 
left=0 窗口距离屏幕左侧的象素值; 
toolbar=no 是否显示工具栏,yes为显示; 
menubar,scrollbars 表示菜单栏和滚动栏。 
resizable=no 是否允许改变窗口大小,yes为允许; 
location=no 是否显示地址栏,yes为允许; 
status=no 是否显示状态栏内的信息(通常是文件已经打开),yes为允许; 
</SCRIPT> js脚本结束 

【3、用函数控制弹出窗口】 

下面是一个完整的代码。 
<html> 
<head> 
<script LANGUAGE="JavaScript"> 
<!-- 
function openwin() { window.open ("page.html", "newwindow", "height=100, width=400, toolbar= 
no, menubar=no, scrollbars=no, resizable=no, location=no, status=no") 
//写成一行 
} 
//--> 
</script> 
</head> 
<body οnlοad="openwin()"> 
...任意的页面内容... 
</body> 
</html> 
这里定义了一个函数openwin(),函数内容就是打开一个窗口。在调用它之前没有任何用途。 
怎么调用呢? 
方法一:<body οnlοad="openwin()"> 浏览器读页面时弹出窗口; 
方法二:<body οnunlοad="openwin()"> 浏览器离开页面时弹出窗口; 
方法三:用一个连接调用: 
<a href="#" οnclick="openwin()">打开一个窗口</a> 
注意:使用的“#”是虚连接。 
方法四:用一个按钮调用: 
<input type="button" οnclick="openwin()" value="打开窗口"> 

【4、同时弹出2个窗口】 

对源代码稍微改动一下: 
<script LANGUAGE="JavaScript"> 
<!-- 
function openwin() 
{ window.open ("page.html", "newwindow", "height=100, width=100, top=0,left=0,toolbar=no, menubar=no, scrollbars=no, resizable=no, location=no, status=no") 
//写成一行 
window.open ("page2.html", "newwindow2", "height=100, width=100, top=100, left=100,toolbar=no, menubar=no, scrollbars=no, resizable=no, location=no, status=no") 
//写成一行 
} 
//--> 
</script> 
为避免弹出的2个窗口覆盖,用top和left控制一下弹出的位置不要相互覆盖即可。最后用上面说过的四种方法调用即可。 

注意:2个窗口的name(newwindows和newwindow2)不要相同,或者干脆全部为空。OK? 

【5、主窗口打开文件1.htm,同时弹出小窗口page.html】 

如下代码加入主窗口<head>区: 
<script language="javascript"> 
<!-- 
function openwin() 
{window.open("page.html","","width=200,height=200") 
} 
//--> 
</script> 
加入<body>区: 
<a href="1.htm" οnclick="openwin()">open</a>即可。 

【6、弹出的窗口之定时关闭控制】 

下面我们再对弹出的窗口进行一些控制,效果就更好了。如果我们再将一小段代码加入弹出的页面(注意是加入到page.html的HTML中,可不是主页面中,否则...),让它10秒后自动关闭是不是更酷了? 

首先,将如下代码加入page.html文件的<head>区: 
<script language="JavaScript"> 
function closeit() 
{setTimeout("self.close()",10000) //毫秒} 
</script> 
然后,再用<body οnlοad="closeit()"> 这一句话代替page.html中原有的<BODY>这一句就可以了。(这一句话千万不要忘记写啊!这一句的作用是调用关闭窗口的代码,10秒钟后就自行关闭该窗口。) 

【7、在弹出窗口中加上一个关闭按钮】 

<FORM> 
<INPUT TYPE='BUTTON' VALUE='关闭' onClick='window.close()'> 
</FORM> 
呵呵,现在更加完美了! 

【8、内包含的弹出窗口-一个页面两个窗口】 

上面的例子都包含两个窗口,一个是主窗口,另一个是弹出的小窗口。 

通过下面的例子,你可以在一个页面内完成上面的效果。 
<html> 
<head> 
<SCRIPT LANGUAGE="JavaScript"> 
function openwin() 
{OpenWindow=window.open("", "newwin", "height=250, width=250,toolbar=no,scrollbars="+scroll+",menubar=no"); 
//写成一行 
OpenWindow.document.write("<TITLE>例子</TITLE>") 
OpenWindow.document.write("<BODY BGCOLOR=#ffffff>") 
OpenWindow.document.write("<h1>Hello!</h1>") 
OpenWindow.document.write("New window opened!") 
OpenWindow.document.write("</BODY>") 
OpenWindow.document.write("</HTML>") 
OpenWindow.document.close()} 
</SCRIPT> 
</head> 
<body> 
<a href="#" οnclick="openwin()">打开一个窗口</a> 
<input type="button" οnclick="openwin()" value="打开窗口"> 
</body> 
</html> 
看看 OpenWindow.document.write()里面的代码不就是标准的HTML吗?只要按照格式写更多的行即可。千万注意多一个标签或少一个标签就会出现错误。记得用OpenWindow.document.close()结束啊。 

【9、终极应用--弹出的窗口之Cookie控制】 

回想一下,上面的弹出窗口虽然酷,但是有一点小毛病(沉浸在喜悦之中,一定没有发现吧?)比如你将上面的脚本放在一个需要频繁经过的页面里(例如首页),那么每次刷新这个页面,窗口都会弹出一次,是不是非常烦人?:-(有解决的办法吗?Yes! ;-) Follow me. 

我们使用cookie来控制一下就可以了。 

首先,将如下代码加入主页面HTML的<HEAD>区: 
<script> 
function openwin() 
{window.open("page.html","","width=200,height=200")} 
function get_cookie(Name) 
{var search = Name + "=" 
var returnvalue = ""; 
if (document.cookie.length > 0) { 
offset = document.cookie.indexOf(search) 
if (offset != -1) { 
offset += search.length 
end = document.cookie.indexOf(";", offset); 
if (end == -1) 
end = document.cookie.length; 
returnvalue=unescape(document.cookie.substring(offset,end)) 
} 
} 
return returnvalue; 
} 
function loadpopup(){ 
if (get_cookie('popped')==''){ 
openwin() 
document.cookie="popped=yes" 
} 
} 
</script> 
然后,用<body οnlοad="loadpopup()">(注意不是openwin而是loadpop啊!)替换主页面中原有的<BODY>这一句即可。你可以试着刷新一下这个页面或重新进入该页面,窗口再也不会弹出了。真正的Pop-Only-Once! 

写到这里弹出窗口的制作和应用技巧基本上算是完成了,俺也累坏了,一口气说了这么多,希望对正在制作网页的朋友有所帮助俺就非常欣慰了。 

需要注意的是,JS脚本中的的大小写最好前后保持一致。

****************************************************************************************************
JavaScript
(http://www.lib.tsinghua.edu.cn/chinese/INTERNET/JavaScript/javascr.html)
----------------------------------------------------------------------------------------------------
第 1 集
JavaScript 是什麽? 
    JavaScript是一种新的描述语言,此一语言可以被箝入 HTML 的文件之中。透过JavaScript可以做到回应使用者的需求事件(如:form 的输入)而不用任何的网路来回传输资料,所以当一位使用者输入一项资料时,它不用经过传给伺服端(server)处理,再传回来的过程,而直接可以被客户端(client)的应用程式所处理。你也可以想像成有一个可执行程式在你的客端上执行一样!目前已有一些写好的程式在Internet上你可以连过去看看,以下有一些计算器的例子,在Nescape上。JavaScript和Java很类似,但到底并不一样!Java是一种比JavaScript更复杂许多的程式语言,而JavaScript则是相当容易了解的语言。 JavaScript创作者可以不那麽注重程式技巧,所以许多Java的特性在Java Script中并不支援。如需相关的更多资讯,可以去读读Netscape的有关Netscape JavaScript之介绍。
JavaScript如何执行呢?
    Netscape 2.0 beta 3版以上,就可以执行JavaScript的功能了,我们测试过至少beta 3版以上可以,其他种类的WWW浏览器如:Internet Expore 3.0也有此一功能。
范例 1:
以下我们就以一些例子来告诉你如何将JavaScript写在HTML文件中,并且体会一下新语言的特性,我们从第一个例子开始 
:如何用JavaScript印出一串文字至HTML文件中:
<html>
<head>
My first JavaScript!
</head>
<body>
<br>
This is a normal HTML document.
<br>
<script language="LiveScript">
document.write("这是以 JavaScript 印出的!")
</script>
<br>
Back in HTML again.
</body>
</html>
如果你使用的WWW浏览器是Netscape 2.0 beta 3以上版本的话,那你就可以看到相关的结果,而如果你的浏览器并非是可 
以支援JavaScript的话,那看起来就会有一些怪怪的了,以上范例的结果如下:
This is a normal HTML document. 
这是以JavaScript印出的! 
Back in HTML again. 
此一范例并没有太大的用处,它只是要告诉你如何使用<script>的标签,并如何将它置於HTML的文件之中而已,这个新的标签你可以特它放在文件中的任何地方。
范例2:
接下来下一个例子所要介绍的是有关函数(function)的使用。请放心,函数并非很难懂的东西,但它却相当有用。函数通 
常是在HTML文件中<body>的部份被呼叫,而理所当然地,它最好事先被宣告并放在HTML文件中 <body>的部份。好让在<body>部分中使用到函数时,它已确定被读取住来。另外,<script>标签的有关描述语法剖份,你可以用注解的符号将它括起来,以免旧版或无法读取JavaScript的浏览器读到,而误会了意思!
<html>
<head>
<script language="LiveScript">
function pushbutton() {
alert("嗨! 你好");
}
</script>
</head>
<body>
<form>
<input type="button" name="Button1" value="Push me" οnclick="pushbutton()">
</form>
</body>
</html>
如果你是使用Netscape 2.0 beta 3以上的浏览器,那以上JavaScript语法部份的结果如下,你可以试着按按钮看看有何结果产生!在范例2中,将会产生一个按钮,当你用滑鼠去按它的时候,应该会出现一个视窗上面有“嗨!你好的字串,如何?不错吧!这个结果是如何产生的呢?首先,在<head>内的函数会被载入并存於内存中,接着一个新的<form>标签<input type ="button".....>将产生一个接钮。然後,你可以在後面看到'onClick'的指令,这就是告诉浏览器,当该按钮被按时,应会执行onClick後的函数'pushbutton()',而这个函数在刚刚程式被载入时就已安放在记忆体中了!请注意,在这个函数中我们用到了个新东西-alert的method,是JavaScript事先定义好的,它会以对话视窗产生内涵的讯息,并有一"确定"(OK)的按钮。 JavaScript定义了许多的method,你可以连至Netscape公司去获取较完整的讯息。我想这些method在不久的将来会有长长的一串可以够你学的,不过目前的method也已经可以做出相当多东西了!接着下个例子将告诉你如何由一个输入型表格中读入使用者的输入资料,事实上,这也是加入个函数就可以达成的。
范例 3: 
<html>
<head>
<script language="LiveScript">
<!-- hide script from old browsers
function getname(str) {
alert("哈罗! "+ str+"!");
}
// end hiding contents -->
</script>
</head>
<body>
Please enter your name:
<form>
<input type="text" name="name" onBlur="getname(this.value)" value="">
</form>
</body>
</html>
现在你可以试试结果如何: 
请输入你的名字: 
在这个例子中又有新的东西了。首先,让我们注意一下,在语法中的注解部分(<!- ... ->)此部分即我们之前所提到的它 
可以避免旧版本或是不支援JavaScript的WWW浏览器因为不认识这些函数而产生错误。它的顺序应该为<script>先,接着为注解的开头<!-,然後是内容,注解尾->,最後是</script>。另外要注意的一点是,语解尾那一行的开头双斜线"//",不可以省略,它代表了JavaScript的注解,若省略了的话,->之前的字会被误认为是JavaScript的指令。这个例子可以让使用者输入一段文字,然後再输入完毕後经由<input>标签中的"onBlur"事件函数侦知,於是呼叫Getname(Str)这个函数来加以取得输入字串,并将它显示在对话视窗上!函数Getname(this.value)中的"this.value"是你在文字输入格式中所输入的值。
范例4::
这个范例更是帅了!我们在HTML文件档完成了以後,常会加上一行文件最後修改的日期,现在你可不用担心每次都要去改 
或是忘了改了。你可以很简单的写一个如下的描述语法程式,就可以自动的为你每次产生最後修改的日期了:
<html>
<body>
This is a simple HTML- page.
<br>
Last changes:
<script language="LiveScript">
<!-- hide script from old browsers
document.write(document.lastModified)
// end hiding contents -->
</script>
</body>
</html>
以上的document.lastModified叁数在Netscape 2.0 beta 2版时是被写成documeut.lastmodified的,然而,之後的版本就改为document.lastModified,所以注意一下 ;JavaScript本身是会区分大小写的,lastmodified与lastModified在它看来是不同的结果。最後,在这一部分结束之前,要提醒你一点,像范例4,的用法并非每一部机器都是一样的,例如:PC上跑得很正确的,在工作站上不一定会有相同的结果,所以,或许你仍得测一测不同机器的结果才会有所定论。当然,这一切是因为 JavaScript还正在发展的原因,最新的讯息还是得去拜访一下Netscape公司才知道。也许你也不用奇怪,当你隔周再来访时, JavaScript可能又作了相当大的改变了呢!
第2集
范例5:
    在这一部分首先要为你展示的JavaScript特性是将你的滑鼠移到这个不同颜色的连结上面,此时看看浏览器下的状态列有何结果。然後这样的功能我们可以与JavaScript的功能相结合。好,现在再将你的滑鼠移到本处不同颜色的连结上面,你应该会发现有一个视窗出现,是吧?!如何!怎麽做到的呢?以下就是这一个连结的作法:<ahref="tpage.htm"onMouseOver="window.status='Justanotherstupidlink...';returntrue">在这儿你只要在传统<a>的标签中加入onMouseOver的method,就可达成你要的效果了。这里的window.status是用来让你可以在WWW浏览器的状态列上显示一些讯息用的。在语法中,你可以看到讯息部分是用'括起来的部分,而非以"括起来,在讯息部分结束之後,必须加上;returntrue。好了,利用以上的特性可以很简单的完成第二个连结的例子!相当简单,以onMouseOver的method然後配合事件发生时去呼叫函数hello()就行了,不再多加解释了,作法如下:
<html>
<head>
<script language="LiveScript">
<!--Hiding
function hello(){
alert("哈罗!");
}
</script>
</head>
<body>
<a href="" onMouseOver="hello()">link</a>
</body>
</html>
范例6: 
接下来我们要告诉你一个使用日期和时间的例子。在第一部分中,你已看过了lastModified的用法和作法。现在要告诉你 
的并非是印出网路上伺服器或文件修改日期,而是你个人客户端机器的日期和时间。以下就是执行结果:现在时间是:14:52今天日期为:11/28/2003做法如下:
<script language="LiveScript">
<!-- Hiding
today = new Date()
document.write("现在时间是:",today.getHours(),":",today.getMinutes())
document.write("<br>今天日期为:", today.getMonth()+1,"/",today.getDate(),"/",today.getYear());
// end hiding contents -->
</script>
在本例中,我们必需首先建立一个日期变数,这可以由today = new Date()来完成。如果没有特别指定时间与日期的话,浏览器将会采用本地客户端机器的时间,若将它放入变数today中。这儿要注意的是:我们并没有宣告today这个变数的型态,这和 Java或其他的程式语言在用到变数之前必需先加以宣告的方式有相当大的不同。在完成today的日期变数後,我们等於建立了一个具有本地时间与日期的物件(object)。接着就可以使用get... 的method以取得today这个物件的时间和日期。请注意etMonth这个method所取得的月份范围是由0~11,所以必须加1以代表真正的1月至12月。看完以上的例子後,想想你可以使你的文件变得有点智慧,例如:某个文件有时效限制的话,你可以利用我们在上一部份的范例4中所提到的功能和这一个范例中所学习到的功能,设计一个让你的文件在第10天以後读到的话就会告诉读者:"喂!这篇已过时了!"的程式,试试看,并不难!除以上功能外,在建立日期物件时你也可以事先设定日期如下:docStarted = new Date(96,0,13)首先是年(西元),接着是月(但记得减1),再接着是日。同样的方法也可以加上时间的设定,如下:docStarted = newDate(96,0,13,10,50,0)前三个是日期的年、月、日,接着是时、分、秒。最後,我们必须提醒你,JavaScript并没有实际的日期型态,但是它却能毫不费力地显示出日期和时间,原因是它是从1/1/1970 0:0h 开始以ms(milli seconds)来计算目前的时间的,这听起来似有些复杂,但你倒不用担心,它有标准的共用函数可以计算,你只要知道如何用就可以了!
范例7: 
    接下来我们要为你介绍一个可以产生乱数的函数,也是以JavaScript所写的。这个函数只是利用了一点小技巧而已,而这种技巧在大部分的编译器(compiler)中,大都是如此(或类似)计算出乱数来的。我相信JavaScript最後应也会以相似的方法来产生这样的method,如果它会提供这样功能的话。以下是此函数的结果:这是一个计算产生的乱数:0.9210622808328227以下是这个作法的写法:
<html>
<head>
<script language="LiveScript">
function RandomNumber() {
today = new Date();
num = Math.abs(Math.sin(today.getTime()));
return num; 
}
</script>
</head>
<body>
<script language="LiveScript">
<!--
document.write("This is a random number:", RandomNumber());
// -->
</script>
</body>
</html>
我们的做法是以上一个范例中的时间函数;它会出现一个很大的数,利用这个数再加以运算即可!例如:将它拿来做正弦函数(sin)的运算,得到的数再做绝对值的运算,结果可以得到一个介於0与1间的实数。因为时间的改变是ms为单位,而且你绝不会获得相同的数字。不过这个做法并不适合拿来快速的连续产生一系列的乱数,但如果你是不定时,久久的用一次,那效果就不错了! 
范例8:
JavaScript的一个重要特点是它可以制作视窗。你可以产生一个的视窗,并且在此视窗中载入HTML文件,完全以 JavaScript来航游网际网路(Internet )。接下来的范例就是告诉你如何开启一个视窗并且写点东西进去,你可先试试按一下范中之接钮看看!原始程式如下:
<html>
<head>
<script language="LiveScript">
function WinOpen() {
msg=open("","DisplayWindow","toolbar=no,directories=no,menubar=no");
msg.document.write("<HEAD><TITLE>哈 罗!</TITLE></HEAD>");
msg.document.write("<CENTER><H1>酷 毙 了!</H1><h2>这 是<B>JavaScript</B>所 开 的 视 窗! 
</h2></CENTER>");
}
</script>
</head>
<body>
<form>
<input type="button" name="Button1" value="Push me" οnclick="WinOpen()">
</form>
</body>
</html>
这儿你又看到用按钮来启动函数。这次的函数WinOpen()是藉着一个open的method来产生一个新的视窗。第一对双引号("")是用来描述欲载入至视窗中的文件URL位置。如果留者空白的话,那就会呈现一个空白视窗,并可以透过JavaScript写入东西!下一对双引号内的内容是这个新开启视窗的名字,你可以喜欢给它任意一个名字,但不可加入空白,如用Display Window的话便会出现错误讯息,请注意。接下来的一连串双引号内所指定的是该视窗的相关性质(properties),这些蛮有趣的,你可以指定要不要有工具棒(toolbar)、卷轴(scrollbar),等等,例如:如果你写toolbar = yes,那就会在你所产生出来的视窗中出现一排工具列。以下有许多你可以改变的视窗特性,请注意它们字中间不可以有空白:
toolbar
location
directories
status
menubar
scrollbars
resizable
copyhistory
width=pixels
height=pixels
以上的pixels部分,你可以填入点数的数值,这数值是告诉浏览器这个视窗的大小。在开启视窗,并且将它称为msg以後,就可以开始写些东西到视窗中了。你可以写入一般正规的HTML语法文字。哇!这可不得了了,也就是说,你可以利用先前使用者在form表格中输入给你的文章直接将它回应至浏览器上来了!这些功能在几个月前大概还只能用CGI才能达到喔!现在你不用CGI也可以做了!希你能对我们的介绍感到还算不错。由於JavaScript尚未完全发展完成,并且很可能会再继续地做一些更动,希这儿的范例到时都还能执行,在JavaScript更多特性完成後,我们也会继续地再为你介绍一些新的范例的!
第三集
    曾有许多网友问我有关JavaScript与框架(为求方便,以下均用frame表示)合用的问题。事实上,若您同时想用frames和 JavaScript的功能,首先您必需拥有Netscape Navigator 2.0(或以上)浏览器(至少目前是如此)。当然也有某些浏览器支援 frames的功能--如:Oracle开发的PowerBrowser,但此浏览器还只是Beta版,目前尚不支援JavaScript。首先,我稍微解释一下 frames的功用。因为frames功能才开发不久,仍有许多HTML文件中未使用这项新功能。Frames最主要功用是"分割"您的视窗,使每个"小视窗"(frame)能显示不同的HTML文件(译按:这有点类似电视的子母画面)。更妙的是,不同frame之间可以互动(interact),也就是不同frame之间可以交换讯息与资料(information)。例如:假设您开了两个frames,第一个frame可显示普通 HTML文件,第二个rame可显示工具列(toolbar)。此工具列中可包含浏览您homepage所需的各种按钮。如此一来,即使第一个 frame载入了另一个HTML文件,您仍可在第二个frame中看到工具列。现在我先将上述特性展示给您瞧瞧。请按一下下面的按钮,看一看frames的长相。(如果您是线上观看此文件,您可能需稍候一下才看得到结果,因为scripts必需由server中载入到您的机器)。以下是此frame的写法:
<HTML>
<HEAD>
<title>Frames</title>
</HEAD>
<FRAMESET ROWS="50%,50%"> 
<FRAME SRC="frtest1.html" name="fr1"> 
<FRAME SRC="frtest2.html" name="fr2"> 
</FRAMESET> 
</HTML> 
首先您必须告诉浏览器您要开几个frame?这是由<frameset...>这个标签(tag)来宣告。rows这项叁数是告诉浏览器您想将视窗分割成几列?而cols这项叁数是告诉浏览器您想将视窗分割成几行?您也可以用很多组的<frameset...>tags将视窗分割得更复杂。以下是Netsacpe所提到的一个范例:
<FRAMESET COLS="50%,50%"> 
<FRAMESET ROWS="50%,50%"> 
<FRAME SRC="cell.html"> 
<FRAME SRC="cell.html"> 
</FRAMESET> 
<FRAMESET ROWS="33%,33%,33%"> 
<FRAME SRC="cell.html"> 
<FRAME SRC="cell.html"> 
<FRAME SRC="cell.html"> 
</FRAMESET> 
</FRAMESET> 
上面这个例子产生了两行,而且第二行又分割成三列大小相等的空间。在第一个<frameset>tag中的50%,50%两项叁数是用来表是frame的大小。您可以给每个frame一个"名字"(name)。frame的名字在JavaScript语法中的地位非常重要。在本章的第一个范例中您已学到如何替frame命名。接下来您可以用<frame>tag告诉浏览器您要载哪一个HTML文件。我想您已了解frames的基本用法,接下来我们再看一个有趣的范例:上面的按钮将显示:按某个frame中的按钮後,会在另一frame中写入文字。以下是此功能的原始码:在产生frames效果之前,您需先制作下列原始码(frames.html):
<HTML>
<HEAD>
<title>Frames</title>
</HEAD>
<FRAMESET ROWS="50%,50%"> 
<FRAME SRC="frame1.html" name="fr1" noresize> 
<FRAME SRC="frame2.html" name="fr2"> 
</FRAMESET> 
</HTML>
以下是frame1.html的原始码:
<HTML>
<HEAD>
<script language="JavaScript">
<!-- Hiding
function hi() {
document.write("嗨!<br>");
}
function yo() {
document.write(" !<br>");
}
function bla() {
document.write("啦 啦 啦<br>");
}
// -->
</script>
</HEAD>
<BODY>
这是第一个frame!
</BODY>
</HTML>
以下是frame2.html的原始码:
<HTML>
<body>
这是第二个frame!
<p>
<FORM NAME="buttonbar">
<INPUT TYPE="button" VALUE="嗨" onClick="parent.fr1.hi()">
<INPUT TYPE="button" VALUE=" " onClick="parent.fr1.yo()">
<INPUT TYPE="button" VALUE="啦" onCLick="parent.fr1.bla()">
</FORM>
</BODY>
</HTML>
哇!这些语法越来越长了!上述的语法是如何运作的呢?当使用者载入第一个档案(frames.html)後,将会产生两个frame,并且在第一个frame(命名为fr1')中载入frame1.html,而在第二个frame(命名为'fr2')中载入frame2.html。到目前为止都只是普通的HTML语法。或许您已发现在frame1.html中包含了JavaScript语法,但此JavaScript并没有马上被执行。难到这些函式(functions)是不必要的?亦或是我得删除这些不必要的函式?虽我是散惯的人,但这些函式确实是必须的。它们是被位於frame2.html中之JavaScript语法所呼叫而执行的。我在frame2.html中利用JavaScript语法制作了三个按钮,制作按钮来呼叫函式的方法我已在第一章提过,相信您对onClick的用法已相当熟悉。但是......parent.fr1是干嘛用的?若您对物件观念已相当了解,相信它对您不是甚麽新鲜事。您可以看到frames.html同时呼叫frame1.html与frame2.html两个档案,所以frames.html称为 frame1.html与frame2.html的parent(请恕我直接用英文)。同理,这两个新的frame就称为frames.html的child-frames。您可将这种复杂关系想像成阶层式架构(hierarchy)。以下我借助一个小'图'来厘清这种关系:
frames.html parent
/ \
/ \
/ \
fr1(frame1.html) fr2(frame2.html) children
当然您可依此类推,产生一些'grandchildren' frames。(当然,这并不是正式的名称):
frames.html parent
/ \
/ \
/ \
fr1(frame1.html) fr2(frame2.html) children
/ \
/ \
/ \
gchild1 gchild2 'grandchildren' 
若您想由frame2.html呼叫parent-frame中的任何函数,您只要将parent放在您欲呼叫函数名称之即可。同理,若由parent-frame呼叫位於frame1.html中的函数,您只需将fr1放在被呼叫函数称之前。为什麽用fr1呢?原因是我们在frames.html中开了两个frame,而且将它们分别命名为fr1和fr2。所以我用fr1代表第一个frame(frame1.html)。接下来的步骤就相当容易了。当我们欲由frame2.html(命名为fr2)呼叫第一个frame中的函式时该怎麽做?由上面的"小图"您可以发现,frame1.html和frame2.html之间并无直接关连(connection),因此您不可以"直接"由frame2.html呼叫位於frame1.html中的函式。您必须透过parent-frame来呼叫它,所以正确指标(index)应为parent.fr1。例如若您想由frame2.html呼叫hi(),您必须写成parent.fr1.hi()。这也就是为什麽frame2.html中的onClick要写成那种样子的原因了。对了!附带提一点小东西。您或许已发现本章中都用script language="JavaScript">代替前两章用的<script language="LiveScript">。其实此二者间并没什麽差别。但起初JavaScript被植入Netscape浏览器时,您只能用LiveScript语法。(这是一种由Netscape发展的旧语法,和JavaScript极为类似)。我想既然我们讨论的是JavaScript函式,就应使用JavaScript语法。(这只是我的一己之见,在'JavaScript-society'中有许多关於LiveScript的讨论,目前也是众说纷纭....)在此我要花一点时间讨论一个很多人关心的问题。当您观赏一个拥有数个frame的网页时,若您想link至internet其它网页,这些frame并不会消失而且会带来视觉上的干扰。这些讨厌的frame应该如何消除呢? 您只要在您的<a href...>tag中加入TARGET="_top"就可解决这个困扰。方法如下:<a href="goaway.html" TARGET="_top">如果您不想观赏我的网页了</a>当然,您必须在您想要获得此效果的link中都加入TARGET="_top" 。若想要整个网页中的ink都有此效果,您可在此网页的head中加入<base target="_top">较方便。如此一来每个link被按下都可将frame消除。
第四集
    这章我将告诉您如何在状态列 (statusbar) (也就是您浏览器最下方显示 URLs 的那一行) 显示文字,并且将教您 '跑马灯' (以下简称 scroller ) 的工作原理。虽然以 JavaScript 完成的 scroller 目前仍有些问题 (稍後会提到问题在哪儿?),但我还是告诉您它是如何写成的。首先,如何将文字填入statusbar 呢?下述语法将告诉您如何做到这项功能: (按下按钮後请注视statusbar的变化)很新奇吧! 请看看原始码 : 
<html>
<head>
<script language="JavaScript">
<!-- Hide
function statbar(txt) {
window.status = txt;
}
// -->
</script>
</head>
<body>
<form>
<input type="button" name="look" value="写入文字" οnclick="statbar('嗨 ! 这就是状态
列 (statusbar) !');">
<input type="button" name="erase" value="清除文字" οnclick="statbar('');">
</form>
</body>
</html>
我制作了两个都会呼叫 statbar(txt) 函式 (function) 的按钮。当此函式被呼叫後,字串经由括弧中的变数 txt 传给 
statbar(txt)。 (不一定要用 txt,用别的变数名也可以)。当电脑执行到 <form> tag 时,一旦按下按钮就会呼叫 statbar(txt)。但是电脑并没有马上将 txt 的内容写在 statusbar,只是将欲显示的字串存入 txt。换句话说,藉由呼叫函式,只是让变数 txt 得到一个值。因此当您按下 '写入文字' 这个按钮後,会呼叫 statbar(txt) 而且 '嗨 ! 这就是状态列 (statusbar) !' 这个字串会存入 txt 中。咻 ! 讲了这麽多只是想告诉您这种写法可预留一些弹性。什麽弹性呢?就是您可重复使用 txt 这个变数。您看看第二个按钮,它也是呼叫相同的函式。若您不利用一个变数来传递字串的话,就必须写两个不同的函式了。那麽statbar(txt) 到底做了些什麽?其实没什麽,只是将 txt 的内容写入变数 window.status中。这是由window.status = txt; 做的。另外若想消除文字,只需送一个空字串 ('') 给 statusbar。请注意,因为在onClick 中我们已经使用双引号 " ,所以这里必须用单引号 ' 。这是为了让浏览器辨认哪两个引号是一对的,因此您必需双引号和单引号交替使用。由此份简介文件第二章您已学过 onMouseOver 的特性了 :<a href="tpage.html" onMouseOver="window.status='Just another stupid link...'; return true">您可能会对一件事感到厌烦。那就是当 mouse 的指标已从 link 移开了,但是statusbar 中的文字还留在那!没关系,我教您一个解决的办法。利用上面教您如何消除 statusbar 中文字的方法,我们来写一个小函式。但是如何侦测出 mouse 的指标已从 link 移开并进而呼叫消除文字的函式呢?侦测 mouse指标是否已从 link移出的功能目前还无法达到,但可用 "计时器" 来暂时解决此问题。试试将 mouse 移到此 link 上看看statusbar 的变化,但请不要按它。怎麽样?很棒吧!看看下面的原始码您就知到这东西很简单。 
<html>
<head>
<script language="JavaScript">
<!-- Hide
function moveover(txt) {
window.status = txt;
setTimeout("erase()",1000);
}
function erase() {
window.status="";
}
// -->
</script>
</head>
<body>
<a href="dontclck.html" onMouseOver="moveover('瞬间即逝 !');return true;">
link</a>
</body>
</html>
这script 的许多部份相信您已了解。moveover(txt)其实和先前的statbar(txt)差不多。erase()也和先前所讨论的相同。在 HTML 网页中的 <body> tag 里我们加入一个具有 onMouseOver 功能之 link。当 mouse指标移至 "link" 上就会呼叫moveover(txt),并且利用 txt 变数传递字串 '瞬间即逝 !'。接下来的步骤就和statbar(txt) 一样, window.status 收到 txt 的值後将之显示在 statusbar 上。而 setTimeout(...)这项新函式是用来作为一个 "定时器"。setTimeout(...)能作些什麽事呢?它的主要特性是当某段设定的时间 "跑"完了之後,便执行某函式。在这个例子中,於 1000 毫秒後 (也就是 1 秒後)就会执行 erase()。换句话说,当 1 秒结束後 moveover(txt) 的功能就会因 erase()的自动执行而停止。虽然规定时间 "跑"完後定时器并不会重新启动,但您可以在 erase() 中再用一次setTimeout(...) ,使其循还不断,看起来就像一个跑马灯(scroller)。您已学到了 setTimeout 的功能和如何在 statusbar 中显示文字,接下我将教您如何制作一个在statusbar 显示的 "跑马灯" (scroller)。请按下方的按钮看看我做的 scroller。由於 script 需由 server载入到您的电脑中,因此这要花一点时间,请耐心等一下。以下是原始码 : 
<html>
<head>
<script language="JavaScript">
<!-- Hide

var scrtxt="怎麽样 ! 很酷吧 ! 您也可以试试."+"Here goes your message the visitors 
to your page will "+
"look at for hours in pure fascination...";
var lentxt=scrtxt.length;
var width=100;
var pos=1-width;

function scroll() {
pos++;
var scroller="";
if (pos==lentxt) {
pos=1-width;
}
if (pos<0) {
for (var i=1; i<=Math.abs(pos); i++) {
scroller=scroller+" ";}
scroller=scroller+scrtxt.substring(0,width-i+1);
}
else {
scroller=scroller+scrtxt.substring(pos,width+pos);
}
window.status = scroller;
setTimeout("scroll()",150);
}
//-->
</script>
</head>
<body onLoad="scroll();return true;">
这里可显示您的网页 !
</body>
</html>
上面script用的语法相信大部份您已经懂了。setTimeout(...)"告诉"计时器当时间到了就呼叫scroll()。如此一来 scroller便会向前移动一步。在 script 的开头有许多计算式,那是用来决定文字开始显示的位置,了不了解并不重要。一旦决定了文字的启始位置,就必需加些空格 (space) 以使文字能显示在正确位置。在此章一开始我曾提到,此种scroller并不是很受欢迎。即使是,也不会持续很久。为什麽呢? 下面我列出几个主要原因:当第一次看到 scroller 或许您会觉得很新奇,但久而久之便会觉得索然无味。当然,这是所有 "酷玩意儿"(cool trick) 皆有的现象。其实这还不是主要原因,更严重的问题还在後头呢 ! 当您移动 mouse 时,您可以发现 scroller 的速度改变了 (至少在我的机器上是如此)。尤其当您更改 setTimeout 的值为使scroller 跑快一点时,这种情况更严重。不过这问题或许还有解决方法。更糟的是若让 scroller 跑久一点,会出现 Out of memory error的问题 ! 天呀 ! 这是 Netscape Navigator 2.0 的一个 "臭虫" (bug)。我们期待新的版本能更正此 bug (译按 : Netscape Navigator Atlas Preview Release 已更正此 bug)。在网路上有许多这方面的应用,您可以试着找找。我曾经看过有人将 scroller 放在 Homepage 中,这应该不会太难。(译按 : 有兴趣的人可叁考目录中本人所制做的 scroller)
第五集
    阵列(arrays)的运用是程式设计中一项种要的技术。每一种程式语言均以某种特定方式来表示阵列。或许您已了解阵列在程式设计中的好处,但翻遍Netscape所提供的文件,并没有提及如何使阵列。这是因为JavaScript并不支援阵列。但是现在我将教您如何在JavaScript中使用阵列。首先,阵列是干用的?您可以把它看成一长串的变数(variables)。假设您现在需要宣告 10个变数,您可以一个个将10个变数宣告为a,b,c...,但当您需要100个或更多的变数时,这种方法将会得很麻烦。若您使用一个拥有10个元素(elements)的阵列(暂且命名为'MyArray')来表示这10个变数,则可以用MyArray[1],MyArray[2],MyArray[3]...分别代表第一,二,三....个变数(很多程言是从0开始当作第一个元素,但在JavaScript语法中是从1开始)。因此若您想将第一个元素(或称变数)的值指定为17,您只要写成MyArray[1]=17即可。由此可看出阵列的功用和一般变是相同的。不光如此,若您想将所有元素的值均指定为17,您只要写一个简单的圈(loop)即可:for(var i=1;i<11;i++)MyArray[i]=17for-这个指令是告诉电脑其後的指令总共要执行几次。for-圈是从1开使,也就是电脑会先执行MyArray[1]=17。然後i会增加1并接着执行 MyArray[2]=17。i每次递增1直到i=10为止。接下来教您如何做阵列的初始化(initialization)。这个问题曾在JavaScript Mailinglist中讨论过。(如果您想订阅mailing list,您只要在e-mail中填入subscribe javascript-digest并寄到majordomo@obscure.org即可。接着您每天就会收到一到二个约20-30kB的大档案,这些档案包括所有来自JavaScript-list的信件)。 
function initArray() {
this.length = initArray.arguments.length
for (var i = 0; i < this.length; i++)
this[i+1] = initArray.arguments[i]
}
您不需要了解这个函式(function)的意义,您只要知道怎麽用就好。如果您要宣告一个拥有三个元素的阵列,且其值分别指定为17,18,19,您只要写成:var MyArray= new initArray(17,18,19)。您也可以用字串strings)当作元素的值:var heyho= new initArray("This","is","酷")。因此您不必管元值的型式(type),即使混着用也行:var Mixedup=new initArray(17,"yo", 103)。下面我将对一个阵列'Mixedup'作初始化,并显示阵列的内容:
Element No. 1: 17
Element No. 2: yo
Element No. 3: 103
其原始码如下:
<script language="JavaScript">
<!-- Hide
var Mixedup= new initArray(17,"yo",103);
document.write("Element No. 1: "+Mixedup[1]+"<br>");
document.write("Element No. 2: "+Mixedup[2]+"<br>");
document.write("Element No. 3: "+Mixedup[3]+"<br>");
// --> 
</script>
当我昨天写一个小游戏时,我遇到一个您也可能会碰到的问题。当您想清除视窗或frame中的内容时, 
Netscape文件中提到了一个函式可用--'document.clear()'。但当您将此函式写入网页中,它并不会如预期的清除视窗或frame中的内容。而且document.clear()在各种平台(platform)上似都无效。Gordon McComb告诉我一个清除视窗或frame中内容的好方法,您可以试试:
document.close();
document.open();
document.write("<P>");
您不一定要写最後一行document.write("<P>");,只有当您想在视窗中写入某些东西时才需要加入此行。上述方法对frame亦有效。接下来我们谈一个可以让您在不同文件之间穿梭的语法--back()和forward()两个函式。通常我们在网页中加的back-link和Netscape-Navigator中的"Back键"功能上并不相同。Netscape-Navigator中的"Back键"是回到您history list中的上一页。您现在也可利用JavaScript做到相同的功能。只要按下此link,您可以再度回到此页。JavaScript语法的原始码如下:
<html>
<body>
<FORM NAME="buttonbar">
<INPUT TYPE="button" VALUE="Back" onClick="history.back()">
<INPUT TYPE="button" VALUE="JS- Home" onClick="location='script.html'">
<INPUT TYPE="button" VALUE="Next" onCLick="history.forward()">
</FORM>
</body>
</html>
您也可以用history.go(-1)和history.go(1)代替.
第六集
    许多网友问我一个有趣的问题:如何用mouse按一下便可同时载入两页文件。基本上有三种方法可以达到这种功能。第一种方法是制作一个按钮,让使用者按下後去启动一个能同时将两份件载入不同frames或新视窗的函式(function)。若您曾经看过此份简介文件的其它章节的话,我相信您可以很轻易写出这种语法:我们制作了三个frame,第一个frame中包含了一个按钮。请注意,第一个HTML档案只是用来打开frame和给予每个frame一个名字。若您还不清楚JavaScript和frame的关系,可以先阅读第三章。不过在此还是照例让您瞧瞧原始码(不知您是否在很多电脑书籍中遇到一个相同的困扰,那就是作者常把一些自认很简单的东西忽略不提,结果那些东西正是读者搞不懂的地方!所以,若您对我提的东西已很了解,请发挥一下您的耐性:-)frames2.html
<HTML>
<HEAD>
<title>Frames</title>
</HEAD>
<FRAMESET COLS="295,*"> 
<FRAMESET ROWS="100%,*"> 
<FRAME SRC="loadtwo.html" NAME="fr1"> 
</FRAMESET> 
<FRAMESET ROWS="75%,25%"> 
<FRAME SRC="cell.html" NAME="fr2"> 
<FRAME SRC="cell.html" NAME="fr3"> 
</FRAMESET> 
</FRAMESET> 
</HTML>
第一个frame会载入loadtwo.html并产生一个按钮:loadtwo.html
<HTML>
<HEAD>
<script language="JavaScript">
<!-- Hiding
function loadtwo(page2, page3) {
parent.fr2.location.href=page2;
parent.fr3.location.href=page3;
}
// -->
</script>
</HEAD>
<BODY>
<FORM NAME="buttons">
<INPUT TYPE="button" VALUE="同 时 载 入 两 份 文 件" onClick="loadtwo('frtest1.html',
'frtest2.html')">
</FORM>
</BODY>
</HTML>
按下按钮後,电脑会传递两个字串给loadtwo()并将之启动。由loadtwo()中可以看出,第一个字串是用来定义第二个frame fr2所载入文件的位址和档案名。若您想定义另外的按钮来载入不同的文件,您可以重复使用此函式。只要将文件的URLs(addresses)传给loadtwo()即可。接下来谈谈用hyperlinks同时载入两页文件的第二种方法。在Internet上您可以发现许多网页使用<a href="yourlink.html" onCLick="yourfunction()">来达上述提及的功能。但此语法并不能在所有平台上均正常执行,因此最好不要用此语法。现在我告诉您另一种写法:我们可改用下述JavaScript语法:<a href="javascript:myfunction()">My Link</a>此种方式非常简单而且在所有浏览器中均能正常执行。您只要写上javascript:并加上您想联结的函式名即可。若此函式名称设为'loadtwo()',那您就可藉由按下此hyperlink来达到同时载入两份文件的目的了。再接着谈谈用mouse按一下便可同时载入两页文件的第三种方法,此方法可以以hyperlinks或按钮来执行。您可先在第二个frame中载入一个HTML文件:<a href "getfr2.html" target="fr2">请按这里!</a>然後在此文件中(getfr2.html)加入onLoad这项指令,用来触发第三个frame载入另一份文件。如此一来便可同时载入两份文件。getfr2.html档的原始码如下:
<HTML>
<BODY onLoad="parent.fr3.location.href='getfr3.html'; return true;">
文 件 内 容.....。
</body>
</html>
当然,您必须在所有会被载入到第二个frame的文件中加入onLoad这项指令。另一个常遇见的问题是如何开一个新视窗并载入文件?我们想达到的效果是当使用者按一下mouse便会'弹'出一个新视窗。很简单,只要在<a href...>中利用target这项特性就可达到此效果。例如:<a href="goanywhere.html" target="Resource indow">Go!</a>现在我将谈谈在JavaScript中几种常用的运算子(operator)。运算子可以使您的JavaScript 法更精简。假设您想测试变数x是否大於3且小於10,您可写成:
if (x>3)
if (x<10)
doanything();
当满足x>3且x<10时,就会执行doanything()。还有一种更精简的写法:if (x>3 && x<10) doanything();' &&'称为AND-运算子。还有另一种被称为OR-运算子的东东可让您用来检视是否变数x等於5或变数y等於17:if(x==5 || y==17)doanything();当满足x==3或y==17时,就会执行doanything()。当然,当两者皆成立时也会执行doanything()。在JavaScript中是利用==来做比较的工作(其它尚有<,>,<=和>=),这些都和C/C++的语法相同。另外单一'='是用来将数值存入变数用的。(在Pascal语法中将数值指定给变数是用:=,而做比较是用单一的'=',这和JavaScript语法有点不同)若您想利用'不等於'这项特性,您可以用!=。例如:x!=17.尚有许多可以精简您的JavaScript语法的运算子,去翻翻Netscape的文件吧!
第七集
    输入表单(form)对某些Internet上的网页而言是很重要的。通常form的输入内容会被送回server中做处理。JavaScript具有确认输入值的功能,可以事先确保这些值是属於"合法的",进而避免将错误的输入值送回server。首先我将告诉您如何对 form的输入做确认的工作,再来我将会提到用JavaScript将资料送回server的可能性。咱们开始吧!我先写一个简单的语法。在下面我加了两个text-元件(element),请将您的大名写入第一个空格,并将您的e-mail address写入第二个空格。您可在这两个空格中任意输入并按下按钮。您也可以不输入任何东西就按下按钮试试 ! 
请输入您的大名:
请输入您的e-mail address:
对第一个空格而言,若您没有键入任何东西,电脑便会出现一个错误讯息,并请您再输入一次。当然,此空格会把任何输入的字串都视为"合法的"输入,它无法辨认出您输入的名字是正确的或是胡的。即始您输入的是数字,它也会把此数字当成您的大名。例如您输入'17',它将会显示'嗨!17'。第二个空格就设计得稍微复杂一点了。您可试着输入一个简单的字串-例如您的大名,它将会显示错误讯息,并请您再输入一次(除非您输入的字串含有@...)。这个空格的确认标准是检视您输入的字串中是否含有@。即使只输入一个@,它也会被视为合法的输入---虽然这也不是正确的e-mail address。所有Internet的e-mail address皆含有@,因此对e-mail address输入值做此种确认工作是很适合的。接下来看看上述功能的原始码吧:
<html>
<head>
<script language="JavaScript">
<!-- Hide

function test1(form) {
if (form.text1.value == "")
alert("您 没 写 上 任 何 东 西, 请 再 输 入 一 次 !")
else { 
alert("嗨 "+form.text1.value+"! 您 已 输 入 完 成 !");
}
}

function test2(form) {
if (form.text2.value == "" || 
form.text2.value.indexOf('@', 0) == -1) 
alert("这 不 是 正 确 的 e-mail address! 请 再 输 入 一 次 !");
else alert("您 已 输 入 完 成 !");
}
// -->
</script>
</head>

<body>
<form name="first">
Enter your name:<br>
<input type="text" name="text1">
<input type="button" name="button1" value="输 入 测 试" onClick="test1(this.form)">
<P>
Enter your e-mail address:<br>
<input type="text" name="text2">
<input type="button" name="button2" value="输 入 测 试" onClick="test2(this.form)">
</body>
先看看body-之後的HTML语法。我们嵌入了两个text元件和两个按钮。第一个按钮呼叫test1(...),第二个按钮呼叫test2(...)。this.form这个变数会将此form的名字(在此例中就是first)传给函式(function),以便能正确将元件"定址"(address)。 test1(form)的功用在於检查您是否输入字串(亦即检查是否为"空字串")?此项工作是由if(form.text1.value=="")...所执行。'form'这个变数将会接收由'this.form'所传来的值。但我们何在test1(...)中抓取我们所输入的字串呢?您可利用'value'这个变数再加上'form.text1'来抓所输入的字串然後将它和""比较,检查是否为"空字串"。若是"空字串"则表示并无输入任何东西,那麽Netscape将会出现警告并要求您再输入一次。若test1(...)检查结果并非"空字串",则会出现"您已输入完成!"的讯息。请注意,即使只输入一个空白(space),test1(...)也会将之视为合法输入。当然,您也可以略施小技来排除上述可能性,我相信这很容易。现在请看test2(form)。在此函式中我们利用相同的方法来检测输入值是否为空字串,但是我在if-指令中加入了额外的检测功能。||这个符号代表OR运算子(operator),您可在第六章中学习它的用法。f-指令用来检测第一与第二个比较式是否其中之一为"真"?若有其中之一为"真",则整个if-指令即为"真",如此便会执行其後的指令。换句话说,若您没有输入任何字串或您输入的字串中没有包含'@',均会被视为"不合法"输入。您知到有几种方法可用来送出form的内容吗?最简单的方法就是利用e-mail来送出form的内容。我下面介绍的方法就是属於这一种。若您不想利用e-mail来送出form的内容且想让server能自动处理form的输入值,此时此刻只有CGI能做得到。譬如您想做一个类似Yahoo可以让使用者迅速得到结果的搜寻引擎(search engine),您就必须使用CGI。如此一来使用者才不需等待系统管理者处理form的输入值,而可由server自动处理并迅速将处理结果报告给使用者。目前JavaScript无法达到此种功能。即使您想制做一个"访客签名簿"(guestbook),也不可能利用 
JavaScript来叫server自动将资料加入网页中。目前只有CGI能做到如此。但您可以制做一个利用e-mail传送使用者资料的 guestbook,只是您需以手动(manual)方式来处理使用者所传来的资料。若您一天不是收到很多使用者送来的资料的话,这也未尝不可。以下语法只使用到普通的HTML语法,并不需用到JavaScript只有当您想在资料送出前做一些确认工作的话,才需用到 JavaScript。虽然目前有些浏览器无法使用mailto-这项指令,我相信较新版的浏览器都会支援这个指令。
<FORM METHOD=POST ACTION="mailto:your_email@goes.here">
<H3>您 喜 欢 我 的 网 页 吗 ?</H3>
<INPUT NAME="choice" TYPE="RADIO" VALUE="1">一 点 也 不 喜 欢。<BR>
<INPUT NAME="choice" TYPE="RADIO" VALUE="2" CHECKED>简 直 浪 费 我 的 时 间。<BR>
<INPUT NAME="choice" TYPE="RADIO" VALUE="3">这 简 直 是 Net 上 最 烂 的 站 台。<BR>
<INPUT NAME="submit" TYPE="SUBMIT" VALUE="Send">
</FORM>
上述语法可藉由e-mail收到使用者对您网页的观感。唯一的困扰是您可能会收到内容类似密语(cryptic)mail。mail内容的空格(space)有时会以'+'代替,有时会以'%20'代替。看+起+来+ 就+像+这+样。我相信网路上应有某种程式可将收到的mail转换成"可读"的语句。另外有一种不错的应用可使您的表单输入更具"亲和性"(user-friendly)。您可以指定一开始先"定焦"(focus)於哪个元件(element,简单的说就是输入项)。或是您可让浏览器"定焦"於使用者输入错误的表单。换句话说,浏览器将会把mouse的游标放在您"定焦"的元件上,如此一来使用者便不需在输入字串之前按一下mouse。请看这项功能的原始码:
function setfocus() {
document.first.text1.focus();
return;
}
这项语法是将"定焦"放在第一个text-元件上(以本章为例,就是在"请输入您的大名"的空格中有游标在闪烁)。您必需在语法中指定您想"定焦"的表单名字(以本章为例,就是first)和元件的名字(以本章为例,就是text1)。若您在一开始载入网页时就想"定焦"於某个元件上,只要在<body>-tag中利用onLoad-即可:<body nLoad="setfocus()">
关於JavaScript的演变
    虽然Netscape Navigator 2.0已推出正式版,但JavaScript仍在持续开发中。因为此描述语法(scriptinglanguage)仍相当新,在可预见的未来仍会作许多改变。但此时此刻我们已可以利用它许多功能来丰富自己的网页。下面我举一个亲身遭遇的经验,来说明JavaScript仍不断在改变:我曾经在网页中加入了lastmodified这项语法,这语法在Netscape 2.0 beta 2可正常执行但在较新版的流览器中,这项语法却改成了lastModified。可能您会认为这二者之间没不同,流览器应不会受任何影响。错了!流览器会将它们视为不同的东西。如此可见JavaScript仍是相当的"因大小写而异"(case sensitive),所以对某些特例您必需把它分辨清楚。在Netscape 件中所提到的众多功能(function),有些根本还不能使用,有些却含有令人讨厌的错误(bug)。其中某些错误还会选择性的只影响某些特定的使用者,例如date这项功能在Mac的机器上无法正确执行。这种种问题,您可在FAQ(frequently asked questions)找到。很抱歉我无法得知将来JavaScript还会做些什麽改变,也无法得知这些改变将会对您已完成的语法发生多大影响。但在这瞬息万变的网路世界中,我不愿等到JavaScript正式定稿後才去用它。我相信您也不愿意....若您对我文件中的范例有任何疑问,请告诉我。我也将继续充实这份文件请您不定时上线查看。
Java和JavaScript是完全不同的
    我先前已提过此点,不过我愿意在此重覆强调一次:Java和JavaScript是完全不同的!它们之间有许多相异之处。许多网友没有厘清此点观念,误将Java方面的问题贴在BBS的JavaScript版(如 comp.lang.javascript ),而将JavaScript方面的问题贴在Java版(如comp.lang.java),这完全是错误的。因为Java是一种程式语言(programming language),而JavaScript是一种描述语法( scripting language ),所以它们所使用的技术差异甚大。这两种语言是针对不同的目的所开发的,不可混为一谈。我必需承认由於此二者的名字太过相似,导致许多人误以为它们是相同的东西。因此,当您要问某人有关Java或JavaScript方面的问题时,请先确定您要问的是哪一种?

***************************************************************************************************************

建立JScript脚本

***************************************************************************************************************
当建立多行的脚本时,你必须在每一句的末尾用分号结束,它表明了一句的结束及另一句的开始。下面是个例子:
<%
myvar=“Hello World!”;
myvar2=“How are you?”;
myvar3=myvar+myvar2;
%>
<%=myvar3%>
注意
实际上当使用Microsoft的JScript时,你可以忽略分号。这样做不会产生错误。JScript通过检测一个新的行来判断是否一句结 
束了。然而,对Java Script来说,不加分号是不允许的。因此,你应当养成添加分号的习惯。
还应该注意JScript是一种区分大小写的语言。当使用变量、函数、对象及方法时,你必须用正确的大小写字符来识别它们。例 
如,下面的脚本将导致一个错误:
<%
myvar=“Hello World!”;
%>
<%=MyVar%>
当执行这个脚本时,将会产生“MyVar”未定义的错误。脚本的这个错误是由于MyVar与变量myvar不是一个变量。因为MyVar没 
有设定一个值,因此脚本产生了一个错误。
为JScript脚本添加注释
为你的代码添加注释是明智的。随着时间的推移,代码会变得越来越难懂。当你回过头来重写或修改几个月前编写的脚本时, 
你将会庆幸你的先见之明。
有两种方法为你的脚本添加注释,你可以用专用符号//来添加一行注释,任何跟在这个字符之后的一行文本都将被忽略。这种 
类型的注释对于解释代码中某一特定行的功能是非常有用的。
<%
myvar=“Hello World!” //This is an assignment to a variable
%>
当你需要加入多行注释时,你可以将你的注释放在符号对/* 和 */之中。这种类型的注释对于解释一段代码甚至整个脚本的功 
能是非常有用的。如下面的例子:
<%
/* This script prints Hello World! 500 times.
It was initially created on July 5, 1997.
It was last revised on August 28, 1997.
*/
for (myvar=0; myvar<500; myvar++) %>
<B> Hello World! </B>
注释的另一个用处是临时取消某一段脚本的作用。要取消一句或更多JScript,只需将它们当作注释对待。当你在调试错误时这 
个方法是非常有用的。
对象、方法和属性
与VBScript相比,JScript是非常面向对象的。用VBScript编写的脚本大部分是用函数来完成任务的,而用JScript编写的脚本大部分是用对象及它们的方法和属性来工作的。这两种语言的差别可以通过怎样用各自的语言来显示当前日期和时间这一问题来说明。
用VBScript来显示当前日期和时间,你可以调用函数NOW,象下面这样:
<HTML>
<HEAD>
<TITLE> VBScript Date </TITLE>
</HEAD>
<BODY>
The date and time is: <%=NOW%>
</BODY>
</HTML>
另一方面,用JScript来显示当前日期和时间,你需要首先建立一个日期对象,象下面这样:
<%@ LANGUAGE=JScript %>
<HTML>
<HEAD>
<TITLE> VBScript Date </TITLE>
</HEAD>
<BODY>
<%mydate=new Date(); %>
The date and time is: <%=mydate%>
</BODY>
</HTML>
在此例中,表达式mydate = new Date()创建了一个新的名为mydate的日期对象,它含有当前的日期和时间,这个对象必须在显示当前日期前建立。使用VBScript显示日期和时间,你只用简单地调用一个函数,而用JScript来显示日期和时间,你必须先建立一个新对象,这就是为什么JScript被称为面向对象语言的原因。对象究竟是什么?对象是包含方法和属性的一种东西,对象的方法是可对对象进行操作的东西,而对象的属性是一些特定的值(或是其它对象)。举一个日常用的例子,一本书就有它的方法和属性,例如,你可以对一本名为Huckleberry Finn的书采取行动,你可以读它,给它印上花或者如果你觉得它特别糟糕你也可以烧掉它,这些都是与这本书相关的方法。一本书也有一些属性,例如,名为Huckleberry Finn的书有作者和一定的页数,这本书的这些方法和属性决定了你以何种方法与它交流。与此相比,一个JScript对象有它的方法和属性,你可以对JScript对象采取特定的行动,你也可以指定和读出对象的某些属性,一个对象的方法和属性决定了你用何种方式来处理它。现在假设你想要显示本月当天的星期数而不是显示当前的日期和时间,使用VBScript你可以调用另一函数DAY()将DATE函数作为一个参数,象下面所示:
<HTML>
<HEAD>
<TITLE> VBScript Day of Month </TITLE>
</HEAD>
<BODY>
The date of the month is: <%=DAY(DATE)%>
</BODY>
</HTML>
另一方面,使用JScript必须调用Date对象的一个方法,一旦你建立了一个Date对象,你就可以使用对象的getDate()方法来 
获得当天的星期数,下面是个例子:
<%@ LANGUAGE=JScript %>
<HTML>
<HEAD>
<TITLE> VBScript Date </TITLE>
</HEAD>
<BODY>
<%mydate=new Date(); %>
The day of the month is: <%=mydate.getDate()%>
</BODY>
</HTML>
在此例中,Date对象的getDate()方法通过在Date对象mydate后附加方法名(以一个点连接)来调用,正如你所看到的,方法与函数是非常相似的,但是方法是与特定对象相关联的函数。申明变量当使用JScript时,你不需要在赋值前申明一个变量。例如,下面的脚本是正确的:
<%
myvar=“Hello World!”;
%>
<%=myvar%>
在此例中,变量myvar被赋了一个值,并且这个值被显示在浏览器窗口上,文本Hello World!显示出来。
但是下面的脚本是错误的:
<%
myvar2=“Hello World!”+myvar;
%>
<%=myvar2%>
这个脚本的问题在于变量myvar在赋值之前就被使用了,与VBScript不同,JScript变量必须在任何一个表达式、方法或函数中使用前先赋值。如果你愿意,你也可以在赋值前先申明一个变量,你可以使用var表达式来实现这一目的,象下面所示:
<%
var myvar
myvar=“Hello World!”;
%>
<%=myvar%>
在这个脚本中,变量myvar在第一行中被申明,这一步不是必需的。因为这个变量会在紧接着的下一语句中被申明,但是,你可以通过在脚本的头部申明所有用到的变量来使你的脚本可读性强及更好地跟踪变量。你可以用var语句来同时申明和赋值多个变量,下面语言中申明的所有变量都是有效的。
<%
var myvar1,myvar2;
var myvar3=“Hello There!”;
var myvar4=“How are you?”,myvar5,myvar6=“I am fine”;
%>
注意
当申明局部变量时你必须使用ver语句,见后面一书“将脚本分为函数(函数对象)”。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lixp3

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值