Fork me on GitHub

JavaScript进阶篇


数组

创建数组语法:

1
var myarray=new Array();

我们创建数组的同时,还可以为数组指定长度,长度可任意指定。

1
var myarray= new Array(8); //创建数组,存储8个数据。

注意:
1.创建的新数组是空数组,没有值,如输出,则显示undefined。
2.虽然创建数组时,指定了长度,但实际上数组都是变长的,也就是说即使指定了长度为8,仍然可以将元素存储在规定长度以外。

下面创建一个数组,用于存储5个人的数学成绩。

1
2
3
4
5
6
var myarray=new Array(); //创建一个新的空数组
myarray[0]=66; //存储第1个人的成绩
myarray[1]=80; //存储第2个人的成绩
myarray[2]=90; //存储第3个人的成绩
myarray[3]=77; //存储第4个人的成绩
myarray[4]=59; //存储第5个人的成绩

注意:数组每个值有一个索引号,从0开始。

我们还可以用简单的方法创建上面的数组和赋值:

第一种方法:

1
var myarray = new Array(66,80,90,77,59);//创建数组同时赋值

第二种方法:

1
var myarray = [66,80,90,77,59];//直接输入一个数组(称 “字面量数组”)

注意:数组存储的数据可以是任何类型(数字、字符、布尔值等)

如果我们想知道数组的大小,只需引用数组的一个属性length。Length属性表示数组的长度,即数组中元素的个数。

语法:

1
myarray.length; //获得数组myarray的长度

注意:因为数组的索引总是由0开始,所以一个数组的上下限分别是:0和length-1。如数组的长度是5,数组的上下限分别是0和4。

1
2
3
var arr=[55,32,5,90,60,98,76,54];//包含8个数值的数组arr
document.write(arr.length); //显示数组长度8
document.write(arr[7]); //显示第8个元素的值54

同时,JavaScript数组的length属性是可变的,这一点需要特别注意。

1
2
arr.length=10; //增大数组的长度
document.write(arr.length); //数组长度已经变为10

数组随元素的增加,长度也会改变,如下:

1
2
3
4
var arr=[98,76,54,56,76]; // 包含5个数值的数组
document.write(arr.length); //显示数组的长度5
arr[15]=34; //增加元素,使用索引为15,赋值为34
alert(arr.length); //显示数组的长度16

1.二维数组的定义方法一

1
2
3
4
5
6
7
var myarr=new Array();  //先声明一维
for(var i=0;i<2;i++){ //一维长度为2
myarr[i]=new Array(); //再声明二维
for(var j=0;j<3;j++){ //二维长度为3
myarr[i][j]=i+j; // 赋值,每个数组元素的值为i+j
}
}

2.二维数组的定义方法二

1
var Myarr = [[0 , 1 , 2 ],[1 , 2 , 3]]

3.赋值

1
myarr[0][1]=5; //将5的值传入到数组中,覆盖原有值。

说明: myarr[0][1] ,0 表示表的行,1表示表的列。

判断

