通俗基础教程
电脑操作教程
电脑怎样拨号上网
如何做个人网页
怎样做局域网
Word教程(文字处理)
图形图象处理入门
经典提高教程
怎样使用代理服务器
如何做无盘工作站
Photoshop教程
Dreamweaver3教程
Flash4&5教程
Firework3教程
Frontpage2000教程
Authware教程
Office2000教程
如何制作动画图片
OICQ&ICQ使用方法

高手学习指南

硬件升级技巧
CGI教程
ASP教程

PHP教程

注册表使用技巧
路由器的设置
网站建设指南
SQL
最近更新:
Javascript
相关内容

第四课

第一页 JavaScript高级教程 -- 第4天
 
高级的图象与对象

在以前的课中,我们学习了对文本和字符串的各种操作,今天 我们专注于两种不同的数据类型:图象和对象。学完这一课, 你将知道如何:

使用带JavaScript预装图的图象映射来加速图象交换。 创建你自己的对象来使大的scripts易于理解。 使用关联数组来快速存取scripts中的每一个对象。 下面我们从图象映射开始。
第二页 图象映射与JavaScript
一个图象映射由一些区域组成,每个区域对应于一个相关联的超级链接,当你点击那个区域就把你带到那个链接。这里是一个简单的例子,从Patrick的图象映射教程里拿来的(稍 稍有些改动)

虽然这是一个整的图象,但Patrick把它设计成图象的不同部分对应于不同的链接。在网上象这种图象映射到处都是,最常见的是用这种技术做的导航条。 如果你对此还不熟悉,请去看看Patrick的客户端图象映射教程。作为一个快速温习,上面的图象映射的HTML代码是这样的:

<IMG SRC="http://static.wired.com/html/96/39/stuff/my_image.gif" border=0 WIDTH=160 HEIGHT=140 ismap usemap="#foo"> <map name="foo"> <area name="yellow" href="http://www.mattmarg.com/" coords="20,20,70,60"> <area name="red" href="http://www.hits.org/" coords="90,20,140,60"> <area name="blue" href="http://www.hotwired.com/surf/central/" coords="20,80,70,120"> <area name="green" href="http://www.fractalcow.com/bert/bert.htm" coords="90,80,140,120"> </map>
请注意<img src> 标记中有一项叫usemap="#foo". 它告诉图象去找一个名字叫"foo"的map标记用到这幅图象上。map标记可以出现在页面代码的任何地方,但一般来说把它放在图象代码的旁边总是个好主意,就象你这里看到的,这样找到和修改它更容易一些。

map标记有一个开始和结束标志,中间是一系列的area标记,每个area标记用coords元素定义了一个区域并赋予其一个链接。coords元素是一个由几个数组成的字符串,每个数代表图象上某个象素的坐标。如果定义的区域是方型,则四个象素的顺序应该是:左上,右上,左下,右下。

往这种图象映射上增加JavaScript代码与往超文本链接上增加是一样容易的。实际上JavaScript几乎把area标记与超文本链接完全一样看待。所以你也可以把onClicks, onMouseOvers和onMouseOuts等这些事件加到area标记中,而其效果与你希望的完全一样。这里还是上面的那个例子,不过加了一JavaScript语句 :

这个增加了JavaScript语句的图象映射的代码是这样的:

<map name="javascript_foo"> <area name="yellow" href="http://www.mattmarg.com/" onMouseOver="writeInForm('All Hail Mattmarg!');" coords="20,20,70,60"> <area name="red" href="http://www.hits.org/" onMouseOver="writeInForm('Humboldt Institute of Technological Studies');" coords="90,20,140,60"> <area name="blue" href="http://www.hotwired.com/surf/central/" onMouseOver="writeInForm('The good, the bad, and the utterly useless');" coords="20,80,70,120"> <area name="green" href="http://www.fractalcow.com/bert/bert.htm" onMouseOver="writeInForm('Plush antichrist revealed');" coords="90,80,140,120"></map>

它和原来的代码相当类似,唯一的差别就是在每个<area>标记中增加了一个onMouseOver事件处理,调用了一个我写的叫做 writeInForm()的函数, 这个函数是这样的:
<script language="JavaScript"> <!-- hide me function writeInForm(text_to_write) { window.document.the_form.the_text.value= text_to_write; } // show me --> </script>

太简单了是吗? 来个稍复杂点儿的,我们学学怎么用JavaScript来预装入图象。

