事件响应
什么是事件
JavaScript
创建动态页面。事件是可以被 JavaScript
侦测到的行为。 网页中的每个元素都可以产生某些可以触发 JavaScript
函数或程序的事件。
比如说,当用户单击按钮或者提交表单数据时,就发生一个鼠标单击(onclick)
事件,需要浏览器做出处理,返回给用户一个结果。
主要事件表:
鼠标单击事件(onclick)
onclick
是鼠标单击事件,当在网页上单击鼠标时,就会发生该事件。同时onclick
事件调用的程序块就会被执行,通常与按钮一起使用。
比如,我们单击按钮时,触发 onclick
事件,并调用两个数和的函数add2()
。代码如下:
<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)
鼠标经过事件,当鼠标移到一个对象上时,该对象就触发onmouseover
事件,并执行onmouseover
事件调用的程序。
现实鼠标经过"确定"按钮时,触发onmouseover
事件,调用函数,弹出消息框,代码如下:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title> 鼠标经过事件 </title>
<script type="text/javascript">
function message(){
confirm("请输入密码后,再单击确定!"); }
</script>
</head>
<body>
<form>
密码:<input name="password" type="password" >
<input name="确定" type="button" value="确定" onmouseover="message()"/>
</form>
</body>
</html>
鼠标移开事件(onmouseout)
鼠标移开事件,当鼠标移开当前对象时,执行onmouseout
调用的程序。
当把鼠标移动到"登录"按钮上,然后再移开时,触发onmouseout
事件,调用函数,代码如下:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>鼠标移开事件 </title>
<script type="text/javascript">
function message(){
alert("不要移开,点击后进行慕课网!"); }
</script>
</head>
<body>
<form>
<a href="http://www.imooc.com" onmouseout="message()">点击我</a>
</form>
</body>
</html>
光标聚焦事件(onfocus)
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title> 光标聚焦事件 </title>
<script type="text/javascript">
function message(){
alert("请选择,您现在的职业!");
}
</script>
</head>
<body>
请选择您的职业:<br>
<form>
<select name="career" onfocus="message()">
<option>学生</option>
<option>教师</option>
<option>工程师</option>
<option>演员</option>
<option>会计</option>
</select>
</form>
</body>
</html>
失焦事件(onblur)
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title> 失焦事件 </title>
<script type="text/javascript">
function message(){
alert("请确定已输入密码后,在移开!"); }
</script>
</head>
<body>
<form>
用户:<input name="username" type="text" value="请输入用户名!" onblur="message()">
密码:<input name="password" type="text" value="请输入密码!" >
</form>
</body>
</html>
内容选中事件(onselect)
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title> 内容选中事件 </title>
<script type="text/javascript">
function message(){
alert("您触发了选中事件!"); }
</script>
</head>
<body>
<form>
个人简介:<br>
<textarea name="summary" cols="60" rows="5" onselect="message()">请写入个人简介,不少于200字!</textarea>
</form>
</body>
</html>
文本框内容改变事件(onchange)
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title> 文本框内容改变事件 </title>
<script type="text/javascript">
function message(){
alert("您改变了文本内容!"); }
</script>
</head>
<body>
<form>
个人简介:<br>
<textarea name="summary" cols="60" rows="5" onchange="message()">请写入个人简介,不少于200字!</textarea>
</form>
</body>
</html>
加载事件(onload)
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title> 加载事件 </title>
<script type="text/javascript">
function message(){
alert("加载中,请稍等…"); }
</script>
</head>
<body onload="message()">
欢迎学习JavaScript。
</body>
</html>
卸载事件(onunload)
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title> 卸载事件 </title>
<script type="text/javascript">
window.onunload = onunload_message;
function onunload_message(){
alert("您确定离开该网页吗?");
}
</script>
</head>
<body>
欢迎学习JavaScript。
</body>
</html>
注意:不同浏览器对onunload
事件支持不同。
内置对象
对象
JavaScript 中的所有事物都是对象,如:字符串、数值、数组、函数等,每个对象带有属性和方法。
对象的属性:反映该对象某些特定的性质的,如:字符串的长度、图像的长宽等;
对象的方法:能够在对象上执行的动作。例如,表单的“提交”
(Submit)
,时间的“获取”(getYear)
等;JavaScript 提供多个内建对象,比如
String
、Date
、Array
等等,使用对象前先定义,如下使用数组对象:
var objectName =new Array();//使用new关键字定义对象
或者
var objectName =[];
- 访问对象属性的语法:
objectName.propertyName
如使用 Array 对象的 length 属性来获得数组的长度:
var myarray=new Array(6);//定义数组对象
var myl=myarray.length;//访问数组长度length属性
以上代码执行后,myl的值将是:6
- 访问对象的方法:
objectName.methodName()
如使用string
对象的 toUpperCase()
方法来将文本转换为大写:
var mystr="Hello world!";//创建一个字符串
var request=mystr.toUpperCase(); //使用字符串对象方法
以上代码执行后,request的值是:HELLO WORLD!
Date 日期对象
日期对象可以储存任意一个日期,并且可以精确到毫秒数(1/1000 秒)。
定义一个时间对象 :
var Udate=new Date();
使 Udate
成为日期对象,并且已有初始值:当前时间(当前电脑系统时间)。
注意:使用关键字new
,Date()
的首字母必须大写。
如果要自定义初始值,可以用以下方法:
var d = new Date(2012, 10, 1); //2012年10月1日
var d = new Date('Oct 1, 2012'); //2012年10月1日
我们最好使用下面介绍的“方法”来严格定义时间。
访问方法语法:“<日期对象>.<方法>
”
Date
对象中处理时间和日期的常用方法:
返回/设置年份
var mydate = new Date();
var myyear = mydate.getFullYear();
document.write(myyear);
返回星期
getDay()
返回星期,返回的是0-6的数字,0 表示星期天。如果要返回相对应“星期”,通过数组完成
<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小时,代码如下:
<script type="text/javascript">
var mydate=new Date();
document.write("当前时间:"+mydate+"<br>");
mydate.setTime(mydate.getTime() + 60 * 60 * 1000);
document.write("推迟一小时时间:" + mydate);
</script>
时间推迟 1 小时,就是: “x.setTime(x.getTime() + 60 * 60 * 1000);
”
String 字符串对象
定义字符串
var mystr = "I love JavaScript!"
访问字符串对象的属性length
:
stringObject.length
; 返回该字符串的长度。
var mystr="Hello World!";
var myl=mystr.length; //myl 的值将是:12
访问字符串对象的方法:
使用 String
对象的 toUpperCase()
方法来将字符串小写字母转换为大写:
var mystr="Hello world!";
var mynum=mystr.toUpperCase(); //ynum 的值是:HELLO WORLD!
返回指定位置的字符
charAr()
方法可返回指定位置的字符。返回的字符是长度为 1 的字符串。
stringObject.charAt(index) //index代表字符在字符串中的下标
注意:
- 字符串中第一个字符的下标是
0
。最后一个字符的下标为字符串长度减一(string.length-1)
。 - 如果参数
index
不在0
与string.length-1
之间,该方法将返回一个空字符串。 - 一个空格也算一个字符。
返回指定的字符串首次出现的位置
indexOf()
方法可返回某个指定的字符串值在字符串中首次出现的位置。
语法
stringObject.indexOf(substring, startpos)
参数说明:
说明:
该方法将从头到尾地检索字符串
stringObject
,看它是否含有子串substring
。可选参数,从
stringObject
的startpos
位置开始查找substring
,如果没有此参数将从stringObject
的开始位置查找。如果找到一个
substring
,则返回substring
的第一次出现的位置。stringObject
中的字符位置是从0
开始的。
注意:
indexOf()
方法区分大小写。如果要检索的字符串值没有出现,则该方法返回
-1
。
例如: 对 "I love JavaScript!"
字符串内进行不同的检索:
<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>
以上代码的输出:
0
4
9
字符串分割split()
split()
方法将字符串分割为字符串数组,并返回此数组。
语法:
stringObject.split(separator,limit)
参数说明:
注意:如果把空字符串 ("")
用作 separator
,那么 stringObject
中的每个字符之间都会被分割。
我们将按照不同的方式来分割字符串:
使用指定符号分割字符串,代码如下:
var mystr = "www.imooc.com";
document.write(mystr.split(".")+"<br>");
document.write(mystr.split(".", 2)+"<br>");
运行结果:
www,imooc,com
www,imooc
将字符串分割为字符,代码如下:
document.write(mystr.split("")+"<br>");
document.write(mystr.split("", 5));
运行结果:
w,w,w,.,i,m,o,o,c,.,c,o,m
w,w,w,.,i
提取字符串substring()
substring()
方法用于提取字符串中介于两个指定下标之间的字符。
语法:
stringObject.substring(startPos,stopPos)
参数说明:
注意:
返回的内容是从
start
开始(包含start
位置的字符)到stop-1
处的所有字符,其长度为stop
减start
。如果参数
start
与stop
相等,那么该方法返回的就是一个空串(即长度为0
的字符串)。如果
start
比stop
大,那么该方法在提取子串之前会先交换这两个参数。
使用 substring()
从字符串中提取字符串,代码如下:
<script type="text/javascript">
var mystr="I love JavaScript";
document.write(mystr.substring(7));
document.write(mystr.substring(2,6));
</script>
运行结果:
JavaScript
love
提取指定数目的字符substr()
substr()
方法从字符串中提取从 startPos
位置开始的指定数目的字符串。
语法:
stringObject.substr(startPos,length)
参数说明:
注意:如果参数startPos
是负数,从字符串的尾部开始算起的位置。也就是说,-1
指字符串中最后一个字符,-2
指倒数第二个字符,以此类推。
如果startPos
为负数且绝对值大于字符串长度,startPos
为0
。
使用 substr()
从字符串中提取一些字符,代码如下:
<script type="text/javascript">
var mystr="I love JavaScript!";
document.write(mystr.substr(7));
document.write(mystr.substr(2,4));
</script>
运行结果:
JavaScript!
love
Math对象
Math
对象,提供对数据的数学计算。
使用 Math
的属性和方法,代码如下:
<script type="text/javascript">
var mypi=Math.PI;
var myabs=Math.abs(-15);
document.write(mypi);
document.write(myabs);
</script>
运行结果:
3.141592653589793
15
注意:Math
对象是一个固有的对象,无需创建它,直接把 Math
作为对象使用就可以调用其所有属性和方法。这是它与Date
,String
对象的区别。
Math 对象属性
Math 对象方法
向上取整ceil()
ceil()
方法可对一个数进行向上取整。
语法:
Math.ceil(x)
参数说明:
x 必填 必须是一个数值
注意:它返回的是大于或等于x
,并且与x
最接近的整数。
我们将把 ceil()
方法运用到不同的数字上,代码如下:
<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
7
5
4
-5
-5
向下取整floor()
floor()
方法可对一个数进行向下取整。
语法:
Math.floor(x)
参数说明:
x
必需 且必须是一个数值。
注意:返回的是小于或等于x
,并且与 x
最接近的整数。
我们将在不同的数字上使用 floor()
方法,代码如下:
<script type="text/javascript">
document.write(Math.floor(0.8)+ "<br>")
document.write(Math.floor(6.3)+ "<br>")
document.write(Math.floor(5)+ "<br>")
document.write(Math.floor(3.5)+ "<br>")
document.write(Math.floor(-5.1)+ "<br>")
document.write(Math.floor(-5.9))
</script>
运行结果:
0
6
5
3
-6
-6
四舍五入round()
round()
方法可把一个数字四舍五入为最接近的整数。
语法:
Math.round(x)
参数说明:
x
:必需,必须是数字。
注意:
返回与
x
最接近的整数。对于 0.5,该方法将进行上舍入。(5.5 将舍入为 6)
如果
x
与两侧整数同等接近,则结果接近+∞
方向的数字值 。(如 -5.5 将舍入为 -5; -5.52 将舍入为 -6),如下图:
把不同的数舍入为最接近的整数,代码如下:
<script type="text/javascript">
document.write(Math.round(1.6)+ "<br>");
document.write(Math.round(2.5)+ "<br>");
document.write(Math.round(0.49)+ "<br>");
document.write(Math.round(-6.4)+ "<br>");
document.write(Math.round(-6.6));
</script>
运行结果:
2
3
0
-6
-7
随机数 random()
random()
方法可返回介于 0 ~ 1(大于或等于 0 但小于 1 )之间的一个随机数。
语法:
Math.random();
注意:返回一个大于或等于 0 但小于 1 的符号为正的数字值。
我们取得介于 0 到 1 之间的一个随机数,代码如下:
<script type="text/javascript">
document.write(Math.random());
</script>
运行结果:
0.190305486195328
注意:因为是随机数,所以每次运行结果不一样,但是0 ~ 1的数值。
获得0 ~ 10之间的随机数,代码如下:
<script type="text/javascript">
document.write((Math.random())*10);
</script>
运行结果:
8.72153625893887
Array 数组对象
数组对象是一个对象的集合,里边的对象可以是不同类型的。数组的每一个成员对象都有一个“下标”,用来表示它在数组中的位置,是从零开始的
数组定义的方法:
- 定义了一个空数组:
var 数组名= new Array();
- 定义时指定有n个空元素的数组:
var 数组名 =new Array(n);
- 定义数组的时候,直接初始化数据:
var 数组名 = [<元素1>, <元素2>, <元素3>...];
定义myArray
数组,并赋值,代码如下:
var myArray = [2, 8, 6];
说明:定义了一个数组 myArray
,里边的元素是:myArray[0] = 2
; myArray[1] = 8
; myArray[2] = 6
。
数组元素使用:
数组名[下标] = 值;
注意: 数组的下标用方括号括起来,从0
开始。
数组属性:
length
用法:
<数组对象>.length;
返回:数组的长度,即数组里有多少个元素。它等于数组里最后一个元素的下标加一。
数组方法:
数组连接concat()
concat()
方法用于连接两个或多个数组。此方法返回一个新数组,不改变原来的数组。
语法
arrayObject.concat(array1,array2,...,arrayN)
参数说明:
-
array1
:要连接的第一个数组 -
arrayN
:要连接的第N个数组
注意: 该方法不会改变现有的数组,而仅仅会返回被连接数组的一个副本。
我们创建一个数组,将把 concat()
中的参数连接到数组 myarr
中,代码如下:
<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,3,4,5
1,2,3
我们创建了三个数组,然后使用 concat()
把它们连接起来,代码如下:
<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>
运行结果:
hello!,I,love,JavaScript,!
指定分隔符连接数组元素join()
join()
方法用于把数组中的所有元素放入一个字符串。元素是通过指定的分隔符进行分隔的。
语法:
arrayObject.join(分隔符)
参数说明:
-
sepaiator
: 可选,指定要使用的分隔符,如果省略该参数,则使用逗号作为分隔符
注意:返回一个字符串,该字符串把数组中的各个元素串起来,用<分隔符>置于元素与元素之间。这个方法不影响数组原本的内容。
代码如下:
<script type="text/javascript">
var myarr = new Array(3);
myarr[0] = "I";
myarr[1] = "love";
myarr[2] = "JavaScript";
document.write(myarr.join());
</script>
运行结果:
I,love,JavaScript
我们将使用分隔符来分隔数组中的元素,代码如下:
<script type="text/javascript">
var myarr = new Array(3)
myarr[0] = "I";
myarr[1] = "love";
myarr[2] = "JavaScript";
document.write(myarr.join("."));
</script>
运行结果:
I.love.JavaScript
颠倒数组元素顺序reverse()
reverse()
方法用于颠倒数组中元素的顺序。
语法:
arrayObject.reverse()
注意:该方法会改变原来的数组,而不会创建新的数组。
定义数组myarr
并赋值,然后颠倒其元素的顺序:
<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,3
3,2,1
选定元素slice()
slice()
方法可从已有的数组中返回选定的元素。
语法
arrayObject.slice(start,end)
参数说明:
返回一个新的数组,包含从
start
到end
(不包括该元素)的arrayObject
中的元素。该方法并不会修改数组,而是返回一个子数组。
注意:
可使用负值从数组的尾部选取元素。
如果
end
未被规定,那么slice()
方法会选取从 start 到数组结尾的所有元素。String.slice()
与Array.slice()
相似。
我们将创建一个新数组,然后从其中选取的元素,代码如下:
<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,4,5,6
3,4
1,2,3,4,5,6
数组排序sort()
sort()
方法使数组中的元素按照一定的顺序排列。
语法:
arrayObject.sort(方法函数)
参数说明:
方法函数:可选,规定排序顺序,必须是函数
1.如果不指定<方法函数>,则按unicode码顺序排列。
2.如果指定<方法函数>,则按<方法函数>所指定的排序方法排序。
myArray.sort(sortMethod);
注意: 该函数要比较两个值,然后返回一个用于说明这两个值的相对顺序的数字。比较函数应该具有两个参数 a
和 b
,其返回值如下:
若返回值<=-1,则表示 A 在排序后的序列中出现在 B 之前。
若返回值>-1 && <1,则表示 A 和 B 具有相同的排序顺序。
若返回值>=1,则表示 A 在排序后的序列中出现在 B 之后。
- 使用
sort()
将数组进行排序,代码如下:
<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>
运行结果:
Hello,JavaScript,John,love
1,100,16,50,6,80
注意:上面的代码没有按照数值的大小对数字进行排序。
- 如要实现这一点,就必须使用一个排序函数,代码如下:
<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>
运行结果:
80,16,50,6,100,1
1,6,16,50,80,100
浏览器对象
window对象
window对象是BOM的核心,window对象指当前的浏览器窗口。
window对象方法:
JavaScript 计时器
在JavaScript中,我们可以在设定的时间间隔之后来执行代码,而不是在函数被调用后立即执行。
计时器类型:
一次性计时器:仅在指定的延迟时间之后触发一次。
间隔性触发计时器:每隔一定的时间间隔就触发一次。
计时器方法:
计时器setInterval()
在执行时,从载入页面后每隔指定的时间执行代码。
语法:
setInterval(代码,交互时间);
参数说明:
代码:要调用的函数或要执行的代码串。
交互时间:周期性执行或调用表达式之间的时间间隔,以毫秒计(1s=1000ms)。
返回值:
一个可以传递给 clearInterval()
从而取消对"代码"的周期性执行的值。
调用函数格式(假设有一个clock()
函数):
setInterval("clock()",1000)
或
setInterval(clock,1000)
我们设置一个计时器,每隔100毫秒调用clock()
函数,并将时间显示出来,代码如下:
<!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>
动态显示当前时间代码:
<script type="text/javascript">
var attime;
function clock(){
var time=new Date();
attime=time.getHours()+":"+time.getMinutes()+":"+time.getSeconds();
document.getElementById("clock").value = attime;
}
setInterval(clock,1000);
</script>
取消计时器clearInterval()
clearInterval()
方法可取消由 setInterval()
设置的交互时间。
语法:
clearInterval(id_of_setInterval)
参数说明:
id_of_setInterval:由 setInterval() 返回的 ID 值。
每隔 100 毫秒调用 clock()
函数,并显示时间。当点击按钮时,停止时间,代码如下:
<!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()
计时器,在载入后延迟指定时间后,去执行一次表达式,仅执行一次。
语法:
setTimeout(代码,延迟时间);
参数说明:
1. 代码:要调用的函数或要执行的代码串。
2. 延时时间:在执行代码前需等待的时间,以毫秒为单位(1s=1000ms)。
当我们打开网页3秒后,在弹出一个提示框,代码如下:
<!DOCTYPE HTML>
<html>
<head>
<script type="text/javascript">
setTimeout("alert('Hello!')", 3000 );
</script>
</head>
<body>
</body>
</html>
当按钮start被点击时,setTimeout()
调用函数,在5秒后弹出一个提示框。
<!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开始计数。
<!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()
一起使用,停止计时器。
语法:
clearTimeout(id_of_setTimeout)
参数说明:
id_of_setTimeout
:由 setTimeout() 返回的 ID 值。该值标识要取消的延迟执行代码块。
下面的例子和上节的无穷循环的例子相似。唯一不同是,现在我们添加了一个 "Stop
" 按钮来停止这个计数器:
<!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 对象属性
length: 返回浏览历史列表中的url数量
-
History 对象方法
back():加载history列表中的前一个url
forward():加载history列表中的下一个url
go():加载history列表中某个具体的页面
使用length属性,当前窗口的浏览历史总长度,代码如下:
<script type="text/javascript">
var HL = window.history.length;
document.write(HL);
</script>
返回前一个浏览的页面
back()
方法,加载 history
列表中的前一个 URL
。
语法:
window.history.back();
比如,返回前一个浏览的页面,代码如下:
window.history.back();
注意:等同于点击浏览器的倒退按钮。
back()
相当于go(-1)
,代码如下:
window.history.go(-1);
返回下一个浏览的页面
forward()
方法,加载 history
列表中的下一个 URL
。
如果倒退之后,再想回到倒退之前浏览的页面,则可以使用forward()
方法,代码如下:
window.history.forward();
注意:等价点击前进按钮。
forward()
相当于go(1)
,代码如下:
window.history.go(1);
返回浏览历史中的其他页面
go()
方法,根据当前所处的页面,加载 history
列表中的某个具体的页面。
语法:
window.history.go(number);
参数:
浏览器中,返回当前页面之前浏览过的第二个历史页面,代码如下:
window.history.go(-2);
注意:和在浏览器中单击两次后退按钮操作一样。
同理,返回当前页面之后浏览过的第三个历史页面,代码如下:
window.history.go(3);
Location对象
location
用于获取或设置窗体的URL
,并且可以用于解析URL
。
语法:
location.[属性|方法]
- location对象属性图示:
- location 对象属性:
- location 对象方法:
<script type="text/javascript">
document.write(window.location.href);
</script>
Navigator对象
Navigator
对象包含有关浏览器的信息,通常用于检测浏览器与操作系统的版本。
对象属性:
查看浏览器的名称和版本,代码如下:
<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
返回用户代理头的字符串表示(就是包括浏览器版本信息等的字符串)
语法
navigator.userAgent
几种浏览的user_agent.
,像360的兼容模式用的是IE、极速模式用的是chrom的内核。
使用userAgent
判断使用的是什么浏览器(假设使用的是IE8浏览器),代码如下:
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
对象用于获取用户的屏幕信息。
语法:
window.screen.属性
对象属性:
屏幕分辨率的高和宽
window.screen
对象包含有关用户屏幕的信息。
-
screen.height
返回屏幕分辨率的高 -
screen.width
返回屏幕分辨率的宽
注意:
- 单位以像素计。
-
window.screen
对象在编写时可以不使用window
这个前缀。
获取屏幕的高和宽,代码如下:
<script type="text/javascript">
document.write( "屏幕宽度:"+screen.width+"px<br />" );
document.write( "屏幕高度:"+screen.height+"px<br />" );
</script>
屏幕可用高和宽度
screen.availWidth
属性返回访问者屏幕的宽度,以像素计,减去界面特性,比如任务栏。screen.availHeight
属性返回访问者屏幕的高度,以像素计,减去界面特性,比如任务栏。
注意:
不同系统的任务栏默认高度不一样,及任务栏的位置可在屏幕上下左右任何位置,所以有可能可用宽度和高度不一样。
获取屏幕的可用高和宽度,代码如下:
<script type="text/javascript">
document.write("可用宽度:" + screen.availWidth);
document.write("可用高度:" + screen.availHeight);
</script>
DOM对象
认识DOM
文档对象模型DOM(Document Object Model)定义访问和处理HTML文档的标准方法。DOM 将HTML文档呈现为带有元素、属性和文本的树结构(节点树)。
先来看看下面代码:
将HTML代码分解为DOM节点层次图:
HTML文档可以说由节点构成的集合,DOM节点有:
元素节点:上图中
<html>
、<body>
、<p>
等都是元素节点,即标签。文本节点:向用户展示的内容,如
<li>...</li>
中的JavaScript
、DOM
、CSS
等文本。属性节点:元素属性,如
<a>
标签的链接属性href="http://www.imooc.com
"。
节点属性:
遍历节点树:
以上图ul为例,它的父级节点body,它的子节点3个li
,它的兄弟结点h2
、P
。
DOM操作:
注意:前两个是document
方法。
代码回顾:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>style样式</title>
</head>
<body>
<h2 id="con">I love JavaScript</H2>
<p> JavaScript使网页显示动态效果并实现与用户交互功能。</p>
<script type="text/javascript">
var object = document.getElementById("con");
object.style.color = "red";
object.style.backgroundColor = "#ccc";
object.style.display = "none";
</script>
</body>
</html>
getElementsByName()方法
返回带有指定名称的节点对象的集合。
语法:
document.getElementsByName(name)
与getElementById()
方法不同的是,通过元素的 name
属性查询元素,而不是通过 id
属性。
注意:
因为文档中的
name
属性可能不唯一,所有getElementsByName()
方法返回的是元素的数组,而不是一个元素。和数组类似也有
length
属性,可以和访问数组一样的方法来访问,从0开始。
<script type="text/javascript">
function getnum(){
var mynode=document.getElementsByName("myt");
alert(mynode.length);
}
</script>
getElementsByTagName()方法
返回带有指定标签名的节点对象的集合。返回元素的顺序是它们在文档中的顺序。
语法:
document.getElementsByTagName(Tagname)
说明:
Tagname
是标签的名称,如p
、a
、img
等标签名。和数组类似也有
length
属性,可以和访问数组一样的方法来访问,所以从0开始。
区别getElementByID,getElementsByName,getElementsByTagName
以人来举例说明,人有能标识身份的身份证,有姓名,有类别(大人、小孩、老人)等。
ID
是一个人的身份证号码,是唯一的。所以通过getElementById
获取的是指定的一个人。Name
是他的名字,可以重复。所以通过getElementsByName
获取名字相同的人集合。TagName
可看似某类,getElementsByTagName
获取相同类的人集合。如获取小孩这类人,getElementsByTagName("小孩")
。
把上面的例子转换到HTML中,如下:
<input type="checkbox" name="hobby" id="hobby1"> 音乐
input
标签就像人的类别。
name
属性就像人的姓名。
id
属性就像人的身份证。
方法总结如下:
<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>无标题文档</title>
</head>
<body>
<form>
请选择你爱好:<br>
<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"> 跑步 <br>
<input type="button" value = "全选" onclick = "checkall();">
<input type="button" value = "全不选" onclick = "clearall();">
<input type="button" value = "反选" onclick= "oppositeSelect()">
<p>请输入您要选择爱好的序号,序号为1-6:</p>
<input id="wb" name="wb" type="text" >
<input name="ok" type="button" value="确定" onclick = "checkone();">
</form>
<script type="text/javascript">
function checkall(){
var hobby = document.getElementsByTagName("input");
for(var i=0;i<hobby.length;i++){
if(hobby[i].type=="checkbox"){
hobby[i].checked=true;
}
}
//点击全选按钮 将选项全选
}
function clearall(){
var hobby = document.getElementsByName("hobby");
for(var i=0;i<hobby.length;i++){
if(hobby[i].type=="checkbox"){
hobby[i].checked=false;
}
}
//点击全不选按钮 将选项全部取消选中
}
function checkone(){
var j=document.getElementById("wb").value;
var hobby=document.getElementById("hobby"+j);
hobby.checked=true;
//根据输入的数字选中选项
}
function oppositeSelect(){
var hobby = document.getElementsByName("hobby");
for(var i=0;i<hobby.length;i++){
if(hobby[i].type=="checkbox"){
hobby[i].checked=!hobby[i].checked;
}
}
//反选
}
</script>
</body>
</html>
getAttribute()方法
通过元素节点的属性名称获取属性的值。
语法:
elementNode.getAttribute(name)
说明:
elementNode
:使用getElementById()
、getElementsByTagName()
等方法,获取到的元素节点。name
:要想查询的元素节点的属性名字
看看下面的代码,获取h1
标签的属性值:
运行结果:
h1标签的ID :alink
h1标签的title :getAttribute()获取标签的属值
setAttribute()方法
setAttribute()
方法增加一个指定名称和值的新属性,或者把一个现有的属性设定为指定的值。
语法:
elementNode.setAttribute(name,value)
说明:
name
: 要设置的属性名。value
: 要设置的属性值。
注意:
把指定的属性设置为指定的值。如果不存在具有指定名称的属性,该方法将创建一个新属性。
类似于
getAttribute()
方法,setAttribute()
方法只能通过元素节点对象调用的函数。
<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>无标题文档</title>
</head>
<body>
<p id="intro">我的课程</p>
<ul>
<li title="JS">JavaScript</li>
<li title="JQ">JQuery</li>
<li title="">HTML/CSS</li>
<li title="JAVA">JAVA</li>
<li title="">PHP</li>
</ul>
<h1>以下为li列表title的值,当title为空时,新设置值为"WEB前端技术":</h1>
<script type="text/javascript">
var Lists=document.getElementsByTagName("li");
for (var i=0; i<Lists.length;i++)
{
var text = Lists[i].getAttribute("title");
document.write(text +"<br>");
if(text=="")
{
Lists[i].setAttribute("title","WEB前端技术");
document.write(Lists[i].getAttribute("title")+"<br>");
}
}
</script>
</body>
</html>
节点属性
在文档对象模型 (DOM) 中,每个节点都是一个对象。DOM 节点有三个重要的属性 :
nodeName
: 节点的名称nodeValue
:节点的值nodeType
:节点的类型
一、nodeName
属性: 节点的名称,是只读的。
- 元素节点的
nodeName
与标签名相同 - 属性节点的
nodeName
是属性的名称 - 文本节点的
nodeName
永远是#text
- 文档节点的
nodeName
永远是#document
二、nodeValue
属性:节点的值
- 元素节点的
nodeValue
是undefined
或null
- 文本节点的
nodeValue
是文本自身 - 属性节点的
nodeValue
是属性的值
三、nodeType
属性: 节点的类型,是只读的。以下常用的几种结点类型:
元素类型 节点类型
元素 1
属性 2
文本 3
注释 8
文档 9
在<script>
的标签内容,获取所有LI标签,并输出相应节点的名称、节点的值、节点的类型:
<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>节点属性</title>
</head>
<body>
<ul>
<li>javascript</li>
<li>HTML/CSS</li>
<li>jQuery</li>
</ul>
<script type="text/javascript">
var lists=document.getElementsByTagName("li");
for(var i = 0; i<lists.length;i++){
var list = lists[i];
document.write(list.nodeName+"<br />" + list.nodeValue+"<br />" + list.nodeType+"<br />");
}
</script>
</body>
</html>
访问子节点childNodes
访问选定元素节点下的所有子节点的列表,返回的值可以看作是一个数组,他具有length
属性。
语法:
elementNode.childNodes
注意:
如果选定的节点没有子节点,则该属性返回不包含节点的 NodeList
。
看下面的代码:
运行结果:
IE:
UL子节点个数:3
节点类型:1
其它浏览器:
UL子节点个数:7
节点类型:3
注意:
IE全系列、firefox、chrome、opera、safari兼容问题
节点之间的空白符,在firefox、chrome、opera、safari浏览器是文本节点,所以IE是3,其它浏览器是7,如下图所示:
如果把代码改成这样:
<ul><li>javascript</li><li>jQuery</li><li>PHP</li></ul>
运行结果:(IE和其它浏览器结果是一样的)
UL子节点个数:3
节点类型:1
访问子节点的第一和最后项
一、firstChild
属性返回‘childNodes’
数组的第一个子节点。如果选定的节点没有子节点,则该属性返回 NULL
。
语法:
node.firstChild
说明:与elementNode.childNodes[0]
是同样的效果。
二、 lastChild
属性返回‘childNodes’
数组的最后一个子节点。如果选定的节点没有子节点,则该属性返回 NULL
。
语法:
node.lastChild
说明:与elementNode.childNodes[elementNode.childNodes.length-1]
是同样的效果。
访问父节点parentNode
获取指定节点的父节点
语法:
elementNode.parentNode
注意:父节点只能有一个。
看看下面的例子,获取 P 节点的父节点,代码如下:
<div id="text">
<p id="con"> parentNode 获取指点节点的父节点</p>
</div>
<script type="text/javascript">
var mynode= document.getElementById("con");
document.write(mynode.parentNode.nodeName);
</script>
运行结果:
parentNode 获取指点节点的父节点
DIV
访问祖节点:
elementNode.parentNode.parentNode
看看下面的代码:
<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>
运行结果:
parentNode获取指点节点的父节点
DIV
注意: 浏览器兼容问题,chrome、firefox等浏览器标签之间的空白也算是一个文本节点。
访问兄弟节点
-
nextSibling
属性可返回某个节点之后紧跟的节点(处于同一树层级中)。
语法:
nodeObject.nextSibling
说明:如果无此节点,则该属性返回 null
。
-
previousSibling
属性可返回某个节点之前紧跟的节点(处于同一树层级中)。
语法:
nodeObject.previousSibling
说明:如果无此节点,则该属性返回 null
。
注意: 两个属性获取的是节点。Internet Explorer 会忽略节点间生成的空白文本节点(例如,换行符号),而其它浏览器不会忽略。
解决问题方法:
判断节点nodeType是否为1, 如是为元素节点,跳过。
运行结果:
LI = javascript
nextsibling: LI = jquery
插入节点appendChild()
在指定节点的最后一个子节点列表之后添加一个新的子节点。
语法:
appendChild(newnode)
参数:
newnode:指定追加的节点。
代码如下:
<div id="test">
<p id="x1">HTML</p>
<p>JavaScript</p>
</div>
<script type="text/javascript">
var otest = document.getElementByI("test");
var newnode = document.createElement("p");
newnode.innerHTML = "这是一个新标签";
otest.appendChild(newnode);
</script>
运行结果:
HTML
JavaScript
This is a new p
插入节点insertBefore()
insertBefore()
方法可在已有的子节点前插入一个新的子节点。
语法:
insertBefore(newnode,node);
参数:
newnode: 要插入的新节点。
node: 指定此节点前插入节点。
我们在来看看下面代码,在指定节点前插入节点。
运行结果:
This is a new p
JavaScript
HTML
注意: otest.insertBefore(newnode,node);
也可以改为: otest.insertBefore(newnode,otest.childNodes[0]);
在script 标签内补充代码,实现创建一个新li标签,内容为"php",并将新创建的li插入到内容为HTML的标签前:
<ul id="test"><li>JavaScript</li><li>HTML</li></ul>
<script type="text/javascript">
var otest = document.getElementById("test");
var node = otest.childNodes[otest.childNodes.length - 1];
var newNode = document.createElement("li");
newNode.innerHTML = "PHP";
otest.insertBefore(newNode,node);
</script>
删除节点removeChild()
removeChild()
方法从子节点列表中删除某个节点。如删除成功,此方法可返回被删除的节点,如失败,则返回 NULL
。
语法:
nodeObject.removeChild(node)
参数:
node :必需,指定需要删除的节点。
我们来看看下面代码,删除子点。
运行结果:
HTML
删除节点的内容: javascript
注意: 把删除的子节点赋值给 x,这个子节点不在DOM树中,但是还存在内存中,可通过 x 操作。
如果要完全删除对象,给 x 赋 null 值,代码如下:
替换元素节点replaceChild()
replaceChild
实现子节点(对象)的替换。返回被替换对象的引用。
语法:
node.replaceChild (newnode,oldnew )
参数:
newnode : 必需,用于替换 oldnew 的对象。
oldnew : 必需,被 newnode 替换的对象。
我们来看看下面的代码:
效果: 将文档中的 Java 改为 JavaScript。
注意:
当 oldnode 被替换时,所有与之相关的属性内容都将被移除。
newnode 必须先被建立。
创建元素节点createElement
createElement()
方法可创建元素节点。此方法可返回一个 Element
对象。
语法:
document.createElement(tagName)
参数:
tagName:字符串值,这个字符串用来指明创建元素的类型。
注意:要与appendChild()
或 insertBefore()
方法联合使用,将元素显示在页面中。
我们来创建一个按钮,代码如下:
<script type="text/javascript">
var body = document.body;
var input = document.createElement("input");
input.type = "button";
input.value = "创建一个按钮";
body.appendChild(input);
</script>
效果:在HTML文档中,创建一个按钮。
我们也可以使用setAttribute
来设置属性,代码如下:
<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
节点。
语法:
document.createTextNode(data)
参数:
data : 字符串值,可规定此节点的文本。
我们来创建一个<div>
元素并向其中添加一条消息,代码如下:
运行结果:
浏览器窗口可视区域大小
获得浏览器窗口的尺寸(浏览器的视口,不包括工具栏和滚动条)的方法:
一、对于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 方案:
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
。
- 浏览器兼容性
var w=document.documentElement.scrollWidth
|| document.body.scrollWidth;
var h=document.documentElement.scrollHeight
|| document.body.scrollHeight;
注意:区分大小写
scrollHeight
和scrollWidth
还可获取Dom
元素中内容实际占用的高度和宽度。
网页尺寸offsetHeight
offsetHeight
和offsetWidth
,获取网页内容高度和宽度(包括滚动条等边线,会随窗口的显示大小改变)。
- 值
offsetHeight = clientHeight + 滚动条 + 边框。
- 浏览器兼容性
var w= document.documentElement.offsetWidth
|| document.body.offsetWidth;
var h= document.documentElement.offsetHeight
|| document.body.offsetHeight;
网页卷去的距离与偏移量
我们先来看看下面的图:
scrollLeft:设置或获取位于给定对象左边界与窗口中目前可见内容的最左端之间的距离 ,即左边灰色的内容。
scrollTop:设置或获取位于对象最顶端与窗口中可见内容的最顶端之间的距离 ,即上边灰色的内容。
offsetLeft:获取指定对象相对于版面或由 offsetParent
属性指定的父坐标的计算左侧位置 。
offsetTop:获取指定对象相对于版面或由 offsetParent
属性指定的父坐标的计算顶端位置 。
注意:
区分大小写
offsetParent:布局中设置postion属性(Relative、Absolute、fixed)的父容器,从最近的父节点开始,一层层向上找,直到HTML的body。