分享
 
 
 

JavaScript高级教程- 第4天

王朝asp·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

第一页:JavaScript高级教程- 第4天

高级的图象与对象

在以前的课中,我们学习了对文本和字符串的各种操作,今天

我们专注于两种不同的数据类型:图象和对象。学完这一课,

你将知道如何:

使用带JavaScript预装图的图象映射来加速图象交换。

创建你自己的对象来使大的scripts易于理解。

使用关联数组来快速存取scripts中的每一个对象。

下面我们从图象映射开始。

第二页:图象映射与JavaScript

一个图象映射由一些区域组成,每个区域对应于一个相关联的超级链接,当你点击那个区域就把你带到那个链接。这里是一个简单的例子,从Patrick的图象映射教程里拿来的(稍稍有些改动)

[url=http://www.hits.org/][url=http://www.hotwired.com/surf/central/][url=http://www.fractalcow.com/bert/bert.htm]

虽然这是一个整的图象,但Patrick把它设计成图象的不同部分对应于不同的链接。在网上象这种图象映射到处都是,最常见的是用这种技术做的导航条。 如果你对此还不熟悉,请去看看Patrick的客户端图象映射[url=http://www.hotwired.com/webmonkey/html/96/40/index2a.html?tw=html]教程。作为一个快速温习,上面的图象映射的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语句 :

[url=http://www.hits.org/][url=http://www.hotwired.com/surf/central/][url=http://www.fractalcow.com/bert/bert.htm]

这个增加了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(), 即把窗口聚焦弹到前面。如果你对这些都不熟悉的话,你也许该去看看基础教程第五天的课程。

使用对象给我们组织信息提供了一个很好的手段。首先我们看看现实生活中的对象。比如说,一只猴子就是一个对象。它有高度,宽度,毛发等等属性。所有的猴子都有相同的这些属性类型,是属性的值的不同才使一只猴子与其它猴子区别开来。猴子也有自己的方法,如玩儿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表达式一样去执行它。实际上我在基础教程第五日里曾讲过一点有关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的专家了!

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

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有