第三页 预装图象 - 是什么?
使用JavaScript做图象变换的一个主要问题是,它直到需要换图时才去告诉浏览器下载那张图象。如果你有一张大的图象,想在鼠标滑过一副图象时调出来,浏览器得临时下载这张图,这可能会花一定时间从而使滑动效果大打折扣。想知道我在说什么,请把你的鼠标放到下面这张图象上:


如果你的连接速度较慢,而你要调入的是一个相当大的图象的话,那你把鼠标放到图上后只好去等待。由于有的浏览器要求被调入的图象必须保存在缓冲区里,所以有时你可能根本就看不到图象变换的效果。为了避免这些烦心的问题,我们可以把要变换的图象在页面调入时就预先装入。

如果你不想深入了解它是如何工作的,你可以直接到网猴的JavaScript代码库去看看Nadav的可以直接使用的图象预装器。但知其然最好也能知其所以然,所以我建议你继续往下学习如何做图象预装。
第四页 预装图象 - 怎么做?
预装入图象其实并不困难。你要做的就是创建一个新的image对象,然后把要预装的图象名设定成image的src属性,如下所示:
var an_image = new Image(); an_image.src = "my_nice_image.gif";
通过设置image的src属性就可以自动地把图象下载到你的硬盘里(当然假设你的cache可以用),然后图象变换时就从硬盘直接读入图象而不用再去下载了。

试着把鼠标放在下面的几个链接上,图象变换应该相当快捷和令人满意的。


1...
2...
3...

剩下要做的唯一一件事就是,怎样在页面被下载以后和图象变换操作之前使预装图象发生。让人愉快的是这很简单。HTML中的body标记有一个事件处理器叫onLoad,当页面被调入后它将被调用。如果你的body标记是这样的:

<body onLoad="doPreload();">
那么doPreload()函数将在网页下载后被调用。函数的代码是这样的:

function doPreload() { var the_images = new Array('kwmatt.jpg','matbon.jpg','lunchMat.jpg');
preloadImages(the_images); }
function preloadImages(the_images_array) { for(loop = 0;
loop < the_images_array.length; loop++) { var an_image = new Image(); an_image.src = the_images_array[loop]; } }
doPreload()函数创建了需要预装的图象名的数组,并把数组作为参数传送到preloadImages()函数, preloadImages()函数包含了一个循环,每次循环都创建一个新的图象对象,并把图象名设到它的src属性中。
不很难吧?图象对象相当有用对吧?我很高兴你这样想,休息一会儿,马上我们就要进入一个更令人兴奋,更让人动脑筋的话题:创建你自己的对象。
第五页 对象的优点
我们已经看过许多有关JavaScript现成的对象和它们的用法的例子:如Window, Image, Document, Form和其他一些对象。记住:一个对象只不过是一种特殊类型的数据,由属性和方法组成。属性是对象本身的一些东西,而方法则是能够加之于对象上的一些操作。
比如,Window对象有自己的属性,像window.status,它可以被读取与设置。通过把一个字符串设置成Window对象的status属性,这个字符串将会显示在窗口的状态条里。Window也有自己的方法,如window.focus(), 即把窗口聚焦弹到前面。如果你对这些都不熟悉的话,你也许该去看看Jacascript教程之一的课程。

使用对象给我们组织信息提供了一个很好的手段。首先我们看看现实生活中的对象。比如说,一只猴子就是一个对象。它有高度,宽度,毛发等等属性。所有的猴子都有相同的这些属性类型,是属性的值的不同才使一只猴子与其它猴子区别开来。猴子也有自己的方法,如玩儿play(),吃eat(),睡sleep()等。

对象很好理解还因为它能够保持有关词的“感觉”。例如JavaScript中的聚焦方法focus(),很显然就是使什么东西成为焦点。当聚焦方法作用到窗口对象时,它使该窗口弹到前面。而模糊则做相反的事儿。你可以试试:

打开一个小窗口

按下面的链接来看看小窗口如何弹到前面:
little_window.focus()小窗口聚焦;

但当你把聚焦方法作用到一个文本框时,它使该文本框出现一个等待你输入的光标。

激活第一个文本框:
window.document.the_form.the_first_text.focus();
激活第二个文本框:
window.document.the_form.the_second_text.focus();