switch语法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
switch(表达式)
{
case值1:
执行代码块 1
break;
case值2:
执行代码块 2
break;
...
case值n:
执行代码块 n
break;
default:
与 case值1 、 case值2...case值n 不同时执行的代码
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Switch</title>
<script type="text/javascript">
var myscore = 6;
switch(myscore)
{
case 0:
case 1:
case 2:
case 3:
case 4:
case 5:
degree = "继续努力!";
document.write("评语:"+degree+"<br>");
break;
case 6:
degree = "及格,加油!";
document.write("评语:"+degree+"<br>");
break;
case 7:
degree = "凑合,奋进!";
document.write("评语:"+degree+"<br>");
break;
case 8:
degree = "很棒,很棒!";
document.write("评语:"+degree+"<br>");
break;
case 9:
case 10:
degree = "高手,大牛!";
document.write("评语:"+degree+"<br>");
break;
}
</script>
</head>
<body>

</body>
</html>

for语句结构:

1
2
3
4
for(初始化变量;循环条件;循环迭代)
{
循环语句
}

假如,一个盒子里有6个球,我们每次取一个,重复从盒中取出球,直到球取完为止。

1
2
3
4
5
6
<script type="text/javascript">
var num=1;
for (num=1;num<=6;num++) //初始化值;循环条件;循环后条件值更新
{ document.write("取出第"+num+"个球<br />");
}
</script>

####while循环
完成从盒子里取球的动作,每次取一个,共6个球。

1
2
3
4
5
6
7
8
<script type="text/javascript">
var num=0; //初始化值
while (num<=6) //条件判断
{
document.write("取出第"+num+"个球<br />");
num=num+1; //条件值更新
}
</script>

do-while

我们试着输出5个数字。

1
2
3
4
5
6
7
8
9
<script type="text/javascript">
num= 1;
do
{
document.write("数值为:" + num+"<br />");
num++; //更新条件
}
while (num<=5)
</script>

break

格式如下:

1
2
3
4
5
6
for(初始条件;判断条件;循环后条件值更新)
{
if(特殊情况)
{break;}
循环代码
}

continue

1
2
3
4
5
6
for(初始条件;判断条件;循环后条件值更新)
{
if(特殊情况)
{ continue; }
循环代码
}

函数

有参数的函数

1
2
3
4
5
function add2(x,y)
{
sum = x + y;
document.write(sum);
}

返回值的函数

1
2
3
4
5
function add2(x,y)
{
sum = x + y;
return sum; //返回函数值,return后面的值叫做返回值。
}

还可以通过变量存储调用函数的返回值,代码如下:

1
result = add2(3,4);//语句执行后,result变量中的值为7。

注意:函数中参数和返回值不只是数字,还可以是字符串等其它类型。

事件

鼠标单击事件( onclick )

比如,我们单击按钮时,触发 onclick 事件,并调用两个数和的函数add2()。代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<html>
<head>
<script type="text/javascript">
function add2(){
var numa,numb,sum;
numa=6;
numb=8;
sum=numa+numb;
document.write("两数和为:"+sum); }
</script>
</head>
<body>
<form>
<input name="button" type="button" value="点击提交" onclick="add2()" />
</form>
</body>
</html>

#### 鼠标经过事件(onmouseover)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<!DOCTYPE html>
<html>
<head>
<title>onmouseover</title>
<script type="text/javascript">
function info(){
confirm("请输入姓名后,在单击确定!");
}
</script>
</head>
<body>
<form>
密码:<input type="text" name="password">
<input type="button" name="button" value="确定" onmouseover="info()">
</form>
</body>
</html>

鼠标移开事件(onmouseout)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<!DOCTYPE html>
<html>
<head>
<title>onmouseout</title>
<script type="text/javascript">
function message(){
confirm("不要离开,只要输入密码,再单击登录,就ok了");
}
</script>
</head>
<body>
<form>
密码:<input type="text" name="password">
<input type="button" name="button" value="登录" onmouseout="message()">
</form>
</body>
</html>

光标聚焦事件(onfocus)

当网页中的对象获得聚点时,执行onfocus调用的程序就会被执行。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<!DOCTYPE html>
<html>
<head>
<title>onfocus</title>
<script type="text/javascript">
function message(){
alert("请输入姓名!");
}
</script>
</head>
<body>
<form>
姓名:<input type="text" name="username" value="请输入姓名!" onfocus="message()">
</form>
</body>
</html>

失焦事件(onblur)

onblur事件与onfocus是相对事件,当光标离开当前获得聚焦对象的时候,触发onblur事件,同时执行被调用的程序。

如下代码, 网页中有用户和密码两个文本框。当前光标在用户文本框内时(即焦点在文本框),在光标离开该文本框后(即失焦时),触发onblur事件,并调用函数message()。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<!DOCTYPE html>
<html>
<head>
<title>onblur失焦事件</title>
<script type="text/javascript">
function message(){
alert("请确定已输入用户名后,在离开!");
}
</script>
</head>
<body>
<form>
用户:<input type="text" name="username" value="请输入用户名!" onblur="message()">
密码:<input type="password" name="password" value="请输入密码!">
</form>
</body>
</html>

内容选中事件(onselect)

选中事件,当文本框或者文本域中的文字被选中时,触发onselect事件,同时调用的程序就会被执行。

如下代码,当选中用户文本框内的文字时,触发onselect 事件,并调用函数message()。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<!DOCTYPE html>
<html>
<head>
<title>onselect</title>
<script type="text/javascript">
function message(){
alert("您触发了选中事件!");
}
</script>
</head>
<body>
<form>
用户:<input type="text" name="username" value="请输入用户名" onselect="message()">
</form>
</body>
</html>

文本框内容改变事件(onchange)

通过改变文本框的内容来触发onchange事件,同时执行被调用的程序。

如下代码,当用户将文本框内的文字改变后,弹出对话框“您改变了文本内容!”。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<!DOCTYPE html>
<html>
<head>
<title>onchange</title>
<script type="text/javascript">
function message(){
alert("您改变了文本内容!");
}
</script>
</head>
<body>
<form>
用户:<input type="text" name="username" value="请输入用户名!" onchange="message()">
</form>
</body>
</html>

加载事件(onload)

事件会在页面加载完成后,立即发生,同时执行被调用的程序。
注意:

1.加载页面时,触发onload事件,事件写在`<body>`标签内。
2.此节的加载页面,可理解为打开一个新页面时。

如下代码,当加载一个新页面时,弹出对话框“加载中,请稍等…”。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<!DOCTYPE html>
<html>
<head>
<title>onload</title>
<script type="text/javascript">
function message(){
alert("加载中,请稍等。。。");
}
</script>
</head>
<body onload="message()">
欢迎学习JavaScript.
</body>
</html>

卸载事件(onunload)

当用户退出页面时(页面关闭、页面刷新等),触发onUnload事件,同时执行被调用的程序。

注意:不同浏览器对onunload事件支持不同。

如下代码,当退出页面时,弹出对话框“您确定离开该网页吗?”。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<!DOCTYPE html>
<html>
<head>
<title>onunload</title>
<script type="text/javascript">
window.onunload = onunload_message();
function onunload_message(){
alert("您确定离开该网页吗?");
}
</script>
</head>
<body>
欢迎学习JavaScript.
</body>
</html>

卸载事件

对象

什么是对象

JavaScript 中的所有事物都是对象,如:字符串、数值、数组、函数等,每个对象带有属性和方法。

对象的属性:反映该对象某些特定的性质的,如:字符串的长度、图像的长宽等;

对象的方法:能够在对象上执行的动作。例如,表单的“提交”(Submit),时间的“获取”(getYear)等;

JavaScript 提供多个内建对象,比如 String、Date、Array 等等,使用对象前先定义,如下使用数组对象:

1
var objectName =new Array();//使用new关键字定义对象

或者

1
var objectName =[];

访问对象属性的语法:

1
objectName.propertyName

如使用 Array 对象的 length 属性来获得数组的长度:

1
2
var myarray=new Array(6);//定义数组对象
var myl=myarray.length;//访问数组长度length属性

以上代码执行后,myl的值将是:6

访问对象的方法:

1
objectName.methodName()

如使用string 对象的 toUpperCase() 方法来将文本转换为大写:

1
2
var mystr="Hello world!";//创建一个字符串
var request=mystr.toUpperCase(); //使用字符串对象方法

以上代码执行后,request的值是:HELLO WORLD!

Date 日期对象

日期对象可以储存任意一个日期,并且可以精确到毫秒数(1/1000 秒)。

定义一个时间对象 :

1
var Udate=new Date();

注意:使用关键字new,Date()的首字母必须大写。

使 Udate 成为日期对象,并且已有初始值:当前时间(当前电脑系统时间)。

如果要自定义初始值,可以用以下方法:

1
2
var d = new Date(2012, 10, 1);  //2012年10月1日
var d = new Date('Oct 1, 2012'); //2012年10月1日

我们最好使用下面介绍的“方法”来严格定义时间。

访问方法语法:“<日期对象>.<方法>”

Date对象中处理时间和日期的常用方法:

这里写图片描述

返回/设置年份方法
get/setFullYear() 返回/设置年份,用四位数表示。

1
2
3
4
5
var mydate=new Date();//当前时间2014年3月6日
document.write(mydate+"<br>");//输出当前时间
document.write(mydate.getFullYear()+"<br>");//输出当前年份
mydate.setFullYear(81); //设置年份
document.write(mydate+"<br>"); //输出年份被设定为 0081年。

注意:不同浏览器, mydate.setFullYear(81)结果不同,年份被设定为 0081或81两种情况。

返回星期方法
getDay() 返回星期,返回的是0-6的数字,0 表示星期天。如果要返回相对应“星期”,通过数组完成,代码如下:

1
2
3
4
5
6
7
8
<script type="text/javascript">
var mydate=new Date();//定义日期对象
var weekday=["星期日","星期一","星期二","星期三","星期四","星期五","星期六"];
//定义数组对象,给每个数组项赋值
var mynum=mydate.getDay();//返回值存储在变量mynum中
document.write(mydate.getDay());//输出getDay()获取值
document.write("今天是:"+ weekday[mynum]);//输出星期几
</script>

返回/设置时间方法
get/setTime() 返回/设置时间,单位毫秒数,计算从 1970 年 1 月 1 日零时到日期对象所指的日期的毫秒数。

如果将目前日期对象的时间推迟1小时,代码如下:

1
2
3
4
5
6
<script type="text/javascript">
var mydate=new Date();
document.write("当前时间:"+mydate+"<br>");
mydate.setTime(mydate.getTime() + 60 * 60 * 1000);
document.write("推迟一小时时间:" + mydate);
</script>

结果:

当前时间:Thu Mar 6 11:46:27 UTC+0800 2014

推迟一小时时间:Thu Mar 6 12:46:27 UTC+0800 2014

注意:

  1. 一小时 60 分,一分 60 秒,一秒 1000 毫秒
  2. 时间推迟 1 小时,就是: “x.setTime(x.getTime() + 60 60 1000);”

String 字符串对象

方法名 功能
charAt() 返回指定位置的字符
indexOf() 返回指定字符首次出现的位置
split() 字符串分割
substring() 提取字符串
substr() 提取指定数目的字符串
1.访问字符串对象的属性length:
1
2
var mystr="Hello World!";
var myl=mystr.length;

以上代码执行后,myl 的值将是:12

2.访问字符串对象的方法:

使用 String 对象的 toUpperCase() 方法来将字符串小写字母转换为大写:

1
2
var mystr="Hello world!";
var mynum=mystr.toUpperCase();

以上代码执行后,mynum 的值是:HELLO WORLD!

返回指定位置的字符charAt

charAt() 方法可返回指定位置的字符。返回的字符是长度为 1 的字符串。

语法:

1
stringObject.charAt(index)

参数说明:

注意:1.字符串中第一个字符的下标是 0。最后一个字符的下标为字符串长度减一(string.length-1)。

2.如果参数 index 不在 0 与 string.length-1 之间,该方法将返回一个空字符串。

如:在字符串 “I love JavaScript!” 中,返回位置2的字符:

1
2
3
4
<script type="text/javascript">
var mystr="I love JavaScript!"
document.write(mystr.charAt(2));
</script>

注意:一个空格也算一个字符。

返回指定的字符串首次出现的位置(indexOf)

indexOf() 方法可返回某个指定的字符串值在字符串中首次出现的位置。

语法

1
stringObject.indexOf(substring, startpos)

参数说明:

说明:

1.该方法将从头到尾地检索字符串 stringObject,看它是否含有子串 substring。

2.可选参数,从stringObject的startpos位置开始查找substring,如果没有此参数将从stringObject的开始位置查找。

3.如果找到一个 substring,则返回 substring 的第一次出现的位置。stringObject 中的字符位置是从 0 开始的。

注意:

  1. indexOf() 方法区分大小写。
  2. 如果要检索的字符串值没有出现,则该方法返回 -1。

例如: 对 “I love JavaScript!” 字符串内进行不同的检索:

1
2
3
4
5
6
<script type="text/javascript">
var str="I love JavaScript!"
document.write(str.indexOf("I") + "<br />");
document.write(str.indexOf("v") + "<br />");
document.write(str.indexOf("v",8));
</script>

以上代码的输出:

1
2
3
0
4
9

字符串分割split()

知识讲解:

split() 方法将字符串分割为字符串数组,并返回此数组。

语法:

1
stringObject.split(separator,limit)

参数说明:
这里写图片描述

注意:如果把空字符串 (“”) 用作 separator,那么 stringObject 中的每个字符之间都会被分割。

我们将按照不同的方式来分割字符串:

使用指定符号分割字符串,代码如下:

1
2
3
var mystr = "www.imooc.com";
document.write(mystr.split(".")+"<br>");
document.write(mystr.split(".", 2)+"<br>");

运行结果:

1
2
www,imooc,com
www,imooc

将字符串分割为字符,代码如下:

1
2
document.write(mystr.split("")+"<br>");
document.write(mystr.split("", 5));

运行结果:

1
2
w,w,w,.,i,m,o,o,c,.,c,o,m
w,w,w,.,i

提取字符串substring()

substring用于提取字符串中介于两个指定下标之间的字符

语法:

1
stringObject.substring(startPos,stopPos)

参数说明

参数 描述
startPos 必需。一个非负的整数,开始位置
stopPos 可选。一个非负的整数,结束位置,如果省略该参数,那么返回的子串会一直到字符串对象的结尾。

注意:

  1. 返回的内容是从 start开始(包含start位置的字符)到 stop-1 处的所有字符,其长度为 stop 减start。

  2. 如果参数 start 与 stop 相等,那么该方法返回的就是一个空串(即长度为 0 的字符串)。

  3. 如果 start 比 stop 大,那么该方法在提取子串之前会先交换这两个参数。

使用 substring() 从字符串中提取字符串,代码如下:

1
2
3
4
5
<script type="text/javascript">
var mystr="I love JavaScript";
document.write(mystr.substring(7));
document.write(mystr.substring(2,6));
</script>

运行结果:

1
2
JavaScript
love

提取指定数目的字符substr()

substr() 方法从字符串中提取从 startPos位置开始的指定数目的字符串。

语法:

1
stringObject.substr(startPos,length)

参数说明:
这里写图片描述

注意:如果参数startPos是负数,从字符串的尾部开始算起的位置。也就是说,-1 指字符串中最后一个字符,-2
指倒数第二个字符,以此类推。

如果startPos为负数且绝对值大于字符串长度,startPos为0。

使用 substr() 从字符串中提取一些字符,代码如下:

1
2
3
4
5
<script type="text/javascript">
var mystr="I love JavaScript!";
document.write(mystr.substr(7));
document.write(mystr.substr(2,4));
</script>

运行结果:

1
2
JavaScript!
love

Math对象

Math对象,提供对数据的数学计算。

使用 Math 的属性和方法,代码如下:

1
2
3
4
5
6
<script type="text/javascript">
var mypi=Math.PI;
var myabs=Math.abs(-15);
document.write(mypi);
document.write(myabs);
</script>

运行结果:

1
2
3.141592653589793
15

注意:Math 对象是一个固有的对象,无需创建它,直接把 Math
作为对象使用就可以调用其所有属性和方法。这是它与Date,String对象的区别。

Math 对象属性

属性 说明
E 返回算数常量e,即自然对数的底数(约等于2.718…)
LN2 返回2的自然对数(约等于0.693)
LN10 返回10的自然对数(约等于2.302)|
LOG2E 返回以2为底的e的对数(约等于1.442)
LOG10E 返回以10为底的e的对数(约等于0.434)
PI 返回圆周率 (约等于3.14159)
SQRT1_2 返回2的平方根的倒数(约等于0.707)
SQRT2 返回2的平方根(约等于1.414)|

Math 对象方法

方法 描述
abs(x) 返回数的绝对值
acos(x) 返回数的反余弦值
asin(x) 返回数的反正弦值
atan(x) 返回数的反正切值
atan2(y,x) 返回由x轴到点(x,y)的角度(以弧度为单位)
ceil(x) 对数进行上舍入
cos(x) 返回数的余弦
exp(x) 返回e的指数
floor(x) 对数进行下舍入
log(x) 返回数的自然对数(底为e)
max(x,y) 返回x和y的最大值
min(x,y) 返回x和y的最小值
pow(x,y) 返回x的y次幂
random() 返回0~1之间的随机数
round(x) 把数四舍五入为最接近的整数
sin(x) 返回数的正弦
sqrt() 返回数的平方根
tan(x) 返回角的正切
toSource() 返回该对象的源代码
valueOf() 返回Math对象的原始值

向上取整ceil()
ceil() 方法可对一个数进行向上取整。

语法:

1
Math.ceil(x)

参数说明:

参数 描述
x 必需,必须是一个数值

注意:它返回的是大于或等于x,并且与x最接近的整数。

我们将把 ceil() 方法运用到不同的数字上,代码

1
2
3
4
5
6
7
8
<script type="text/javascript">
document.write(Math.ceil(0.8) + "<br />")
document.write(Math.ceil(6.3) + "<br />")
document.write(Math.ceil(5) + "<br />")
document.write(Math.ceil(3.5) + "<br />")
document.write(Math.ceil(-5.1) + "<br />")
document.write(Math.ceil(-5.9))
</script>

运行结果:

1
2
3
4
5
6
1
7
5
4
-5
-5

随机数 random()

random() 方法可返回介于 0 ~ 1(大于或等于 0 但小于 1 )之间的一个随机数。
语法:

1
Math.random();

注意:返回一个大于或等于 0 但小于 1 的符号为正的数字值。

我们取得介于 0 到 1 之间的一个随机数,代码如下:

1
2
3
<script type="text/javascript">
document.write(Math.random());
</script>

运行结果:

1
0.190305486195328

注意:因为是随机数,所以每次运行结果不一样,但是0 ~ 1的数值。
获得0 ~ 10之间的随机数,代码如下:

1
2
3
<script type="text/javascript">
document.write((Math.random())*10);
</script>

运行结果:

1
8.72153625893887

Array 数组对象

数组对象是一个对象的集合,里边的对象可以是不同类型的。数组的每一个成员对象都有一个“下标”,用来表示它在数组中的位置,是从零开始的

数组定义的方法:

  1. 定义了一个空数组:
1
var  数组名= new Array();
  1. 定义时指定有n个空元素的数组:
1
var 数组名 =new Array(n);

3.定义数组的时候,直接初始化数据:

1
var  数组名 = [<元素1>, <元素2>, <元素3>...];

我们定义myArray数组,并赋值,代码如下:

1
var myArray = [2, 8, 6];

数组属性:

length 用法:<数组对象>.length;

数组方法:

方法 描述
concat() 连接两个数组或更多的数组,并返回结果
join() 把数组的所有元素放入一个字符串。元素通过指定的分隔符进行分隔
pop() 删除并返回数组的最后一个元素
push() 向数组的末尾添加一个或更多元素,并返回新的长度
reverse() 颠倒数组中元素的顺序
shift() 删除并返回数组的第一个元素
slice() 从某个已有的数组返回选定的元素
sort() 对数组的元素进行排序
splice() 删除元素,并向数组添加新元素
toSource() 返回该对象的源代码
toString() 把数组转换为字符串,并返回结果
toLocaleString() 把数组转换为本地数组,并返回结果
unshift() 向数组的开头添加一个或多个元素,并返回新的长度
valueOf() 返回数组元素的原始值

数组连接concat()

concat() 方法用于连接两个或多个数组。此方法返回一个新数组,不改变原来的数组。

语法

1
arrayObject.concat(array1,array2,...,arrayN)

注意: 该方法不会改变现有的数组,而仅仅会返回被连接数组的一个副本。

我们创建一个数组,将把 concat() 中的参数连接到数组 myarr 中,代码如下:

参数说明:

1
2
3
4
5
6
7
8
<script type="text/javascript">
var mya = new Array(3);
mya[0] = "1";
mya[1] = "2";
mya[2] = "3";
document.write(mya.concat(4,5)+"<br>");
document.write(mya);
</script>

运行结果:

1
2
1,2,3,4,5
1,2,3

我们创建了三个数组,然后使用 concat() 把它们连接起来,代码如下:

1
2
3
4
5
6
7
<script type="text/javascript">
var mya1= new Array("hello!")
var mya2= new Array("I","love");
var mya3= new Array("JavaScript","!");
var mya4=mya1.concat(mya2,mya3);
document.write(mya4);
</script>

运行结果:

1
hello!,I,love,JavaScript,!

指定分隔符连接数组元素join()

join()方法用于把数组中的所有元素放入一个字符串。元素是通过指定的分隔符进行分隔的。
语法:

1
arrayObject.join(分隔符)

参数说明:

参数 描述
separator 可选,指定要使用的分隔符,若省略,则使用逗号作为分隔符

注意:返回一个字符串,该字符串把数组中的各个元素串起来,用<分隔符>置于元素与元素之间。这个方法不影响数组原本的内容。

我们使用join()方法,将数组的所有元素放入一个字符串中,代码如下:

1
2
3
4
5
6
7
<script type="text/javascript">
var myarr = new Array(3);
myarr[0] = "I";
myarr[1] = "love";
myarr[2] = "JavaScript";
document.write(myarr.join());
</script>

运行结果:

1
I,love,JavaScript

颠倒数组元素顺序reverse()

reverse() 方法用于颠倒数组中元素的顺序。

语法:

1
arrayObject.reverse()

注意:该方法会改变原来的数组,而不会创建新的数组。

定义数组myarr并赋值,然后颠倒其元素的顺序:

1
2
3
4
5
6
7
8
<script type="text/javascript">
var myarr = new Array(3)
myarr[0] = "1"
myarr[1] = "2"
myarr[2] = "3"
document.write(myarr + "<br />")
document.write(myarr.reverse())
</script>

运行结果:

1
2
1,2,3
3,2,1

选定元素slice()

slice() 方法可从已有的数组中返回选定的元素。

语法

1
arrayObject.slice(start,end)

参数说明:

1.返回一个新的数组,包含从 start 到 end (不包括该元素)的 arrayObject 中的元素。

  1. 该方法并不会修改数组,而是返回一个子数组。

注意:

  1. 可使用负值从数组的尾部选取元素。

  2. 如果 end 未被规定,那么 slice() 方法会选取从 start 到数组结尾的所有元素。

  3. String.slice() 与 Array.slice() 相似。

我们将创建一个新数组,然后从其中选取的元素,代码如下:

1
2
3
4
5
6
<script type="text/javascript">
var myarr = new Array(1,2,3,4,5,6);
document.write(myarr + "<br>");
document.write(myarr.slice(2,4) + "<br>");
document.write(myarr);
</script>

运行结果:

1
2
3
1,2,3,4,5,6
3,4
1,2,3,4,5,6

数组排序(sort)

sort()方法使数组中的元素按照一定的顺序排列

语法:

1
arrayObject.sort(方法函数)

参数说明:

参数 描述
方法函数 可选。规定顺序排序。必须是函数
  1. 如果不指定<方法函数>,则按unicode码顺序排列
  2. 如果指定<方法函数>,则按<方法函数>所指定的排序方法排序

注意:该函数要比较两个值,然后返回一个用于说明这两个值相对顺序的数字。比较函数应该具有两个参数a和b,其返回值如下。
若返回值 <= -1,则表示A在排序后的序列中出现在B之前
若返回值 > -1 && < 1,则表示A和B具有相同的排序顺序
若返回子 >= 1 ,则表示A在排序后的序列中出现在B之后

1,使用sort将数组进行排序

1
2
3
4
5
6
<script type="text/javascript">
var myarr1 = new Array("Hello","John","love","JavaScript");
var myarr2 = new Array("80","16","50","6","100","1");
document.write(myarr1.sort()+"<br>");
document.write(myarr2.sort());
</script>

运行结果:

1
2
Hello,JavaScript,John,love
1,100,16,50,6,80

注意:上面的代码没有按照数值的大小对数字进行排序。

2.如要实现这一点,就必须使用一个排序函数,代码

1
2
3
4
5
6
7
8
9
<script type="text/javascript">
function sortNum(a,b) {
return a - b;
//升序,如降序,把“a - b”该成“b - a”
}
var myarr = new Array("80","16","50","6","100","1");
document.write(myarr + "<br>");
document.write(myarr.sort(sortNum));
</script>

运行结果:

1
2
80,16,50,6,100,1
1,6,16,50,80,100

浏览器对象

window对象

这里写图片描述

JavaScript 计时器

在JavaScript中,我们可以在设定的时间间隔之后来执行代码,而不是在函数被调用后立即执行。

计时器类型:

一次性计时器:仅在指定的延迟时间之后触发一次。
间隔性触发计时器:每隔一定的时间间隔就触发一次。

计时器setInterval()
在执行时,从载入页面后每隔指定的时间执行代码。

setInterval(代码,交互时间);

  1. 代码:要调用的函数或要执行的代码串。
  2. 交互时间:周期性执行或调用表达式之间的时间间隔,以毫秒计(1s=1000ms)。

返回值:

一个可以传递给 clearInterval() 从而取消对”代码”的周期性执行的值。

调用函数格式(假设有一个clock()函数):

1
setInterval("clock()",1000)


1
setInterval(clock,1000)

我们设置一个计时器,每隔100毫秒调用clock()函数,并将时间显示出来,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>计时器</title>
<script type="text/javascript">
var int=setInterval(clock, 100)
function clock(){
var time=new Date();
document.getElementById("clock").value = time;
}
</script>
</head>
<body>
<form>
<input type="text" id="clock" size="50" />
</form>
</body>
</html>

取消计时器clearInterval()

clearInterval() 方法可取消由 setInterval() 设置的交互时间。

语法:

1
clearInterval(id_of_setInterval)

参数说明:

id_of_setInterval:由 setInterval() 返回的 ID 值。

每隔 100 毫秒调用 clock() 函数,并显示时间。当点击按钮时,停止时间,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>计时器</title>
<script type="text/javascript">
function clock(){
var time=new Date();
document.getElementById("clock").value = time;
}
// 每隔100毫秒调用clock函数,并将返回值赋值给i
var i=setInterval("clock()",100);
</script>
</head>
<body>
<form>
<input type="text" id="clock" size="50" />
<input type="button" value="Stop" onclick="clearInterval(i)" />
</form>
</body>
</html>

计时器setTimeout()

setTimeout()计时器,在载入后延迟指定时间后,去执行一次表达式,仅执行一次。

语法:

1
setTimeout(代码,延迟时间);

参数说明:

  1. 要调用的函数或要执行的代码串。
  2. 延时时间:在执行代码前需等待的时间,以毫秒为单位(1s=1000ms)。

当我们打开网页3秒后,在弹出一个提示框,代码如下:

1
2
3
4
5
6
7
8
9
10
<!DOCTYPE HTML>
<html>
<head>
<script type="text/javascript">
setTimeout("alert('Hello!')", 3000 );
</script>
</head>
<body>
</body>
</html>

当按钮start被点击时,setTimeout()调用函数,在5秒后弹出一个提示框。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<!DOCTYPE HTML>
<html>
<head>
<script type="text/javascript">
function tinfo(){
var t=setTimeout("alert('Hello!')",5000);
}
</script>
</head>
<body>
<form>
<input type="button" value="start" onClick="tinfo()">
</form>
</body>
</html>

要创建一个运行于无穷循环中的计数器,我们需要编写一个函数来调用其自身。在下面的代码,当按钮被点击后,输入域便从0开始计数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<!DOCTYPE HTML>
<html>
<head>
<script type="text/javascript">
var num=0;
function numCount(){
document.getElementById('txt').value=num;
num=num+1;
setTimeout("numCount()",1000);
}
</script>
</head>
<body>
<form>
<input type="text" id="txt" />
<input type="button" value="Start" onClick="numCount()" />
</form>
</body>
</html>

取消计时器clearTimeout()

setTimeout()和clearTimeout()一起使用,停止计时器。

语法:

1
clearTimeout(id_of_setTimeout)

参数说明:

id_of_setTimeout:由 setTimeout() 返回的 ID 值。该值标识要取消的延迟执行代码块。

下面的例子和上节的无穷循环的例子相似。唯一不同是,现在我们添加了一个 “Stop” 按钮来停止这个计数器:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<!DOCTYPE HTML>
<html>
<head>
<script type="text/javascript">
var num=0,i;
function timedCount(){
document.getElementById('txt').value=num;
num=num+1;
i=setTimeout(timedCount,1000);
}
setTimeout(timedCount,1000);
function stopCount(){
clearTimeout(i);
}
</script>
</head>
<body>
<form>
<input type="text" id="txt">
<input type="button" value="Stop" onClick="stopCount()">
</form>
</body>
</html>

History 对象
history对象记录了用户曾经浏览过的页面(URL),并可以实现浏览器前进与后退相似导航的功能。

注意:从窗口被打开的那一刻开始记录,每个浏览器窗口、每个标签页乃至每个框架,都有自己的history对象与特定的window对象关联。

语法:

window.history.[属性|方法]
注意:window可以省略。

History 对象属性

这里写图片描述

History 对象方法

这里写图片描述

使用length属性,当前窗口的浏览历史总长度,代码如下:

1
2
3
4
<script type="text/javascript">
var HL = window.history.length;
document.write(HL);
</script>

返回前一个浏览的页面

back()方法,加载 history 列表中的前一个 URL。

语法:

1
window.history.back();

比如,返回前一个浏览的页面,代码如下:

1
window.history.back();

注意:等同于点击浏览器的倒退按钮。

back()相当于go(-1),代码如下:

1
window.history.go(-1);

返回下一个浏览的页面

forward()方法,加载 history 列表中的下一个 URL。

如果倒退之后,再想回到倒退之前浏览的页面,则可以使用forward()方法,代码如下:

1
window.history.forward();

注意:等价点击前进按钮。

forward()相当于go(1),代码如下:

1
window.history.go(1);

返回浏览历史中的其他页面
go()方法,根据当前所处的页面,加载 history 列表中的某个具体的页面。

语法:

window.history.go(number);
参数:

这里写图片描述

浏览器中,返回当前页面之前浏览过的第二个历史页面,代码如下:

1
window.history.go(-2);

注意:和在浏览器中单击两次后退按钮操作一样。

同理,返回当前页面之后浏览过的第三个历史页面,代码如下:

1
window.history.go(3);

location对象

location用于获取或设置窗体的URL,并且可以用于解析URL。

语法:

1
location.[属性|方法]

location对象属性图示:

这里写图片描述

location 对象属性:

属性 描述
hash 设置或返回从’#’开始的URL(锚)
host 设置或返回主机名和当前URL的端口号
hostname 设置或返回当前URL的主机名
href 设置或返回完整的URL
pathname 设置或返回当前URL的路径部分
port 设置或返回当前URL的端口号
protocol 设置或返回当前URL的协议
search 设置或返回从’?’开始的URL(查询部分)

location 对象方法:

属性 描述
assign() 加载新的文档
reload() 重新加载当前文档
replace() 用新的文档替换当前文档

Navigator对象

Navigator 对象包含有关浏览器的信息,通常用于检测浏览器与操作系统的版本。

对象属性:

这里写图片描述

查看浏览器的名称和版本,代码如下:

1
2
3
4
5
6
7
<script type="text/javascript">
var browser=navigator.appName;
var b_version=navigator.appVersion;
document.write("Browser name"+browser);
document.write("<br>");
document.write("Browser version"+b_version);
</script>

userAgent

返回用户代理头的字符串表示(就是包括浏览器版本信息等的字符串)

语法

1
navigator.userAgent

几种浏览的user_agent.,像360的兼容模式用的是IE、极速模式用的是chrom的内核。

这里写图片描述

使用userAgent判断使用的是什么浏览器(假设使用的是IE8浏览器),代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
function validB(){
var u_agent = navigator.userAgent;
var B_name="Failed to identify the browser";
if(u_agent.indexOf("Firefox")>-1){
B_name="Firefox";
}else if(u_agent.indexOf("Chrome")>-1){
B_name="Chrome";
}else if(u_agent.indexOf("MSIE")>-1&&u_agent.indexOf("Trident")>-1){
B_name="IE(8-10)";
}
document.write("B_name:"+B_name+"<br>");
document.write("u_agent:"+u_agent+"<br>");
}

screen对象

screen对象用于获取用户的屏幕信息。

语法:

1
window.screen.属性

对象属性:

这里写图片描述

屏幕分辨率的高和宽

window.screen 对象包含有关用户屏幕的信息。

  1. screen.height 返回屏幕分辨率的高
  2. screen.width 返回屏幕分辨率的宽

注意:

  1. 单位以像素计。
  2. window.screen 对象在编写时可以不使用 window 这个前缀。

我们来获取屏幕的高和宽,代码如下:

1
2
3
4
<script type="text/javascript">
document.write( "屏幕宽度:"+screen.width+"px<br />" );
document.write( "屏幕高度:"+screen.height+"px<br />" );
</script>

屏幕可用高和宽度

  1. screen.availWidth 属性返回访问者屏幕的宽度,以像素计,减去界面特性,比如任务栏。
  2. screen.availHeight 属性返回访问者屏幕的高度,以像素计,减去界面特性,比如任务栏。

注意:

不同系统的任务栏默认高度不一样,及任务栏的位置可在屏幕上下左右任何位置,所以有可能可用宽度和高度不一样。

我们来获取屏幕的可用高和宽度,代码如下:

1
2
3
4
<script type="text/javascript">
document.write("可用宽度:" + screen.availWidth);
document.write("可用高度:" + screen.availHeight);
</script>

注意:根据屏幕的不同显示值不同。

DOM

文档对象模型DOM(Document Object Model)定义访问和处理HTML文档的标准方法。DOM 将HTML文档呈现为带有元素、属性和文本的树结构(节点树)。

先来看看下面代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<!DOCTYPE html>
<html>
<head>
<title>DOM</title>
</head>
<body>
<h2><a href="http://www.imooc.com">javascript DOM</a></h2>
<p>对HTML元素进行操作,可添加,改变或移除CSS样式等</p>
<ul>
<li>JavaScript</li>
<li>DOM</li>
<li>CSS</li>
</ul>
</body>
</html>

将HTML代码分解为DOM节点层次图:

这里写图片描述

HTML文档可以说由节点构成的集合,DOM节点有:

  1. 元素节点:上图中<html>、<body>、<p>等都是元素节点,即标签。
  2. 文本节点:向用户展示的内容,如<li>...</li>中的JavaScript、DOM、CSS等文本。
  3. 属性节点:元素属性,如<a>标签的链接属性href=”http://www.imooc.com"。

节点属性:

这里写图片描述

遍历节点树:

这里写图片描述

以上图ul为例,它的父级节点body,它的子节点3个li,它的兄弟结点h2、P。

DOM操作:

这里写图片描述

注意:前两个是document方法。

getElementsByName()方法

返回带有指定名称的节点对象的集合。

语法:

1
document.getElementsByName(name)

与getElementById() 方法不同的是,通过元素的 name 属性查询元素,而不是通过 id 属性。

注意:

  1. 因为文档中的 name 属性可能不唯一,所有 getElementsByName() 方法返回的是元素的数组,而不是一个元素。
  2. 和数组类似也有length属性,可以和访问数组一样的方法来访问,从0开始。

看看下面的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<!DOCTYPE html>
<html>
<head>
<title>getElementsByName</title>
<script type="text/javascript">
function getElements(){
var x = document.getElementsByName("alink");
alert(x.length);
}
</script>
</head>
<body>
<a href="" name="alink">我是链接一</a>
<a href="" name="alink">我是连接二</a>
<a href="" name="alink">我是链接三</a>
</br>
<input type="button" onclick="getElements()" value="看看几个链接?">
</body>
</html>

getElementsByTagName()方法

返回带有指定标签名的节点对象的集合。返回元素的顺序是它们在文档中的顺序。

语法:

1
document.getElementsByTagName(Tagname)

说明:

  1. Tagname是标签的名称,如p、a、img等标签名。
  2. 和数组类似也有length属性,可以和访问数组一样的方法来访问,所以从0开始。

看看下面代码,通过getElementsByTagName()获取节点。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<!DOCTYPE html>
<html>
<head>
<title>getElementsByTagName</title>
</head>
<body>
<p id="intro">我的课程</p>
<ul>
<li>JavaScript</li>
<li>JQuery</li>
<li>HTML</li>
<li>JAVA</li>
<li>PHP</li>
</ul>
<script type="text/javascript">
// 获取所有的li集合
var list = document.getElementsByTagName('li');
// 访问无序列表:[0]索引
li = list[0];
// 获取list长度
document.write(list.length);
// 弹出li节点对象的内容
document.write(li.innerHTML);
</script>
</body>
</html>

区别getElementByID,getElementsByName,getElementsByTagName

以人来举例说明,人有能标识身份的身份证,有姓名,有类别(大人、小孩、老人)等。

  1. ID 是一个人的身份证号码,是唯一的。所以通过getElementById获取的是指定的一个人。
  2. Name 是他的名字,可以重复。所以通过getElementsByName获取名字相同的人集合。
  3. TagName可看似某类,getElementsByTagName获取相同类的人集合。如获取小孩这类人,getElementsByTagName(“小孩”)。

把上面的例子转换到HTML中,如下:

1
<input type="checkbox" name="hobby" id="hobby1">  音乐

input标签就像人的类别。
name属性就像人的姓名。
id属性就像人的身份证。

方法总结如下:

这里写图片描述

注意:方法区分大小写

通过下面的例子(6个name=”hobby”的复选项,两个按钮)来区分三种方法的不同:

1
2
3
4
5
6
7
8
<input type="checkbox" name="hobby" id="hobby1">  音乐
<input type="checkbox" name="hobby" id="hobby2"> 登山
<input type="checkbox" name="hobby" id="hobby3"> 游泳
<input type="checkbox" name="hobby" id="hobby4"> 阅读
<input type="checkbox" name="hobby" id="hobby5"> 打球
<input type="checkbox" name="hobby" id="hobby6"> 跑步
<input type="button" value = "全选" id="button1">
<input type="button" value = "全不选" id="button1">
  1. document.getElementsByTagName(“input”),结果为获取所有标签为input的元素,共8个。
  2. document.getElementsByName(“hobby”),结果为获取属性name=”hobby”的元素,共6个。
  3. document.getElementById(“hobby6”),结果为获取属性id=”hobby6”的元素,只有一个,”跑步”这个复选项。

getAttribute()方法

通过元素节点的属性名称获取属性的值。

语法:

1
elementNode.getAttribute(name)

说明:

  1. elementNode:使用getElementById()、getElementsByTagName()等方法,获取到的元素节点。
  2. name:要想查询的元素节点的属性名字

看看下面的代码,获取h1标签的属性值:

运行结果:

1
2
h1标签的ID :alink
h1标签的title :getAttribute()获取标签的属值

setAttribute()方法

setAttribute() 方法增加一个指定名称和值的新属性,或者把一个现有的属性设定为指定的值。

语法:

1
elementNode.setAttribute(name,value)

说明:

  1. name: 要设置的属性名。
  2. value: 要设置的属性值。

注意:

1.把指定的属性设置为指定的值。如果不存在具有指定名称的属性,该方法将创建一个新属性。
2.类似于getAttribute()方法,setAttribute()方法只能通过元素节点对象调用的函数。

节点属性

在文档对象模型 (DOM) 中,每个节点都是一个对象。DOM 节点有三个重要的属性 :

  1. nodeName : 节点的名称
  2. nodeValue :节点的值
  3. nodeType :节点的类型

一、nodeName 属性: 节点的名称,是只读的。

  1. 元素节点的 nodeName 与标签名相同
  2. 属性节点的 nodeName 是属性的名称
  3. 文本节点的 nodeName 永远是 #text
  4. 文档节点的 nodeName 永远是 #document

二、nodeValue 属性:节点的值

  1. 元素节点的 nodeValue 是 undefined 或 null
  2. 文本节点的 nodeValue 是文本自身
  3. 属性节点的 nodeValue 是属性的值

三、nodeType 属性: 节点的类型,是只读的。以下常用的几种结点类型:

元素类型 节点类型
元素 1
属性 2
文本 3
注释 8
文档 9

访问子节点childNodes

访问选定元素节点下的所有子节点的列表,返回的值可以看作是一个数组,他具有length属性。

语法:

1
elementNode.childNodes

注意:如果选定的节点没有子节点,则该属性返回不包含节点的 NodeList。

我们来看看下面的代码:

运行结果:

1
2
3
4
IE:

UL子节点个数:3
节点类型:1

其它浏览器:

1
2
UL子节点个数:7
节点类型:3

注意:

  1. IE全系列、firefox、chrome、opera、safari兼容问题
  2. 节点之间的空白符,在firefox、chrome、opera、safari浏览器是文本节点,所以IE是3,其它浏览器是7,如下图所示:

这里写图片描述

如果把代码改成这样:

1
<ul><li>javascript</li><li>jQuery</li><li>PHP</li></ul>

运行结果:(IE和其它浏览器结果是一样的)

1
2
UL子节点个数:3
节点类型:1

访问子节点的第一和最后项

一、firstChild 属性返回‘childNodes’数组的第一个子节点。如果选定的节点没有子节点,则该属性返回 NULL。

语法:

1
node.firstChild

说明:与elementNode.childNodes[0]是同样的效果。

二、 lastChild 属性返回‘childNodes’数组的最后一个子节点。如果选定的节点没有子节点,则该属性返回 NULL。

语法:

1
node.lastChild

说明:与elementNode.childNodes[elementNode.childNodes.length-1]是同样的效果。

注意: 上一节中,我们知道Internet Explorer 会忽略节点之间生成的空白文本节点,而其它浏览器不会。我们可以通过检测节点类型,过滤子节点。 (以后章节讲解)

访问父节点parentNode

获取指定节点的父节点

语法:

1
elementNode.parentNode

注意:父节点只能有一个。

看看下面的例子,获取 P 节点的父节点,代码如下:

1
2
3
4
5
6
7
<div id="text">
<p id="con"> parentNode 获取指点节点的父节点</p>
</div>
<script type="text/javascript">
var mynode= document.getElementById("con");
document.write(mynode.parentNode.nodeName);
</script>

运行结果:

1
2
parentNode 获取指点节点的父节点
DIV

访问祖节点:

1
elementNode.parentNode.parentNode

看看下面的代码:

1
2
3
4
5
6
7
8
9
10
<div id="text">  
<p>
parentNode
<span id="con"> 获取指点节点的父节点</span>
</p>
</div>
<script type="text/javascript">
var mynode= document.getElementById("con");
document.write(mynode.parentNode.parentNode.nodeName);
</script>

运行结果:

1
2
parentNode获取指点节点的父节点
DIV

注意: 浏览器兼容问题,chrome、firefox等浏览器标签之间的空白也算是一个文本节点。

访问兄弟节点

  1. nextSibling 属性可返回某个节点之后紧跟的节点(处于同一树层级中)。

语法:

1
nodeObject.nextSibling

说明:如果无此节点,则该属性返回 null。

  1. previousSibling 属性可返回某个节点之前紧跟的节点(处于同一树层级中)。

语法:

1
nodeObject.previousSibling

说明:如果无此节点,则该属性返回 null。

注意: 两个属性获取的是节点。Internet Explorer 会忽略节点间生成的空白文本节点(例如,换行符号),而其它浏览器不会忽略。

解决问题方法:

判断节点nodeType是否为1, 如是为元素节点,跳过。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
<!DOCTYPE html>
<html>
<head>
<title>nextSibling</title>
</head>
<body>
<ul id="u1">
<li>javascript</li>
<li>jquery</li>
<li>html</li>
</ul>
<ul id="u2">
<li>css3</li>
<li>php</li>
<li>java</li>
</ul>
<script type="text/javascript">
function get_nextSibling(n)
{
var x = n.nextSibling;
while(x.nodeType!=1)
{
x = x.nextSibling;
}
return x;
}
var x = document.getElementsByTagName("li")[0];
document.write(x.nodeName);
document.write(" = ");
document.write(x.innerHTML);

var y = get_nextSibling(x);

document.write("<br>nextsibling:");
document.write(y.nodeName);
document.write(" = ");
document.write(y.innerHTML);
</script>
</body>
</html>

运行结果:

1
2
LI = javascript
nextsibling: LI = jquery

插入节点appendChild()

在指定节点的最后一个子节点列表之后添加一个新的子节点。

语法:

1
appendChild(newnode)

参数:

newnode:指定追加的节点。

我们来看看,div标签内创建一个新的 P 标签,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<!DOCTYPE html>
<html>
<head>
<title>appendChild</title>
</head>
<body>
<div id="test">
<p id="x1">HTML</p>
<p>JavaScript</p>
</div>
<script type="text/javascript">
var otest = document.getElementById("test");
var newnode = document.createElement("p");
newnode.innerHTML = "This is a new p";
// appendChild方法添加结点
otest.appendChild(newnode);
</script>
</body>
</html>

运行结果:

1
2
3
HTML
JavaScript
This is a new p

插入节点insertBefore()

insertBefore() 方法可在已有的子节点前插入一个新的子节点。

语法:

1
insertBefore(newnode,node);
参数:

newnode: 要插入的新节点。
node: 指定此节点前插入节点。

我们在来看看下面代码,在指定节点前插入节点。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<!DOCTYPE html>
<html>
<head>
<title>insertBefore</title>
</head>
<body>
<div id="div1"><p id="x1">JavaScript</p><p>HTML</p></div>
<script type="text/javascript">
var otest = document.getElementById("div1");
var node = document.getElementById("x1");
var newnode = document.createElement("p");
newnode.innerHTML = "This is a new p";
otest.insertBefore(newnode,node);
</script>
</body>
</html>

运行结果:

1
2
3
This is a new p
JavaScript
HTML

注意: otest.insertBefore(newnode,node); 也可以改为: otest.insertBefore(newnode,otest.childNodes[0]);

删除节点removeChild()

removeChild() 方法从子节点列表中删除某个节点。如删除成功,此方法可返回被删除的节点,如失败,则返回 NULL。

语法:

1
nodeObject.removeChild(node)

参数:

1
node :必需,指定需要删除的节点。

我们来看看下面代码,删除子点。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<!DOCTYPE html>
<html>
<head>
<title>removeChild</title>
</head>
<body>
<div id="div1"><h1>HTML</h1><h2>javascript</h2></div>
<script type="text/javascript">
var otest = document.getElementById("div1");
var x = otest.removeChild(otest.childNodes[1]);
document.write("删除节点的内容:"+x.innerHTML);
</script>
</body>
</html>

运行结果:

1
2
HTML
删除节点的内容: javascript

注意: 把删除的子节点赋值给 x,这个子节点不在DOM树中,但是还存在内存中,可通过 x 操作。

如果要完全删除对象,给 x 赋 null 值,代码如下:

1
2
3
var otest = document.getElementById("div1");
var x = otest.removeChild(otest.childNodes[1]);
x = null;

替换元素节点replaceChild()

replaceChild 实现子节点(对象)的替换。返回被替换对象的引用。

语法:

1
node.replaceChild (newnode,oldnew )

参数:

newnode : 必需,用于替换 oldnew 的对象。
oldnew : 必需,被 newnode 替换的对象。

我们来看看下面的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<!DOCTYPE html>
<html>
<head>
<title>replaceChild</title>
</head>
<body>
<script type="text/javascript">
function replaceMessage(){
var newnode = document.createElement("p");
var newnodeText = document.createTextNode("JavaScript");
newnode.appendChild(newnodeText);
var oldNode = document.getElementById("oldnode");
oldNode.parentNode.replaceChild(newnode,oldNode);
}
</script>

<h1 id="oldnode">Java</h1>
<a href="javascript:replaceMessage()">"Java" 替换 "JavaScript"</a>
</body>
</html>

效果: 将文档中的 Java 改为 JavaScript。

注意:

  1. 当 oldnode 被替换时,所有与之相关的属性内容都将被移除。
  2. newnode 必须先被建立。
创建元素节点createElement

createElement()方法可创建元素节点。此方法可返回一个 Element 对象。

语法:

1
document.createElement(tagName)

参数:

tagName:字符串值,这个字符串用来指明创建元素的类型。

注意:要与appendChild() 或 insertBefore()方法联合使用,将元素显示在页面中。

我们来创建一个按钮,代码如下:

1
2
3
4
5
6
7
<script type="text/javascript">
var body = document.body;
var input = document.createElement("input");
input.type = "button";
input.value = "创建一个按钮";
body.appendChild(input);
</script>

效果:在HTML文档中,创建一个按钮。

我们也可以使用setAttribute来设置属性,代码如下:

1
2
3
4
5
6
7
8
9
<script type="text/javascript">  
var body= document.body;
var btn = document.createElement("input");
btn.setAttribute("type", "text");
btn.setAttribute("name", "q");
btn.setAttribute("value", "使用setAttribute");
btn.setAttribute("onclick", "javascript:alert('This is a text!');");
body.appendChild(btn);
</script>

效果:在HTML文档中,创建一个文本框,使用setAttribute设置属性值。 当点击这个文本框时,会弹出对话框“This is a text!”。

创建文本节点createTextNode

createTextNode() 方法创建新的文本节点,返回新创建的 Text 节点。

语法:

1
document.createTextNode(data)

参数:

data : 字符串值,可规定此节点的文本。

我们来创建一个<div>元素并向其中添加一条消息,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<!DOCTYPE html>
<html>
<head>
<title>createTextNode</title>
<style type="text/css">
.message{
width: 200px;
height: 100px;
background-color: #CCC;
}
</style>
</head>
<body>
<script type="text/javascript">
var element = document.createElement("div");
element.className = "message";
var textNode = document.createTextNode("Hello world!");
element.appendChild(textNode);
document.body.appendChild(element);
</script>
</body>
</html>

运行结果:

这里写图片描述

浏览器窗口可视区域大小

获得浏览器窗口的尺寸(浏览器的视口,不包括工具栏和滚动条)的方法:

一、对于IE9+、Chrome、Firefox、Opera 以及 Safari:

  • window.innerHeight - 浏览器窗口的内部高度
  • window.innerWidth - 浏览器窗口的内部宽度

二、对于 Internet Explorer 8、7、6、5:

  • document.documentElement.clientHeight表示HTML文档所在窗口的当前高度。
  • document.documentElement.clientWidth表示HTML文档所在窗口的当前宽度。

或者

Document对象的body属性对应HTML文档的<body>标签

  • document.body.clientHeight
  • document.body.clientWidth

在不同浏览器都实用的 JavaScript 方案:

1
2
3
4
var w= document.documentElement.clientWidth
|| document.body.clientWidth;
var h= document.documentElement.clientHeight
|| document.body.clientHeight;

网页尺寸scrollHeight

scrollHeight和scrollWidth,获取网页内容高度和宽度。

一、针对IE、Opera:

scrollHeight 是网页内容实际高度,可以小于 clientHeight。

二、针对NS、FF:

scrollHeight 是网页内容高度,不过最小值是 clientHeight。也就是说网页内容实际高度小于 clientHeight 时,scrollHeight 返回 clientHeight 。

三、浏览器兼容性

1
2
3
4
var w=document.documentElement.scrollWidth
|| document.body.scrollWidth;
var h=document.documentElement.scrollHeight
|| document.body.scrollHeight;

注意:区分大小写

scrollHeight和scrollWidth还可获取Dom元素中内容实际占用的高度和宽度。

网页尺寸offsetHeight

offsetHeight和offsetWidth,获取网页内容高度和宽度(包括滚动条等边线,会随窗口的显示大小改变)。

一、值

offsetHeight = clientHeight + 滚动条 + 边框。

二、浏览器兼容性

1
2
3
4
var w= document.documentElement.offsetWidth
|| document.body.offsetWidth;
var h= document.documentElement.offsetHeight
|| document.body.offsetHeight;

编程练习

制作一个表格,显示班级的学生信息。

要求:

  1. 鼠标移到不同行上时背景色改为色值为 #f2f2f2,移开鼠标时则恢复为原背景色 #fff
  2. 点击添加按钮,能动态在最后添加一行
  3. 点击删除按钮,则删除当前行

任务
第一步: 首先,我们创建删除函数,并在删除按钮上添加点击事件;

提示: 使用removeChild()。
第二步: 编写一个函数,供添加按钮调用,动态在表格的最后一行添加子节点;

提示: 使用createElement()、innerHTML、appendChild()。
第三步: 更改鼠标移动改变背景则可以通过给每行绑定鼠标移上事件和鼠标移除事件来改变所在行背景色。

提示:

  1. 获取表格的行,getElementsByTagName 。
  2. 使用for进行循环,为每行添加事件及背景颜色设置。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74

<!DOCTYPE html>
<html>
<head>
<title> new document </title>
<meta http-equiv="Content-Type" content="text/html; charset=gbk"/>
<script type="text/javascript">
window.onload = function(){
Highlight();
}
function addOne(obj){
var tbody = document.getElementById('table').lastChild;
var tr = document.createElement('tr');

var td = document.createElement("td");
td.innerHTML = "<input type='text'/>";
tr.appendChild(td);

td = document.createElement("td");
td.innerHTML = "<input type='text'/>";
tr.appendChild(td);

td = document.createElement("td");
td.innerHTML = "<a href='javascript:;' onclick='deleteRow(this)'>ɾ³ý</a>";
tr.appendChild(td);

tbody.appendChild(tr);
Highlight();
}

function deleteRow(obj){
var tbody = document.getElementById('table').lastChild;
var tr = obj.parentNode.parentNode;
tbody.removeChild(tr);
}
function Highlight(){
var tbody = document.getElementById('table').lastChild;
trs = tbody.getElementsByTagName('tr');
for(var i =1;i<trs.length;i++){
trs[i].onmouseover = function(){
this.style.backgroundColor ="#f2f2f2";
}
trs[i].onmouseout = function(){
this.style.backgroundColor ="#fff";
}
}
}

</script>
</head>
<body>
<table border="1" width="50%" id="table">
<tr>
<th>学号</th>
<th>姓名</th>
<th>操作</th>
</tr>

<tr>
<td>xh001</td>
<td>王小明</td>
<td><a href="javascript:;" onclick="deleteRow(this)">ɾ³ý</a></td>
</tr>

<tr>
<td>xh002</td>
<td>刘小芳</td>
<td><a href="javascript:;" onclick="deleteRow(this)">ɾ³ý</a></td>
</tr>

</table>
<input type="button" value="Ìí¼ÓÒ»ÐÐ" onclick="addOne()" />
</body>
</html>

#### 编程挑战

现在利用之前我们学过的JavaScript知识,实现选项卡切换的效果。

效果图:

这里写图片描述

文字素材:

房产:

275万购昌平邻铁三居 总价20万买一居
200万内购五环三居 140万安家东三环
北京首现零首付楼盘 53万购东5环50平
京楼盘直降5000 中信府 公园楼王现房

家居:

40平出租屋大改造 美少女的混搭小窝
经典清新简欧爱家 90平老房焕发新生
新中式的酷色温情 66平撞色活泼家居
瓷砖就像选好老婆 卫生间烟道的设计

二手房:

通州豪华3居260万 二环稀缺2居250w甩
西3环通透2居290万 130万2居限量抢购
黄城根小学学区仅260万 121平70万抛!
独家别墅280万 苏州桥2居优惠价248万

任务
大家先思考和分析实现思路,然后在动手实现

一、HTML页面布局

提示:

  • 选项卡标题使用ul..li
  • 选项卡内容使用div

二、CSS样式制作

提示:

  • 整个选项卡的样式设置
  • 选项卡标题的样式设置
  • 选项卡内容的样式设置

一开始只显示一个选项卡内容,其它选项卡内容隐藏。

三、JS实现选项卡切换

提示: 获取选项卡标题和选项卡内容 选项卡内容多个,需要循环遍历来操作,得知哪个选项卡和哪个选项内容匹配
通过改变DOM的css类名称,当前点击的选项卡显示,其它隐藏。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68

<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title>实践题 - 选项卡</title>
<style type="text/css">
*{padding:0px;margin: 0px;font:12px normal "microsoft yahei";}
#tabs {width:290px;padding:5px;height:150px;margin:20px;}
#tabs ul{list-style:none;display: block;height:30px;line-height:30px;border-bottom:2px saddlebrown solid;}
#tabs ul li{background:#fff;cursor:pointer;float:left;list-style:none;height:28px;line-height:28px;margin:0px 3px;border:1px solid #aaaaaa;border-bottom:none;display:inline-block;width:60px;text-align: center;}
#tabs ul li.on{border-top:2px solid saddlebrown;border-bottom: 2px solid #fff;}
#tabs div{height:120px;line-height: 25px;border:1px solid #336699;border-top:none;padding:5px;}
.hide{display: none;}
</style>
<script type="text/javascript">
window.onload = function(){
var oTab = document.getElementById("tabs");
var oUl = oTab.getElementsByTagName("ul")[0];
var oLis = oUl.getElementsByTagName("li");
var oDivs= oTab.getElementsByTagName("div");

for(var i= 0,len = oLis.length;i<len;i++){
oLis[i].index = i;
oLis[i].onclick = function() {
for(var n= 0;n<len;n++){
oLis[n].className = "";
oDivs[n].className = "hide";
}
this.className = "on";
oDivs[this.index].className = "";
}
};
}
</script>

</head>
<body>
<div id="tabs">
<ul>
<li class="on">房产</li>
<li>家居</li>
<li>二手房</li>
</ul>
<div>
275万购昌平邻铁三居 总价20万买一居<br>
200万内购五环三居 140万安家东三环<br>
北京首现零首付楼盘 53万购东5环50平<br>
京楼盘直降5000 中信府 公园楼王现房<br>
</div>
<div class="hide">
40平出租屋大改造 美少女的混搭小窝<br>
经典清新简欧爱家 90平老房焕发新生<br>
新中式的酷色温情 66平撞色活泼家居<br>
瓷砖就像选好老婆 卫生间烟道的设计<br>

</div>
<div class="hide">
通州豪华3居260万 二环稀缺2居250w甩<br>
西3环通透2居290万 130万2居限量抢购<br>
黄城根小学学区仅260万 121平70万抛!<br>
独家别墅280万 苏州桥2居优惠价248万<br>

</div>
</div>

</body>
</html>


坚持原创技术分享,您的支持将鼓励我继续创作
-------------本文结束感谢您的阅读-------------
0%