奇怪吗? JavaScript知道对窗口的聚焦和对文本框的聚焦做的不是一件事。在这两种情况里,聚焦的意思是一样的,所以很自然都用了聚焦这个名字。但同样的聚焦方法对不同的对象会做略微不同的事,这也很好理解。这种同一个方法因对象不同而做不同的事情称为“多态性”,这也是面向对象程序设计的基础。

就象同样的方法因对象不同而表现不同一样,对于不同的对象,同样的属性也可以意味着不同的意思。比如length属性,在字符串和数组两类对象中都有这个属性。string.length返回的是字符串的长度,而array.length返回的则是数组的元素个数。两个的属性都叫length,但它们的意义随对象的不同而略有差别。

使用对象也使得代码的拷贝与粘贴更容易了。如果你有一个很好的对象库,你可以直接把整个对象拷贝下来用在你自己的script中任何需要的地方,如果你没有一个组织得很清晰的对象库要作到这一点就难多了。

既然对象这么好用,JavaScript给你提供了创建自己对象的能力。

第六页 创建你自己的对象
对象的概念使你能够以一种更易理解的方式去组织你的信息。让我们从创建一个雇员数据库的简单例子开始,然后利用我们课程里学到的东西去实现一个比这复杂得多的,和我们的生活有关的事:编写一个JavaScript虚拟宠物。
为了这个练习,让我们先不管如何把现代资本主义社会工人进行对象化的方方面面,我们把每一个雇员当作一个具有属性与方法的对象。每一个雇员有一个名字,职务,薪水,生日,地址等属性。雇员可以被提升,去休假,换部门或者去下厨等。对象包括了所有这些信息,而雇员对象就象是一个模板。每个雇员都有这些属性如姓名,职务等,是属性值的不同使得不同的雇员得以区分开来。

要创建你自己的对象,你需要从模板开始。在面向对象编程中模板也称为对象的构造器。一旦你建立了模板,你就可以创建对象的实例,就象这样:

var fred = new Employee("Fred Flintstone", 33, "Surface Miner", 20000); var barney = new Employee("Barney Rubble", 33, "Slacker", 40000); var boss = new Employee("Mr. Slate",50, "CEO", 1000000);
如果这几个实例已被创建,你可以做这些事情:

barney.promotion("Chief Slacker","10"); fred.fired(); boss.vacation(365);
这样就把Barney提升为‘首席懒鬼’并增加10%的薪水,炒掉Fred,让首席执行官休上一年的假。

当然你得自己从属性开始编写对象构造器和方法,这里是雇员的构造器:

function Employee(name, age, title, salary) { this.name = name; this.age = age; this.title = title; this.salary = salary; }
请注意构造器其实就是一个函数。在函数中我们需要给this.property_name赋值,我们不直接给age赋值,而是给this.age赋值,对姓名,职务等也一样。

你可以给构造函数传递参数 ,当象下面这个语句这样调用构造函数时:

var barney = new Employee("Barney Rubble", 33, "Slacker", 40000);

... 然后在构造函数中的这条语句:

this.name = name;
... 我们就把这个雇员的名字设成了传递给雇员构造函数的参数的值。

构造函数中使用的"this" 关键字的原因是你可能一次创建多个雇员实例。 为了让方法和构造函数正确工作,必须 清楚地告诉它们到底是在对哪个雇员进行操作。这里的"this"所指的是 is: 你正在创建的实例。下面我们讲讲方法的例子或许能让你理解得更好。

方法只不过是加在对象上的函数。首先定义函数,然后把函数加载到对象上(在对象的构造函数中)我们以promotion()方法为例:

function promotion(new_title,percent_raise) { var salary_increase = this.salary * percent_raise; this.salary = this.salary + salary_increase; this.title = new_title; }
这个函数计算雇员的新工资并把新工资和新职位赋给雇员。JavaScript通过使用"this"关键字知道你说的是哪个雇员,所以如果有这个语句:

barney.promotion("Chief Slacker",10);
那 "this"就是指 is Barney. 这看起来确实有一点怪异,可能要一段时间去适应它,但是一旦你开始以对象的眼光去思考,你马上就能养成习惯了。

创建对象的最后一步就是把方法连到对象上。我刚才提到了,你要在构造函数中做这个。你写完提升方法后,如果要把它连到雇员对象上,就在构造函数里加上:

this.promotion = promotion;
下面是增加了提升方法的构造函数:

function Employee(name, age, title, salary) { this.name = name; this.age = age; this.title = title; this.salary = salary; this.promotion = promotion; } function promotion(new_title,percent_raise) { var salary_increase = this.salary * percent_raise; this.salary = this.salary + salary_increase; this.title = new_title; }
如要增加其它信息,比如雇员的办公室,可以增加一个名为"office"的属性。然后如果你想记录雇员换办公室的情况,你就创建一个transfer()方法.

明白了吗? 现在来看看更复杂和重要的面向对象的JavaScript, 去创建一个虚拟宠物。
第七页 你的面向对象的虚拟宠物
你现在骄傲地拥有了不是一只而是两只虚拟宠物。你的责任就是让它们保持健康。如果它们的健康值低于零,它们就会死掉。按start 钮可以赋予它们生命.

---------------------------------------------------------------

Name:
Status:

Name:
Status:

-----------------------------------------------------------------
也许你能猜到,我并不是个称职的宠物饲养员,我的可怜的宠物每次还没养大就死掉了。
虽然如此,这整个都是用对象编出来的。每个宠物都是宠物对象的一个实例。每个宠物具有以下属性:

health健康
happiness快乐
hunger饥饿
age年龄
pet_name宠物的名字
form_number -表单号--宠物所在的HTML表单号。
下列方法能够影响这些属性:

play() - 增加快乐
feed() - 减少饥饿
medicate() - 增加一点健康
makeOlder() - 宠物长大
display() - 在状态框里显示宠物的信息。
把这些记在脑子里,我们来创建宠物对象。首先我们来写一个构造函数。 这里就是最基本的构造函数(即还没有加任何方法的代码):


function Pet(the_pet_name, the_form_number) { this.age = 0; this.hunger = Math.random() * 5; // random number between 0 and 4.99 this.health = Math.random() * 5 + 1 ; // random number between 1 and 3.99 this.happiness = Math.random() * 5; this.pet_name = the_pet_name; this.form_number = the_form_number; window.document.forms[the_form_number].pet_name.value = the_pet_name; }

这个构造函数有两个参数:宠物名字和要显示其信息的表单号。要创建两个宠物,我们这么做:
var pet1 = new Pet("barney",0); var pet2 = new Pet("betty",1);
我们把构造函数写的能使每个宠物都不一样。用了 Math.random()方法来产生一个0到1之间的随机数, Math.random()方法并不是完全随机的,但在这里够用了,它能保证给每个产生的宠物一个不同的饥饿,健康和快乐的初始值。宠物的名字从参数传递过来,年龄则设为0。 最后两行设定了宠物使用的表单号,并把宠物的名字写到相应的文本框去。记住:一个页面的第一个表单可以被索引为window.document.forms[0],第二个可以索引为window.document.forms[1],依次类推。

我们已建立好了属性,现在来看看方法。我并不打算把每个方法都展开讲,而只把其中几个讲一讲:

function feed() { var meal_quality = Math.random() * 2; this.hunger = this.hunger - meal_quality; if (this.hunger <0) { this.hunger = 0; } this.display(); }

这是一个喂宠物的方法。如果你调用了 pet1.feed()方法,首先它会产生一个0到2之间的数,然后把饥饿度减去这个数。我们确使饥饿度不小于0,然后调用显示方法去显示信息。
显示方法的代码如下:

function display() { var the_string = ""; if (this.health < min_health) { the_string = this.pet_name + " IS DEAD!"; } else { the_string += "Happiness " + parseInt(this.happiness); the_string += ". Health: " + parseInt(this.health); the_string += ". Hunger: " + parseInt(this.hunger); the_string += ". Age: " + parseInt(this.age); the_string += "."; } window.document.forms[this.form_number].pet_status.value = the_string; }

This这个方法建立了一个字符串并把它显示到正确的文本框里,表单号属性保证了状态信息放到合适的文本框。每当我们创建一个宠物,我们就给它一个表单号 - 第一个宠物的表单号是0,第二个宠物的表单号是1。使用这种表单号我们知道第一个宠物的状态应放在 window.document.forms[0].pet_status.value,而第二个宠物的状态应放在window.document.forms[1].pet_status.value. 这个方法里的最后一行根据this.form_number决定在哪个form放状态信息.
这个方法里的另一个有趣的地方是 parseInt函数. 由于使用了随机数,象健康和快乐的值可能是 2.738993720. 它们是实数,但是显得有点长,所以parseInt函数把小数点后的数给拿掉了,比如 parseInt(2.738)得到的结果是2。

第三个有趣的方法是makeOlder().它把宠物年龄增加一岁并让宠物更饿一点和更不高兴一点。这个方法通过setTimeout设成每秒被调用一次(我们在第三天的课里曾讲过怎么做的):

function makeOlder() { var max_hunger = 5; var good_happiness = 5; if (this.health > min_health) { this.age +=1; this.happiness -= Math.random() * 2; this.hunger += Math.random() * 2; if (this.hunger > max_hunger) { this.health -= Math.random() * 2; this.happiness -= Math.random() * 2; } } this.display(); }
你能看到,这个方法把宠物的年龄增加一岁,把快乐值降低了一个随机数,把饥饿度增加了一个随机数。然后又设定了一些规则(这儿只示意了一个),如“如果宠物真的饿极了,就让它不快乐一点和不健康一点。
既然我们已经有了这些方法,就把它放进到构造函数里去完成整个的虚拟宠物对象的创建:

function Pet(the_pet_name, the_form_number) { this.age = 0; this.hunger = Math.random() * 5; // random number between 0 and 4.99 this.health = Math.random() * 3 +1 ; // random number between 1 and 3.99 this.happiness = Math.random() * 5; this.pet_name = the_pet_name; this.form_number = the_form_number; this.feed = feed; this.play = play; this.medicate = medicate; this.display = display; this.makeOlder = makeOlder; window.document.forms[the_form_number].pet_name.value = the_pet_name; this.display(); }

最后设定让makeOlder()方法每三秒种就调用一次。这个函数 在你按动start按钮时被调用。

function moveTime() { pet1.makeOlder(); pet2.makeOlder();
the_time_out = setTimeout("moveTime();", 3000); }

你可以看到这个函数调用了每个宠物的makeOlder()方法,并在三秒种后又调用了它自己。这个定时事件将一直持续下去直到用户通过clearTimeout(the_time_out)把它取消掉.
这个例子几乎用到了我们今天讲到的所有内容。如果你理解了,你对JavaScript已经了解的很深入了。在我们进入最后一个话题之前再休息一下,最后要讲的是:利用JavaScript的快捷方式获取很难索引的对象。

第八页 计算字符串
JavaScript有许多小窍门来使编程更加容易。其中之一就是 eval()函数,这个函数可以把一个字符串当作一个JavaScript 表达式一样去执行它。实际上我在JavaScript教程之一里曾讲过 一点有关eval函数,这里举个小例子重温一下:

var the_unevaled_answer = "2 + 3";
var the_evaled_answer = eval("2 + 3");
alert("the un-evaled answer is " + the_unevaled_answer + " and the evaled answer is " + the_evaled_answer);

如果你运行这段eval程序, 你将会看到在JavaScript里字 符串"2 + 3"实际上被执行了。所以当你把the_evaled_answer的值设成eval("2 + 3")时, JavaScript将会明白并把2和3的和返回给the_evaled_answer。
这个看起来似乎有点傻,其实可以做出很有趣的事。比如使用eval你可以根据用户的输入直接创建函数。这可以使程序根据时间或用户输入的不同而使程序本身发生变化,通过举一反三,你可以获得惊人的效果。在实际中,eval很少被用到,但也许你见过有人使用eval来获取难以索引的对象。
第九页 获取难以索引的对象
文档对象模型(DOM)的问题之一是:有时你要获取你要求的对象简直就是痛苦。例如,这里有一个函数询问用户要变换哪个图象:变换哪个图象

你可以用下面这个函数:

function swapOne() { var the_image = prompt("change parrot or cheese",""); var the_image_object; if (the_image == "parrot") { the_image_object = window.document.parrot; } else { the_image_object = window.document.cheese; } the_image_object.src = "ant.gif"; } 连同这些image标记: <img src="stuff3a/parrot.gif" name="parrot"> <img src="stuff3a/cheese.gif" name="cheese">
请注意象这样的几行语句:
the_image_object = window.document.parrot;

它把一个鹦鹉图象对象敷给了一个变量。虽然看起来有点 儿奇怪,它在语法上却毫无问题。但当你有100个而不是两个 图象时怎么办?你只好写上一大堆的if-then-else语句,要是 能象这样就好了:

function swapTwo() { var the_image = prompt("change parrot or cheese","");window.document.the_image.src = "ant.gif"; }

不幸的是, JavaScript将会寻找名字叫the_image而不是你所希 望的"cheese"或者"parrot"的图象,于是你得到了错误信息:” 没听说过一个名为the_image的对象”。

还好,eval能够帮你得到你想要的对象。

function simpleSwap() { var the_image = prompt("change parrot or cheese",""); var the_image_name = "window.document." + the_image; var the_image_object = eval(the_image_name); the_image_object.src = "ant.gif"; }

如果用户在提示框里填入"parrot",在第二行里创建了一个字符串即window.document.parrot. 然后包含了eval的第三行意思是:"给我对象window.document.parrot" - 也就是你要的那个图象对象。一旦你获取了这个图象对象,你可以把它的src属性设为ant.gif. 有点害怕?用不着。其实这相当有用,人们也经常使用它。如果你不喜欢eval(), 有另一种获取难以索引的对象的途径。
第十页 另一种获取难以索引的对象的手段
这就是我们迄今为止学到的获取图象对象的手段:
function simpleSwap() { var the_image = prompt("change parrot or cheese","");
var the_image_name = "window.document." + the_image; var the_image_object = eval(the_image_name);
the_image_object.src = "ant.gif"; }

从这里延伸一下,你也可以通过图象的名字在图象关联数组 中引用图象,比如:window.document.images ["parrot"].src.

这就象通过数组的下标引用图象一样,如 window.document.images[0].src. 所以,上面的代码可 以重新写成:
function simpleSwap() { var the_image = prompt("change parrot or cheese",""); window.document.images[the_image].src = "ant.gif"; }

你可以用这种技巧获得你的各种对象。如果在一个表单里有一个文本框,象这样:

<form name="the_form"> <input type="text" name="the_text_box"> </form>
你可以用这个来改变文本框里的文本:

window.document.forms["the_form"].elements["the_text_box"].value="hello!";

现在你已经知道了好几种获取和改变对象信息的途径了。在上面的例子里,我们可以用四种手段来设置文本框的文本:

var the_form_name = "the_form"; var the_element_name = "the_text_box";
window.document.forms[0].elements[0].value = "hello!";
window.document.forms[the_form_name].elements[the_element_name].value = "hello!";
window.document.the_form.the_text_box.value = "hello!";
var the_element_string = "window.document." + the_form_name + "." + the_element_name; var the_element = eval(the_element_string); the_element_string.value = "hello!";
具体到你用哪个方法也许取决于你的心情以及你能想起来用那一个。

这就是我们今天的课程,我们来复习一下。
第十一页 第四天课程复习

今天的课程涉及到许多话题,广泛而深入。我们开始先对客户端图象映射做了简单的介绍,又学习了如何象与链接一样往图象区域加入 JavaScript代码。
那以后我们学习了如何巧妙地利用图象对象来预装图象。创建一个图象对象并且把一个图象设成那个对象的src属性,这将自动地把这个图象调到你的缓冲区里。

因为图象和其它对象是如此重要,我们花了相当大的篇幅研究了有关对象和面向对象编程的问题,结束时我们创建了一个虚拟宠物对象,它拥有自己的属性和方法。

最后,我们学习了如何利用eval()函数和关联数组对其他手段难以获取的对象进行操作。

面向对象程序设计是一个新鲜有趣的思想,通过理解它的道理,你为成为下一个千年到来后成功的程序员迈出了一大步。

当要结束今天的课程时,我们的JavaScript也学完了。我们广泛又深入地学习了这门语言的各个方面。当然还有一些事情,比如说一些基本的调试与优化技术,掌握这些技术能够使你编写出更大更复杂的程序,所以说非常有用。但基本上已经可以说你是一个JavaScript的专家了!

在你进入明天的课程之前,到这儿来做做家庭作业测试一下你的掌握程度。

第一讲 JavaScript语言概况
第二讲 JavaScript基本数据结构
第三讲 JavaScript程序构成
第四讲 基于对象的JavaScript语言
第五讲 创建新对象
第六讲 使用内部对象系统
第七讲 窗口及输入输出
第八讲 WEB页面信息的交互
第九讲 实现更复杂的交互
第一课 Javascript高级教程
第二课 Javascript高级教程
第三课 Javascript高级教程
第四课 Javascript高级教程
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
上一页
下一页
教程站
收集整理
服务大家