码迷,mamicode.com
首页 > 编程语言 > 详细

JavaScript学习

时间:2016-06-08 13:51:23      阅读:269      评论:0      收藏:0      [点我收藏+]

标签:

目录

js的基本介绍????5

js 技术用在什么地方?????5

js的基本介绍????5

浏览器历史????7

如何理解js是事件驱动的脚本语言????7

js的变量类型????8

js的标识符的规范????9

js的基本数据类型????9

整数????9

实数????10

特殊的数值????10

布尔类型????10

字符型????11

js的复合数据类型????11

js的特殊数据类型????11

数据类型的强制转换????12

js的运算符????12

除法????12

++ 运算????13

关系运算符????13

逻辑运算符????13

js的位运算和移位运算->面试题????14

js的流程控制????15

顺序控制????15

分支控制????15

2.1 单分支????15

2.2双分支????16

2.3?多分支????16

多分支的switch????17

js的循环控制语句????18

for语句????18

while循环控制????19

do..while循环控制????20

实际运用一下for来输出一个金字塔????21

如何调试?js代码????22

函数????23

为什么需要函数????23

js函数的分类????26

自定义函数????26

系统函数(js语句本身提供)????26

函数的调用方式????26

函数名(参数值); (通过函数名调用)????26

通过函数指针去调用????27

js的函数调用过程????28

基本调用原则:????28

函数调用:????29

js使用小结????29

js的数组的介绍????30

为什么需要数组?????30

快速入门的案例: 用数组的方法来完成 王大爷养乌龟的问题:????31

数组的基本使用????31

如何创建数组????31

如何访问数组的数据????32

数组在内存中怎样存在..????32

数组的常用的属性和函数????34

数组小结:????34

js的二维数组????34

创建二维数组????34

二维数组的理解和指定访问某个变量????35

js的排序????36

js的查找????37

顺序查找????37

二分查找????38

面向对象????39

js的面对对象编程的介绍????39

面向对象编程的引入????39

js面向对象编程的快速入门????39

js中自定义类(原型对象)的五种方法????40

工厂方法????40

通过构造函数来定义类(最多)????40

通过prototype 来定义????41

动态的添加方法和属性.????41

js中一起都是对象????41

js的对象在内存中是怎样存在?????41

js的对象回收机制!!!????42

this????42

提出问题?????42

深入认识this的含义????43

this的再认识:????43

this 只能在类定义的内部使用:????44

? 补充讲解一个 var 的知识点:(还有说..)????44

js面向对象的成员函数????45

第一种方法: 动态的给某个对象指定函数????45

第二种方法: 让所有的Person对象实例都有某个成员函数????46

一个类中也可以有私有的函数????47

第三种方式给所有的对象实例添加方法(原型法)[推荐..]????48

自定类的工厂方法(了解即可)????48

课堂小练习????49

js的闭包????49

js的变量作用域????49

js中如何解决从外部读取内部函数的局部变量->闭包????51

闭包的主要用处是????52

js中函数名不能重复????52

面向对象作业评讲????53

js面向对象的再说明????54

js的面向对象的三大特征????55

封装性????55

通过构造函数添加成员方法和通过原型法添加成员方法的区别????56

js面相对象的继承????57

多态的特性????61

js的内部类????67

js内部类的分类 如下图:????67

Math????68

Date????69

String????69

Array????70

Boolean????74

Number????74

系统函数????74

js的事件????76

事件的分类????78

不同的浏览器事件种类不一样????80

案例:防止用户通过点击鼠标右键菜单拷贝网页内容????80

dom编程的介绍????81

dom对象????82

html dom ????82

html dom编程的实例????83

bom????86

dom的层级关系????87

window对象????87

????confirm:????87

????setInterval("函数名()",调用该函数的间隔时间) clearInterval????87

????setTimeout / clearTimeout????89

????moveTo moveBy resizeTo resizeBy????90

????open 函数 该函数用于打开一个新窗口????90

history对象????91

location对象????92

navigator????92

screen对象????92

Event对象(!!!!)????93

document对象????97

常用的dom 的每个Node 节点属性和方法(加强篇)????105

body对象????106

Body案例:设置固定边栏广告!????107

案例:广告图片在网页中飘动,碰到网页边沿改变漂移方向????110

随意拖拽窗口:用户用鼠标点中,浮动窗口,可以随意的拖拽该窗口。????111

style????113

web版坦克大战(1)????114

如何去做网页层切换效果????116

display visiability 区别????120

style对象的案例:????120

style 的小案例- 简易购物车????121

forms对象集合和form对象????123

案例一:????123

案例2:验证用户注册????124

案例:文本框中自动设置鼠标光标!????125

table 对象是我们的一个重点????126

快速入门案例????126

Table对象的综合案例????128

js的正则表达式????129

正则表达式介绍????130

快速入门案例:????130

找到四个数字,个位和仟位,十位和百位相同????130

正则表达式详解????131

正则表达式对象????131

String对象的几个方法????133

综合小案例:????134

正则表达式中重要的概念????135

(1)????子表达式????135

(2)????捕获????135

(3)????反向引用????135

正则表达式语法的细节:????136

常用的正则表达式????136

电子邮件的正则表达式????137

结巴程序:????138

?

?

一、js的基本介绍

1. js 技术用在什么地方?

  1. 地图搜索
  2. 网页游戏
  3. 对用户输入校验(email ,数字,身份证,ip...)
  4. 股市网站..

?

核心一句话;js可以对网页的元素进行编程控制 . button input , image ...

,实现动态效果.

举例说明:

<html>

<meta http-equiv="content-type" content="text/html;charset=utf-8"/>

<head>

<script language="javascript" type="text/javascript">

????function test(){

????????window.alert("你点击button");

????}

</script>

</head>

<body>

<input type="button" onclick="test()"/>

</body>

</html>

2. js的基本介绍

  1. js是一种脚本语句,不能独立运行,它往往和配合别的语言使用, 比如(html/php/jsp/asp/asp.net).
  2. js 有自己的函数(系统函数,自定义函数), 变量, 有编程的控制语句(顺序,分支,循环), 但是相对说, 它的语法规范不是特别严格.
  3. js是解释执行语言

?

js源码 ->直接被执行(js引擎[内嵌到浏览器])

?

编译语句

java->.class->执行.class

c->目标文件->执行

?

  1. js可以对网页元素编程,可以改变网页某个元素的外观

?

技术分享

?

  1. js是用于bs开发.

    ?

  2. js是客户端技术,它运行在客户端的浏览器

示意图:!!这个很重要!!!

?

技术分享

?

小插曲

livescript -> (netscape和sun 合作)->javascript [java 和 javascript 没有任何关系]

jscript 是微软的产品,但是它和 javascript 语法规范一致.

请注意: 因为浏览器的差异,可能有这样问题,在ie中运行正常的js脚本,在ff中运行不正常.[应当在不同的浏览器中去测试是否ok 浏览器兼容.] 解决这个问题的简单方法是: 尽量使用js通用的函数.

3. 浏览器历史

技术分享

?

? 如何去自己查询js的手册

w3school

jscript

?

  1. 如何理解js是事件驱动的脚本语言

事件发生(用户做某个操作)---[驱动]---->函数的调用

我们的js程序

hello,world

?

<html>

<head>

<meta http-equiv="content-type" content="text/html;charset=utf-8"/>

<script language="javascript">

????//跳出对话框 php 调用某个方法是 对象名->方法

????//js 中 对象名.方法

????//window是js语句的dom对象,无需创建,可以直接使用

????window.alert("hellow,wrold1");

</script>

</head>

?

<body>

<script language="javascript">

????//跳出对话框 php 调用某个方法是 对象名->方法

????//js 中 对象名.方法

????//window是js语句的dom对象,无需创建,可以直接使用

????window.alert("hellow,wrold2");

</script>

?

</body>

?

总结: 1. js码可以放在 html/php 页面的任何地方,js码是从上到下依次执行.

?

嵌入一段 js码

<script language="javascipt" type="text/javascript">

????//js码

</script>

对hello,world 程序改进,改为一个简单加法运算:

<html>

<head>

<meta http-equiv="content-type" content="text/html;charset=utf-8"/>

<script language="javascript">

????//跳出对话框 php 调用某个方法是 对象名->方法

????//js 中 对象名.方法

????//window是js语句的dom对象,无需创建,可以直接使用

????//如何在js中定义变量.

????var num1=4; //我定义了一个变量 名字叫 num1,同时赋值 4

????var num2=78; //我定义了一个变量 名字叫 num1,同时赋值 78

????var res=num1+num2;

????

????window.alert("hellow,wrold1 res="+res);

</script>

</head>

<body>

</body>

  1. js的变量类型

变量类型是由js引擎决定,如果要查看某个变量的类型,则可以使用typeof运算符

?

//js变量的类型是由js引擎来决定的.

????var name="shunping";

????//可以通过 typeof 来查看

????window.alert("name的类型是"+ typeof name);

????name=123;

????//可以通过 typeof 来查看

????window.alert("name的类型是"+ typeof name);

  1. js的标识符的规范

  1. 变量/函数 取名不要使用 js的保留关键字

技术分享

同时变量名不要用数字开头.

?

  1. js的变量是区分大小写的

????var a=90;

????var A=89;

????//如果一个方法是属于window 对象,则可以不带window.而直接使用

????alert(a);

????alert(A);

?

如果你不小心,定义了两个同名的变量,则后面的覆盖的前面的变量.

?

  1. js的注释

单行用 //

多行用 /* */

二、js的基本数据类型

js 的数据类型有

基本数据类型[1. 整数 2. 实数 3. bool 4. 字串]

复合数据类型[1. 数组 2.对象]

特殊数据类型[1. null 2. undefined]

1.整数

<script type="text/javascript">

?

????var n1=0x8a;

????var n2=0010123;

????var n3=1234;

????alert(n2);

?

</script>

  1. 实数

实数就是小数,这个就不举例说明

  1. 特殊的数值

NaN = not a number 如果提示错误说明,你的js代码中把一个变量错误的当做一个数值来使用.

Infinity = 无穷大

举例:

var s="abc";

????

????//parseInt() 函数是js的全局函数,可以直接使用

????//在哪里查询

????window.alert(parseInt(s)); //结果为: NaN

????window.alert(70/0); // 结果为:Infinity

?

在js中提供了两个函数来判断是不是一个NaN 和 intinity

?

isNaN(判断是不是一个数) isIninity

//正则表达式

????var s="000.000123";

?

????if(isNaN(s)){

????????alert("不是数"); //不是一个数,就会返回一个 true

????}else{

????????alert("是数"); //是一个数字,就会返回一个 false

????}

  1. 布尔类型

布尔类型表示真和假

在js中 表示 假有如下:

  • false, 0, "", null , undefined、NaN

?

其它的表示真

代码:

var a=100;

?

????if(a){

????????alert("真");

????}else{

????????alert("假");

????}

?

ajax

????var obj1=获取对象;

????if(!obj1){

????alert("对象创建失败");

}

  1. 字符型

字符串的基本用法:

?

var str="aaaaaaa";

var str2=‘aakflaskf;lsakf;lsa‘;

?

如果我们希望在字符串中有包含特殊字符,比如 ‘ " 换行。。。考虑使用转义符

\, 用于转义的还有:

?

字符串中的特殊字符,需要以反斜杠(\)后跟一个普通字符来表示,例如:\r、\n、\t、\b、\‘、\ " 、\\xxx

  1. js的复合数据类型

  • 数组
  • 对象
  1. js的特殊数据类型

  • null 空
  • undefined 未定义
  1. 数据类型的强制转换

js中提供了两个函数可以把字符串强制转成数

parseInt(num1) //将一个数转换成 int类型

parseFloat(num2) //将一个数转换成 float 类型

?

? 如果我把 123 当做字符串.

?

案例如下: 让用户输入两个数,并计算和.

var num1=window.prompt("请输入一个数");

var num2=window.prompt("请输第二个数");

var res=parseFloat(num1)+parseFloat(num2);//php . 字符串拼接 + 表示运算

????alert("结果是="+res);

?

????var num3=123;

?

????var str="hello"+num3;

?

alert(str);

三、js的运算符

+ 、-、* 、 / 、%(取模,就是计算两个数整除的余数)

1.除法

注意我们的js对除不尽的数,保留精度是17位.可以自己想办法保留小数位数

?

自己写函数

?

var num1=7;

var num2=3;

?

var res=num1/num2;

res=res+"";

//window.alert(typeof res);

//alert(res);//看出 小数保留精度是17位.如果你要到第二位. 用substring方法。采用字符串截断。

?

//把res当做一个字符串,看找到小数点在第几位.

?

var index=res.indexOf(".");

window.alert("保留小数两位是"+res.substring(0,index+3));

?

使用Number对象的方法

?

toFixed();

?

????alert(res.toFixed(6));

?

我们为了更好的管理js文件,可以把js文件 写在一个独立的文件中,然后再需要的使用引入即可

<script src="js文件路径"></script>

2. ++ 和 – 运算

var a=56;

var b=a++;// b=a; a=a+1;

window.alert(b);

window.alert(a);

?

如果是 var b=++a; 《==》 [a=a+1; var b=a;]

var b=a++; <==> var b=a; a=a+1;

3. 关系运算符

>= <= > < != = = = != =

?

案例:

var val = window.prompt("请输入一个数字");

document.writeln("你输入的数字为:"+val);

4. 逻辑运算符

&& 与????|| 或????! 非

?

说明:在逻辑运算符中,0、""、false 、null、undefined 、NaN 均表示假

?

var val=表达式1 && 表达式2;

说明只要 表达式1为真 并且 表达式2为真,结果为真.

说明: 如果第一个表达式为假,第二个表达式就不执行.[考点]

?

var num1=6;

var num2=5;

?

if(num1>num2&& (++num2)){

????

}

window.alert(num2);

?

var res=表达式1 || 表达式2

?

解疑:在js 中 || 究竟返回什么?

答:(1)将返回第一个不为 false 的那个值(对象也可以),

(2)如果全部都是 false 的 话,就返回最后一个值

说明 表达式1为真,或者 表达式2为真,结果为真.

如果表达式1为真,第二个表达式就不执行.

?

! 非

?

var res=!表达式;

?

如果表达式为真,结果为假,

如果表达式为假,结果为真.

?

关于 || 的特殊说明

?

var a=0||0||"a"||0;

window.alert(a);

?

说: 如果 || 有为真的值,就会返回第一个为真的值, 如果都为假,就返回最后的值.

5.js的位运算和移位运算->面试题

& 按位与 (两位都是1,结果1)

| 按位或 (只要有一个为1,结果1)

^ 按位异或 (一个为1,一个为0,结果1)

?

var res=4&5; ==>

?

补码 :

00000000 00000100

00000000 00000101

00000000 00000100

?

>> 右移运算

<< 左移运算

>>> 无符号右移运算.

5>>2

?

00000000 00000101

00000000 00000001

?

window.alert(-5>>>2);

?

5的补码

00000000 00000101

-5的补码

?

5原码->5的反码->5的补码

?

原码 10000000 00000000 00000000 00000101

反码 11111111 11111111 11111111 11111010

补码 11111111 11111111 11111111 11111011

1001111111 11111111 11111111 111110 ->补码->原码

?

四、js的流程控制

1 . 顺序控制

2. 分支控制

单分支( if)

双分支( if .. else..)

多分支(

if(){

}else if(){

}else if(){

}else{

}

?

switch(){

case 常量/变量:

????语句;

????break;

...

defulat:

????语句;

}

?

2.1 单分支

基本用法

if(条件表达式){

????//为真,进入

}

?

var age=34;

????if(age>18){

????????

????????//提示,在页面上输出一句话

????????document.write("age>18");

????}

2.2双分支

基本用法

if(条件表达式..){

????//如果真.

}else {

????//如果假..

}

var age=34;

????if(age>18){

????????document.write("对自己行为负责");

????}else{

????????document.write("放过你");

????}

2.3?多分支

if(条件表达式){

}else if(条件表达式2){

}else if(条件表达式){

}

else{

}

?

说明: 1. else if 可以有多个.

2. else 语句可有可无.

3. 多分支语句只能有一个入口。

代码:

?

????var age=12;

?

????if(age>18){

????????document.write(">18");

????}else if(age>10 && age<=18){

????????document.write("送入少管所");

????}else {

????????document.write("下次注意");

????}

?

2.4 多分支的switch

基本用法是

?

switch(表达式){

????case 常量/变量 :

//语句

????????break;

????case 常量/变量 :

???? //语句

????????break;

????defulat :

????????//语句

}

?

注意swtich相当灵活.

  • 表达式的结果 类型可以是 string , number, boolean ,对象.. array.
  • case 后面可以是常量,可以是变量.
  • 如果case后没有break,那么当程序执行某个case块,时,就会一直执行,直到碰到一个break语句,才会跳出switch
  • defual语句可以放在swith任何位置,当一个条件都匹配不到,就会执行default,直到碰到一个break语句,或者switch执行完毕.
  • switch 和 if else if 的区别. 如果是针对几个固定条件的判断,则使用switch ,如果范围的判断,我们使用 if ....else if....

?

/*请编写一个程序,可以接收一个字符串,比如: a,b,c,d,e,f,g a表示星期一,b表示星期二 … 根据用户的输入显示相依的信息.要求使用

?

switch 语句完成

?

????*/

????//string,number,boolean, 对象,array

????//var str=1; //true->1 2 (1,2->true)

?

????//var obj=new Object();

????//var obj2=obj;

?

????var arr1=new Array("1","2");

????var arr2=arr1;

????switch(arr1){

????????case arr2:

????????????document.write("星期一,猴子穿新衣");

???????????? break;

????????case false:

????????????document.write("星期二,猴子当小二");

???????????? break;

????????default:

????????????document.write("猴子休息...");

????????????break;

????}

?

五、js的循环控制语句

1. for语句

for(初始化变量;循环条件的判断;步长的变化){

????//语句

}

while

while(循环条件){

????//语句

????//步长的变化

}

do..while

do{

????//语句

????//步长

}while(循环条件)

?

需求:(为什么需要循环语句)

->使用循环控制的语句来处理循环的需求

?

  1. for 的基本用法

for(初始化; 条件判断; 控制变量变化){

????

????//for循环语句;

}

?

? 1. 初始化条件可以放在for 代码前.

2. 条件判断 可以是组合的 (i>10 && i<50 ...)

3. 控制变量变化 的部分可以放在 for循环体.

快速入门:

?

编写一个程序, 可以打印9000000句

"你好,我是刘德华同志!"。请大家想想怎么做?

?

代码 :

????for(var i=0;i<10;i++){

???? ?

????????document.write("hello,wrold!"+i+"<br/>");

????}

?

技术分享

2. while循环控制

基本用法:

?

while(循环条件){

//循环的代码

}

?

快速入门案例:

我们用 while来实现 输出10句 hello,world

?

var i=0;

????while(i<10){

????????document.write("hello,world"+i);

????????i++;

????}

流程图 :

技术分享

3. do..while循环控制

基本用法:

?

do{

????//语句..

//....

}while(循环条件);

?

说明: 1. 语句部分可以是多条.

2. 循环条件可以是一个组合条件 比如: i>10 && i<30

?

快速入门:

?

把上面的要求用do...while循环一把.

?

?

  1. 实际运用一下for来输出一个金字塔

技术分享

?

提示: 如果将来难题?

?

思路简化:输出一半的金字塔

<html>

<head>

<meta http-equiv="content-type" content="text/html;charset=gb2312"/>

<script type="text/javascript">

?

????//输出一半金字塔

????/*

????????* 1->一个*

????????** 2->2个*

????????***

????????****

????????*****

?

???????? ????* 1->1* (1-1)*2+1=1 空格 2 总层数-当前层数=3-1=2

???????? *** 2->3* (2-1)*2+1=3 空格 1 总层数-当前层数=3-2=1

***** 3->5* (3-1)*2+1=5 空格 0 总层数-当前层数=3-3=0

?

???????? 空心 分析

???????? * 第一层 输出*

* * 中间层: 只输出两边的*,空间输出空格 思路---->代码

????????***** 最后一层 输出输出*

????????

???????? 菱形

???????? *

***

*****

???????? ***

???????? *

?

????*/

?

????//n变量表示层数

????var n=10;

????for(var i=1;i<=n;i++){

????????

????????//输出空格

????????for(var k=1;k<=n-i;k++){

????????????document.write("&nbsp;");

????????}

????????for(var j=1;j<=(i-1)*2+1;j++){

???????? //这里需要思考,什么时候输出*,什么时候输出空格

????????????if(i==1 || i==n){

????????????????document.write("*");

????????????}else{

????????????????//中间层..

????????????????if(j==1 || j==(i-1)*2+1){

????????????????????document.write("*");

????????????????}else{

????????????????????document.write("&nbsp;")

????????????????}

????????????}

????????}

????????document.write("<br/>");

????}

</script>

</head>

<html>

?

上课课堂练习:

?

1.请使用

while

do..while 来改写

输出金字塔的案例:

2.接收一个整数,可以输出对应的菱形. , 再看看能不能输出空心菱形

六、如何调试?js代码

ie中如何调试js, ie 8 中自带调试工具

?

调式步骤:

  1. 先打开开发人员工具->脚本
  2. 下断点 –》点击启动调试
  3. 刷新页面,进入调试状态
  4. ?

f11->一行一行执行

f10-> 跳过一个函数继续执行(相当于把一个函数当做一个语句执行)

shift+f11->跳出函数

通过逐行调试,我们可以看到局部变量变化情况.

?

?

注意: 取消断点

技术分享

?

最原始的方法 ,通过 window.alert(信息); document.write("信息");

?

如何处理js的bug

js 代码发生错误,如何定位其错误呢?

  • 可以通过程序员的经验来判断
  • window.alert() 来输出信息
  • 使用firebug 的 调式用具 [cy--5,浏览器对象模型BOM]

?

?

七、函数

1. 为什么需要函数

看一个实际的需求:

?

输入两个数,再输入一个运算符(+,-,*,/),得到结果.

?

<html>

<head>

<meta http-equiv="content-type" content="text/html;charset=utf-8"/>

<script type="text/javascript">

????var num1=window.prompt("请输入一个数");

????var num2=window.prompt("请输入2个数");

????var oper=window.prompt("输入运算符号");

????//把num1, num2转成float

????num1=parseFloat(num1);

????num2=parseFloat(num2);

????var res=0;

????switch(oper){

????????case "+":

????????res=num1+num2;

????????break;

????????case "-":

????????res=num1-num2;

????????break;

????????case "*":

????????res=num1*num2;

????????break;

????????case "/":

????????res=num1/num2;

????????break;

????????default:

????????window.alert("输入的运算符号错误");

????}

????window.alert("res="+res);

</script>

</html>

?

如果我们在a.html, b.html, c.html我们都需要做这个计算.

?

技术分享

用代码来实现,上面的分析:

?

  1. 写一个js文件,在该文件中封装函数
  2. 在需要的地方引入js文件即可.

比如在a.html中使用

<script type="text/javascript" src="js文件路径"></script>

?

代码:

?

funs.js码

?

//必然需要传入参数[num1,num2,oper]

function jiSuan(num1,num2,oper){

????

????//把num1, num2转成float

????num1=parseFloat(num1);

????num2=parseFloat(num2);

????var res=0;

????switch(oper){

????????case "+":

????????res=num1+num2;

????????break;

????????case "-":

????????res=num1-num2;

????????break;

????????case "*":

????????res=num1*num2;

????????break;

????????case "/":

????????res=num1/num2;

????????break;

????????default:

????????window.alert("输入的运算符号错误");

????}

????//return 语句表示返回? 返回给哪个!(谁调用就返回给谁)

????return res;

}

?

a.html:

?

<html>

<head>

<meta http-equiv="content-type" content="text/html;charset=utf-8"/>

<!--在使用函数前,引入js文件-->

<script type="text/javascript" src="funs.js"></script>

<script type="text/javascript">

?

????

????var num1=window.prompt("请输入一个数");

????var num2=window.prompt("请输入2个数");

?

????var oper=window.prompt("输入运算符号");

?

????????

????window.alert("res="+jiSuan(num1,num2,oper));

?

</script>

?

</html>

?

  1. js函数的分类

2.1 自定义函数

  1. 基本用法是:

?

function 函数名(参数列表){

????//语句

????//return 语句

}

?

说明:

  • 函数的规范问题, 可以用字母开头, 不要用数字开头. 可以包括字母/数字/_/$
  • 参数列表可以多个(js支持可变参数)
  • return 语句可以有,也可以没有. 最多只能有一个return

?

2.2 系统函数(js语句本身提供)

  1. 函数的调用方式

3.1 函数名(参数值); (通过函数名调用)

function test(val){

????window.alert(val);

}

?

test("hello");

?

3.2 通过函数指针去调用

基本用法

?

var 变量=函数名; 变量(参数列表);

?

代码

function test(num1,num2){

????????

????????return num1+num2;

????}

????//window.alert(test);

????//下面的话,相当于把test的函数指针,赋给了my这个变量.

????//因此my也执行test函数的代码

????var my=test;

????window.alert(my); //直接把这个函数的代码打印出来啦

var res=my(67,90);

????window.alert("00"+res);

?

特别说明:

  • 如果一个函数有返回值,你可以接收后再使用,也可以直接使用.
  • 如果一个函数没有返回值,但是你却使用,则会提示 undefined错误;
  1. js的函数调用过程

4.1 基本调用原则:

技术分享

一个测试题,加深大家对函数调用机制理解

function abc(num1){

if(num1>3){

abc(--num1);

}

document.writeln(num1);

}

abc(5);

?

执行的结果是:

3 3 4

分析图是:

技术分享

4.2函数调用:

使用递归的方法来计算 n!

?

//非递归

?

function test1(n){

????

????var res=1;

????for(var i=1;i<=n;i++){

????res*=i;

}

}

?

//递归-》递归的条件

function test2(n){

????if(n==1){

????return 1;

}else{

????return test2(n-1)*n;

}

}

?

?

使用递归的方法计算 f(n)=2*f(n-1)+3 , 已知 f(1)=1;

f(3000)

编写一个函数,接收n,计算其值.

?

function fun1(n){

????if(n==1){

????return 1;

}else{

????return 2*fun1(n-1)+3;

}

}

?

4.3 js使用小结

①函数的参数列表可以是多个

  1. 参数列表可以是多个,并且数据类型可以是任意的类型
  2. js函数支持可变参数
  3. 在js 中 arguments.length,可以访问所有传入函数的值

?

代码:

function test4(){

???? ?

????????//window.alert(arguments.length);

????????var res=0;

????????for(var i=0;i<arguments.length;i++){ //遍历所有传入函数的参数的值

????????????//document.write(arguments[i]+"--");

????????????res+=arguments[i];

????????}

????????return res;

????}

?

????//需求我希望test4函数可以计算我给出的数的结果和(但是我给的参数个数不确定)

?

????document.write(test4(45,89,90,78.8));

?

通过这段代码,我们可以得出这样的结论: 在同一个作用域(在同一个页面) js函数是不能有重复名字, 同时我们也知道 js 函数不支持函数的重载.

?

?

八、js的数组的介绍

1. 为什么需要数组?

问题:

王大爷有6只乌龟,它们的体重分别是3kg,5kg,1kg,

???????? 3.4kg,2kg,50kg 。请问这六只乌龟的总体重是少?????????平均体重是多少? 请你用现在掌握的技术编一个程序解决

?

<script>

?

var weight1=3;

var weight2=5;

....

...

var total=weight1+weight2+...+weight6;

?

var average=total/6;

?

</script>

我们需要这样一种数据类型,它可以帮助我们管理一组数据.->数组.

?

2.快速入门的案例: 用数组的方法来完成 王大爷养乌龟的问题:

<html>

<head>

<meta http-equiv="content-type" content="text/html;charset=utf-8"/>

?

<script type="text/javascript">

????//创建一个数组

????var arr1=[3,5,10,34.8,50,10];

????//说明,数组的下标是从[0]

?

????//window.alert(typeof arr1);

????//通过对象名.constructor 可以显示该对象的构造方法是什么?

????//window.alert(arr1.constructor);

????//遍历我们的数组

????var total_weight=0;

????for(var i=0;i<arr1.length;i++){

????????//document.write("<br/>"+arr1[i]);

????????total_weight+=arr1[i];

????}

?

????document.write("总体重是="+total_weight+" 平均体重="+(total_weight/arr1.length).toFixed(2));

// toFixed(2) 可以指定保留小数后几位数字,当前是保留2位

</script>

</html>

?

3.数组的基本使用

  1. 如何创建数组

方法1

var arr=[元素1,元素2......] 其实也可以这样创建空数组 var arr=[];

?

元素的个数可以任意,元素的类型可以任意,

?

方法2.

?

var arr=new Array();

?

3.2 如何访问数组的数据

  1. 指定访问某个元素

数组名[下标号], 下标号默认是从0 开始编号.

?

  1. 遍历数组

for(var i=0;i<数组.length;i++){

????数组[i];

}

for(var key in 数组){

????数组[key];

}

?

?

? 如果下标越界会怎样?

?

报 undefine

?

? js的数组是否能够动态的增长

?

????????????????????var a=[2,3];

????????????????????a[2]=56;

????????????????????alert(a[2]);

?

说明js的数组可以动态增长.

?

?

3.3 数组在内存中怎样存在..

php程序中,通过一个函数传递数组,是值传递,还是引用传递?

?

结论是默认是值传递(拷贝.)

?

js代码中,通过一个函数传递数组,是引用传递

?

function test2(val){

????????//val[0] 访问第一个元素.

????????val[0]=900;

????}

?

????arr=[1,2,3];

?

????//调用函数

????test2(arr);

????

????for(var i=0;i<arr.length;i++){

????????document.write("*****"+arr[i]);

????}

输出是 900*****2****3

?

?

画图说明;

?

通过下面的代码,我们来说明js的数组是怎样存在内存的:

function test2(val){

//val[0] 访问第一个元素.

val[0]=900;

}

?

arr=[1,2,3];【1】

?

//调用函数

test2(arr);

?

for(var i=0;i<arr.length;i++){

document.write("*****"+arr[i]);

}

?

分析图:

技术分享

?

3.4 数组的常用的属性和函数

  1. length 属性可以返回该数组的大小(遍历)
  2. split 函数,可以拆分字符串.

var str="abc hello boy";

????????var arr=str.split(" ");

?

????????document.write(arr+ arr.length);

3.5 数组小结:

①数组可存放任意类型的数据

  1. 数组大小不必事先指定,可以动态增长
  2. 数组名可以理解为指向数组首地址的引用.
  3. 数组元素默认从0开始编号的.

?

?

九、js的二维数组

var arr1=[元素1,元素2..]

?

如果我们的元素又是一个数组,则这个一维数组就成了二维数组.

?

?

1.创建二维数组

举例

var arr=[[1,4,90],[4,‘hello‘]];

?

????//如何遍历我们的二维数组

????for(var i=0;i<arr.length;i++){

????????

????????var ele=arr[i];

????????

????????//window.alert(ele.constructor);

?

????????//对ele进行遍历

????????for(var j=0;j<ele.length;j++){

????????

????????????????window.alert(ele[j]);

????????}

?

????}

2.二维数组的理解和指定访问某个变量

技术分享

?

?

测试题:

?

/*

????0 0 0 0 0 0

????0 0 1 0 0 0????

????0 2 0 3 0 0

????0 0 0 0 0 0

?

*/

?

//定义二维数组

????var arr2=[[0,0,0,0,0,0],[0,0,1,0,0,0],[0,2,0,3,0,0],[0,0,0,0,0,0]];

?

?

????for(var i=0;i<arr2.length;i++){

????????

????????var size=arr2[i].length;

????????for(var j=0;j<size;j++){

????????????

????????????document.write(arr2[i][j]+"&nbsp;");

????????}

????????document.write("<br/>");

????}

?

//

var arr=new Array();

arr[0][0]=1;

?

?

思考题:

请编写一个函数,可以接收一个数组,然后要求把这个二维数组转置:

,所谓转置就是行列数据互换

课堂练习

function reverse(arr1){

????//...

}

  • js的排序

我们这里只介绍一下冒泡排序法:[其它方法可以参考 php 的排序章节]

技术分享

?

代码:

<html>

<head>

<meta http-equiv="content-type" content="text/html;charset=utf-8"/>

?

<script type="text/javascript">

?

????var arr=[0,-1,90,-18,900,90,78];

????var flag=false; //定义标志位

????var temp=0;

????for(var i=0;i<arr.length-1;i++)

????{

//定小循环

for(var j=0;j<arr.length-1-i;j++){

?

if(arr[j]>arr[j+1]){

//交换

temp=arr[j];

arr[j]=arr[j+1];

arr[j+1]=temp;

???????? flag=true;

}

}

if(flag){

????????flag = false;

}else{

????????break;

}

}

?

//输出数组

document.write(arr);

?

</script>

</html>

十一、js的查找

1.顺序查找

一个一个的比较,如果是则查找到.

?

var arr=[3,5,90,12,-23];

?

var findVal=90;

var flag=false;

for(var i=0;i<arr.length;i++){

???? ?

???? if(arr[i]= = findVal){

????document.write("找到了这个数 下标是"+i);

????flag=true;

}

}

?

if(!flag){

????document.write("一个都没有找到");

}

?

2.二分查找

面试题: 一定掌握!

?

//二分查找[递归]

?

????//二分查找要保证我们的数组是一个有序的.

????//思想是

????//首先把数组的中间这个数找出,然后和你要查询的数比较

????//① 你要查询的数比中间的数大. 则说明我们应当该数组的右边[后边]查询

????//② 你要查询的数比中间的数小 .则说明我们应当该数组的左边[前边]查询

????//③ 你要查询的数等于中间的数, 说明找到

?

????var arr=[1,90,100,123,4000];

//该函数的参数列表为:需要查找的值、被查找的数组、数组的起始下标,结束下标

????function binarySearch(findVal,arr,leftIndex,rightIndex){

????????

?

????????//退出条件,如果左边下标 > 右边下标

????????if(rightIndex<leftIndex){

????????????document.write("查询没有结果");

????????????return;

????????}

?

????????//代码:

????????//找到中间数的下标

????????var midIndex=Math.floor((leftIndex+rightIndex)/2);

?

????????if(arr[midIndex]<findVal){

????????????//在右边进行查找

????????????binarySearch(findVal,arr,midIndex+1,rightIndex);

????????}else if(arr[midIndex]>findVal){

????????????//在左边进行查找

???????? binarySearch(findVal,arr,leftIndex,midIndex-1);

????????}else{

????????????//如果找到,则输出该数下标,并结束函数

????????????document.write("找到 下标是"+midIndex);

????????????return;

????????}

?

????}

?

????//调用的格式

????binarySearch(100,arr,0,arr.length-1);

十二、面向对象

1.js的面对对象编程的介绍

js是一种支持面向对象编程的脚本语句, 它有继承,封装,多态的特点

基于对象编程和面向对象编程叫法区分

js 中我们可以认为这个叫法一致.

?

课程中 基于对象= =面向对象 类==原型对象

2.面向对象编程的引入

一个问题?

张老太养了两只猫猫:一只名字叫小白,今年3岁,白色。

???????? 还有一只叫小花,今年10岁,花色。请编写一个程序,

???????? 当用户输入小猫的名字时,就显示该猫的名字,年龄,

???????? 颜色。如果用户输入的小猫名错误,则显示 张老太没

???????? 有这只猫猫。

?

3.js面向对象编程的快速入门

<html>

<head>

<meta http-equiv="content-type" content="text/html;charset=utf-8"/>

?

<script type="text/javascript">

?

????//定义了一个猫类

????function Cat(){

????????

????}

????//创建一只猫 [js对象的属性可以动态增加]

????var cat1=new Cat(); //cat1就是一个对象实例

????cat1.name="小白"; //

????cat1.age=3;

????cat1.color="白色"

?

????document.write(cat1.name+"--"+cat1.age+"--"+cat1.color);

?

????

????//特别说明

????// var cat1=new Cat(); //当做类(原型对象使用),这时cat1就是一个对象(实例)

????// Cat(); //当做函数

</script>

?

</html>

?

?

对象公开属性的访问方式有

对象名.属性名;

对象名[‘属性名‘];

?

4.js中自定义类(原型对象)的五种方法

4.1工厂方法

var obj=new Object();

obj.属性="aa";

obj.show=function (){

};

?

4.2通过构造函数来定义类(最多)

function 类名/函数名(){

?

}

?

var p=new 类名/函数名(); //

函数名();

?

4.3通过prototype 来定义

4.4 构造函数及原型混合方式

4.5 动态原型方式

5.动态的添加方法和属性.

  • 构造函数 和 prototype混合
  • 动态创建对象模式

?

6.js中一切都是对象

基本对象/系统内置对象(Number,String,Boolean..)

?

var i=0;

?

????window.alert(i.constructor);

?

????function Person(){

????}

????

????var p1=new Person();

?

????window.alert(p1.constructor);

?

????window.alert(Person.constructor);

????window.alert(Function.constructor);

?

?

可用通过 instanceof 来 判断某个对象实例是不是某个类的对象实例,

案例:

//如何判断一个对象实例是不是某个 类(原型对象)

?

????if(p1 instanceof Dog){

????????

????????window.alert("p1是Person一个对象实例");

????}else{

????????window.alert("p1是Dog一个对象实例");

????}

?

7.js的对象在内存中是怎样存在?

var a=new Person();

a.age=10;

a.name="小明";

var b=a;

8.js的对象回收机制!!!

在js中维护一张对象对用表:

GC 如何去判断某个对象是垃圾对象.

?

技术分享

?

当对象的地址被引用的次数,变成0, 则gc 就会认为该对象是垃圾,就会回收.

?

?

js中还提供了一种主动销毁对象属性的方法

?

基本语法是

?

delete 对象名.属性名; // 不能直接 delete 对象;

?

原理可以主动的销毁某个对象的属性

?

9.this

9.1提出问题?

我们在编程中,可能需要当我们创建一个对象后,这个对象就自动的有某些属性,怎么?

?

可以这样做:

function Person(){

????????//下面这句话表示,每创建一个Person实例,实例就会自动有一个属性

????????//name,并且是公开

????????this.name="小童";

????}

?

如果你希望name是创建对象实例的时候指定,可以通过参数传入:

?

function Person(name){

????????//下面这句话表示,每创建一个Person实例,实例就会自动有一个属性

????????//name,并且是公开

????????this.name=name;

????}

?

使用的时候:

?

$p4=new Person("顺平");

?

$p4.name;

?

9.2深入认识this的含义

//下面的代码讲解私有属性的怎样访问

?

????????function Person(){

????????????var name="abc"; //私有的,只能在内部使用

????????????var age=900; //私有的,只能在内部使用

?

????????????//感受(相当于你是通过内部函数来访问私有的变量.)

????????????//如何理解: 说有一个属性 show 因为前面有this

????????????//说明 show属性是公开. 该属性是指向一个函数地址属性.

????????????//则通过 show去调用该函数.

????????????this.show=function(){ //如果你一定要访问私有属性,则需要定义一个公开的方法(特权方法)

????????????????window.alert(name+" "+age);

????????????}

????????????function show2(){//这是Person类的一个私有方法,只能在Person类的内部使用

????????????????window.alert("show2()" + name + " " + age);

????????????}

?

????????}

????????var p1=new Person();

????????//window.alert(p1.name+" "+p1.age);//错误

????????p1.show();

????????p1.show2(); //这里会报错!

9.3对this的再认识:

<html>

<head>

<meta http-equiv="content-type" content="text/html;charset=utf-8"/>

?

<script type="text/javascript">

//****案例如下****

function test1(){

?

alert(this.v);

}

var v=190;

test1(); //输出什么 <==> window.test1();

?

window.test1();

</script>

</html>

?

  1. this 只能在类定义的内部使用:

//说明this 只能在 类定义的内部使用

?

????????function Dog(){

????????????this.name="小明";

????????}

?

????????var dog1=new Dog();

???? ?

????

window.alert(this.name); //报空, 因为这样使用,相当于去访问window对象的name属性,但是你没有写.

?

?

9.5 ? 补充讲解一个 var 的知识点:(还有说..)

?

//表示全局变量

????var t=90;

?

????function test(){

????????

????????t=890;

????}

?

????test();

????window.alert(t);

?

说明: var 变量: 表示该变量是全局的, 如果你其他函数中,使用变量是,前面没有带 var , 则表示要使用全局变量. 如果你在函数中 使用变量时候,带了 var 则说明你要使用全新的变量.

?

10.js面向对象的成员函数

如果我们希望某个对象创建后,自动有方法使用,可以在定义类的时候,直接指定成员函数.(细节...)

说明:函数调用,只看函数名称、不看函数的参数

10.1第一种方法: 动态的给某个对象指定函数

*/

?

????????function Person(name,age){

????????????this.name=name;

????????????this.age=age;

????????}

?

????????//第一种方法,动态添加

????????function speak(){

????????????document.write("我是"+this.name);

????????}

?

????????//创建一个对象实例

????????var p1=new Person("大黄",90);

????????p1.fun1=speak; //相当于动态的给p1对象分配一个fun1属性(函数);

你可以理解, fun1 是 speak函数别名

???? ?

?

????????window.alert(p1.fun1);

????????p1.fun1();

????????speak(); //window

?

第一种方法还有一种体现形式

//创建一个对象实例

????????var p1=new Person("大黄",90);

????????p1.fun1=function speak(){

????????????document.write("我是"+this.name);

????????}; //相当于动态的给p1对象分配一个fun1属性(函数);

????

?

10.2第二种方法: 让所有的Person对象实例都有某个成员函数

//给所有对象分配函数

?

????????function Person(name,age){

????????????

????????????this.name=name;

????????????this.age=age;

?

????????????this.speak=function (){

????????????????document.write(this.name+"hello");

????????????}

????????}

?

????????var p1=new Person("小孩",9);

????????p1.speak();

????????var p2=new Person("大明",30);

????????p2.speak();

?

? 关于给对象指定成员函数说明:

如果添加的内部函数,该函数也称为特权函数, 所谓特权指的是可以访问对象的私有属性.

?

如果添加的是外部函数(给某个对象指定的函数),则这样指定函数,只能访问对象的公开属性,不能访问私有属性.

?

function Person(name,age,salary){

????????

????????this.name=name;//公开

????????this.age=age;//公开

????????var salary=salary;//私有

?

?

????}

?

????var p1=new Person("宋江",34,1000);

?

????function showInfo(){

????????document.write(this.name+this.age+salary);//这里salary是私有

????}

?

????p1.showInfo=showInfo;

?

????p1.showInfo();

?

?

?

  • 一个类中可以有公开的函数

this.属性=funciton (){};

10.3一个类中也可以有私有的函数

代码:

function Person(){

????????????

????????????this.name="abc";

????????????var salary=900;

????????????this.fun1=function (){

????????????

????????????????//代码

????????????????sayHello();

????????????}

????????????this.fun2=function(){

????????????????sayHello();

????????????}

????????????this.fun3=function(){

????????????????sayHello();

????????????}

????????????function sayHello(){

????????????????document.write("hello,资源打开"+this.name+" "+salary);

????????????}

????????}

????????var p1=new Person();

????????p1.fun2();

?

小结: 通过代码我们可以看出.私有函数可以被 该类的其它方法(公开)调用,同时私有函数可以去访问 该对象的 公开或者私有的属性.

10.4第三种方式给所有的对象实例添加方法(原型法)[推荐..]

????function Dog(){

?

????/*????this.shout=function (){

????????????document.write("小狗汪汪叫");

????????}*/

????}

?

????//原型法

????Dog.prototype.shout=function (){

????????document.write("小狗叫");

????}

????var dog1=new Dog();

????dog1.shout();

对我们原型法的一个实际运用:

?

/*

请思考给 js 的 Array 对象扩展一个find(val) 方法

,当一个Array对象调用该方法的时候,如果能找

到val则返回其下标,否则返回-1

?

????*/

????Array.prototype.find=function(val){

????????

????????//顺序查找

????????for(var i=0;i<this.length;i++){

????????????if(val==this[i]){

????????????????flag=true;

????????????????return i;

????????????}

????????}????????

????????return -1;

????}

var arr=[4,590,-1,890];

????window.alert(arr.find(890));

10.5自定类的工厂方法(了解即可)

当你编写 js 代码时,当你需要一个对象时,可以通过new Object 来创建一个对象,然后再动态的给该对象添加属性和方法.

?

//工厂法创建对象

?

????var obj=new Object();

?

????obj.name="大明";

????obj.show=function (val){

????????window.alert("ok"+val);

????}

?

????obj.show("hello");

?

?

10.6课堂小练习

Number类

?

var i=90;

var res=i.add(78).add(90).add(900).add(9000)

?

window.alert(res);

10.7 成员函数小结

***成员函数的细节?

  1. 成员函数的参数可以是多个:

    例如:

    function 函数名(参数1 、参数2 、…….)

  2. 成员函数可以有返回值,也可以没有返回值,但是有的话,最多只能有一个返回值。
  3. js 中不支持函数的 重载,具体案例如下:

    .???????? function Person(){

    ????????}

    ????????var person = new Person();

    ????????window.alert(person.constructor);

    ?

    ????????function test(a,b)

    ????????{

    ????????????window.alert("hello world");

    ????????}

    ????????function test(a)

    ????????{

    ????????????window.alert(a);

    ????????}

    ????????function test(a,b)

    ????????{

    ????????????window.alert(a + " " +b);

    ????????}

    ????????//test(23)

    ????????????window.test(3,"hello");

    结论:js在调用函数的时候,是根据函数名来调用的,如果有多个函数的函数名相同,则默认调用最后那个函数。(因为后面的函数会把前面函数名相同的函数给覆盖啦)

  4. js 支持创建动态函数,这个用的比较少,了解即可!
  5. 直接定义一个函数或者变量,实际上这些函数和变量就是全局函数和全局变量(本质上他们是属于 window 对象的)

?

11.js的闭包

11.1js的变量作用域

代码:

<html>

<head>

<meta http-equiv="content-type" content="text/html;charset=utf-8"/>

?

<script type="text/javascript">

????

/*

????var a=90; //定义一个全局变量

?

????function test(){

???? ?

????????a=123; //使用外层的 a变量

????}

????

????test();

????document.write("a="+a);*/

?

?

/*????var a=90; //定义一个全局变量

?

????function test(){

???? ?

????????var a=123; //定义一个局部变量

????}

????

????test();

????document.write("a="+a);*/

?

?

/*????a=90; //没有var ,就会试着去找(父函数 的 a),如果找不到就创建 a

?

????function test(){

???? ?

????????a=123; //没有var ,就会试着去找(父函数/外层 的 a),如果找不到就创建 a

????}

????

????test();

????document.write("a="+a);*/

?

?

????//测试一下,看看大家理解否?

?

???? a=20;

?

????function test1(){

????????

????????var a=700;

????????function test2(){

????????????

????????????a=890;//如果没 var ,则会到父函数去,找a,找到就使用父函数的a,否则创建

????????}

????????

????????return test2;

????}

?

????var var1=test1();

????var1();

?

????document.write(a);

?

</script>

</html>

?

<script>

?

var a=10;

function test(){

????b=90;

}

window.alert(b);

</script>

?

  1. js允许函数中有函数
  2. 如果使用变量,如果该变量有var ,则表示创建全新的变量 ,如果该变量是直接写在页面,则我们认为是全局变量,否则是局部变量, 如果没有带var关键字, 则js引擎会这样处理: 首先到父函数去找有没有该变量,如果有,则使用,如果没有则创建之.

?

?

function f1(){

    //var n=999;//局部变量

????????n=999;//全局变量

  }

????

????f1();

?

????alert(n);

  1. 上面的代码说明,如果在一个函数中,直接使用 比如

    n=900; 相当于创建了一个全局变量.

    ?

    ?

    ?

11.2js中如何解决从外部读取内部函数的局部变量->闭包

function test1(){

????

????var n=90;//布局变量

????

}

?

alert(n) //错误

?

解决方法->闭包

?

function test1(){

????var n=90;

????//test1函数的内部函数,可以访问 var n

????funciton test2(){

????window.alert(n++);

}

//把内部函数test2返回外部调用者

????return test2;

}

?

var res=test1();//调用test1 ,返回 test2函数

这时res就是test1内部函数 test2别名

res();

?

闭包: 你可以这样理解 : test2()实现闭包

?

11.3闭包的主要用处是

  • 把局部变量保存在内存中,不让垃圾回收机制,将其回收.
  • 让外部去访问内部函数的局部变量.

12.js中函数名不能重复

  1. 在不同文件中,可以有相同的函数名.
  2. 在不同父函数(类), 即使在同一个页面,可以有相同函数,比如下面代码

abc.html

function test(){}

?

functino test2(){

????

????function sayhello(){

}

}

function test3(){

????function sayhello(){

?

}

}

?

abc2.html

function test(){}

?

?

?

13.面向对象作业评讲

① 设计计算机类,要求如下:

属性:品牌,颜色,cpu型号,内存容量,硬盘大小,价格,工作状态

方法: 打开,关闭,休眠,创建一个计算机对象,调用打开,关闭方法

?

?

<html>

<head>

<meta http-equiv="content-type" content="text/html;charset=utf-8"/>

?

<script type="text/javascript">

?

?

????/*设计计算机类,要求如下:

属性:品牌,颜色,cpu型号,内存容量,硬盘大小,价格,工作状态

方法: 打开,关闭,休眠,创建一个计算机对象,调用打开,关闭方法*、

????*/

????//定义计算机类

????function Computer(){

????????

????????this.brand;

????????this.color;

????????this.cpu;

????????this.memeorysize;

????????this.disksize;

????????this.price;

????????this.state;

?

????????this.open=function open(){

????????????document.write("计算机打开..");

????????}

????????this.close=function close(){

????????????document.write("关闭计算机...");

????????}

????????this.sleep=function sleep(){

????????????document.write("休眠中....");

????????}

?

????}

?

????var computer=new Computer();

????

????computer.open();

????computer.sleep();

????computer.close();

????

?

</script>

</html>

?

  1. 用面向对象的思想,编写小游戏.

?

技术分享

?

14.js面向对象的再说明

  • 对于比较简单的对象,我们也可以这样定义

?

var dog={name: "小明"};

?

????window.alert(dog[‘name‘]);

????var dog1={name:‘小红‘,sayHello:function(a,b){window.alert(a+b);}};

?

????dog1.sayHello(45,55);

?

?

  • 在某些情况下,我们需要去改变某个函数的this指向,我们可以通过 call/apply 来实现

基本用法:

?

函数名.call(对象); // 这时 函数的this就是 对象

?

  • for ... in的另外用法

?

可以对数组遍历

?

可以对象遍历

?

????//json

????var dog={name:"xm",age:34,color:"red"};

?

????//遍历对象

????/*for(var key in dog){

????????window.alert(dog[key]);

????}*/

?

????//你的浏览器window对象支持的属性有那些

????

????for(var key in window){

????????document.write("<br/>"+key+"="+window[key]);

????}

?

  • 可以通过delete 对象名.属性 来手动的删除某个属性值.

15.js的面向对象的三大特征

15.1封装性

所谓封装,就是把我们抽象出的属性和对属性的操作写到类的定义中,称为封装.

?

js 中实现封装主要有两种封装( 公开,私有)

?

function Person(name,sal){

????this.name=name; //公开属性

????var sal=sal;//私有属性

?

????this.show=function(){ //公开方法(特权方法),如果我们希望操作私有属性,则可以用公开方法实现

????window.alert(this.name+" "+sal);

}

?

show2(){ //把函数私有化.,可以访问对象的属性

????window.alert("你好"+this.name+" "+sal)

}

}

var p1= new Person(‘张三‘,3000);

window.alert(p1.name); //在类外可以直接访问公开的属性

p1.show();//这个可以调用

p1.show2();//这个不可以调用,因为私有方法不可以在类的外部被调用

?

?

15.2通过构造函数添加成员方法和通过原型法添加成员方法的区别

  1. 通过原型法分配的函数是所有对象共享的.
  2. 通过原型法分配的属性是独立.(如果你不修改属性,他们是共享)
  3. 建议,如果我们希望所有的对象使用同一一个函数,最好使用原型法添加函数,这样比较节省内存.
  4. 通过prototype 可以给所有的对象添加方法,但是在这种方式下,不能访问类的私有变量和方法

?

//构造函数法

function Dog(){

????this.shout=function(){

}

}

????

//原型法

Dog.prototype.shout=function (){

????????????window.alert("小狗尖叫"+this.name);

????????}

?

????????//通过原型也可以给每个对象,分配属性

????????Dog.prototype.color="red";

?

????????var dog1=new Dog("aa");

????????var dog2=new Dog("bb");

????????

????????if(dog1.shout==dog2.shout){

????????????window.alert("dog1.shout==dog2.shout");

????????}

????????dog1.color="黑色";

????????window.alert(dog1.color+" "+dog2.color);

?

  1. 请大家看一个题:

?

function Person()

????????{

????????????this.name="abc";

????????????var age = 90;

????????????this.abc=function()

????????????{

????????????????window.alert("abc()");

????????????}

????????}

?

????????Person.prototype.fun1=function()

????????{

????????????window.alert(this.name); //可以访问

????????????this.abc();

????????????window.alert(age); //不能访问私有属性,会报错

????????}

????????var p1 = new Person();

????????p1.fun1();

结论是 类.prototype.函数=function (){};

称为后置绑定.

15.3js面相对象的继承

看一段代码->问题是什么?

?

①对象冒充

?

代码如下:

<html>

<head>

<meta http-equiv="content-type" content="text/html;charset=utf-8"/>

?

<script type="text/javascript">

?

????

????//中学生

/*????function MidStu(name,age){

????????this.name=name;

????????this.age=age;

?

????????this.show=function(){

????????????window.alert(this.name+"年龄是="+this.age);

????????}

?

????????this.pay=function(fee){

????????????window.alert("你的学费是"+fee*0.8);

????????}

????}

?

????//小学生

????function Pupil(name,age){

????????this.name=name;

????????this.age=age;

?

????????this.show=function(){

????????????window.alert(this.name+"年龄是="+this.age);

????????}

?

????????this.pay=function(fee){

????????????window.alert("你的学费是"+fee*0.5);

????????}

????}*/

?

????//代码的复用性不高.

????//修改如下:

????//1. 把子类中共有的属性和方法抽取出,定义一个父类Stu

????function Stu(name,age){

????????

????????this.name=name;

????????this.age=age;

????????

????????this.show=function(){

????????????window.alert(this.name+"年龄是="+this.age);

????????}

????}

?

????//2.通过对象冒充来继承父类的属性的方法

?

????function MidStu(name,age){

????????

????????this.stu=Stu; //这里相当于把Stu构造函数(类)赋值给我们的属性this.stu

????????//调用this.stu方法

????????this.stu(name,age); //这个表示初始化MidStu,相当于执行Stu(name,age),这句话必须有,否则无法实现集成的效果

?

????????//可以写MidStu自己的方法.

????????this.pay=function(fee){

????????????window.alert("你的学费是"+fee*0.8);

????????}

????}

?

????function Pupil(name,age){

????????this.stu=Stu;//这里只是把码继承.

????????//初始化一把

????????this.stu(name,age);????

????????//可以写Pupil自己的方法.

????????this.pay=function(fee){

????????????window.alert("你的学费是"+fee*0.5);

????????}

????????

????}

?

????//测试

?

????var midstu=new MidStu("贾宝玉",15);

????var pupil=new Pupil("贾环",12);

?

????midstu.show();

?

????midstu.pay(100);

?

????pupil.show();

????pupil.pay(100);

?

</script>

</html>

?

②通过call 或者apply来实现

?

<html>

<head>

<meta http-equiv="content-type" content="text/html;charset=utf-8"/>

?

<script type="text/javascript">

?

????

????//中学生

/*????function MidStu(name,age){

????????this.name=name;

????????this.age=age;

?

????????this.show=function(){

????????????window.alert(this.name+"年龄是="+this.age);

????????}

?

????????this.pay=function(fee){

????????????window.alert("你的学费是"+fee*0.8);

????????}

????}

?

????//小学生

????function Pupil(name,age){

????????this.name=name;

????????this.age=age;

?

????????this.show=function(){

????????????window.alert(this.name+"年龄是="+this.age);

????????}

?

????????this.pay=function(fee){

????????????window.alert("你的学费是"+fee*0.5);

????????}

????}*/

?

????//代码的复用性不高.

????//修改如下:

????//1. 把子类中共有的属性和方法抽取出,定义一个父类Stu

????function Stu(name,age){

????????

????????window.alert("确实被调用.");

????????this.name=name;

????????this.age=age;

????????

????????this.show=function(){

????????????window.alert(this.name+"年龄是="+this.age);

????????}

????}

?

????//2.通过对象冒充来继承父类的属性的方法

?

????function MidStu(name,age){

????????

????????//这里这样理解: 通过call修改了Stu构造函数的this指向,

????????//让它指向了调用者本身.

????????Stu.call(this,name,age);

????????//如果用apply实现,则可以

//Stu.apply(this,[name,age]); //说明传入的参数是 数组方式

????????//可以写MidStu自己的方法.

????????this.pay=function(fee){

????????????window.alert("你的学费是"+fee*0.8);

????????}

????}

?

????function Pupil(name,age){

????????

????????Stu.call(this,name,age);//当我们创建Pupil对象实例,Stu的构造函数会被执行,当执行后,我们Pupil对象就获取从 Stu封装的属性和方法

????????//可以写Pupil自己的方法.

????????this.pay=function(fee){

????????????window.alert("你的学费是"+fee*0.5);

????????}

????????

????}

?

????//测试

?

????var midstu=new MidStu("孙悟空",15);

????var pupil=new Pupil("猪八戒",12);

?

?

????midstu.show();

?

????midstu.pay(100);

?

?

????pupil.show();

????pupil.pay(100);

?

</script>

</html>

?

?

  • js的继承小结
  • js对象可以通过对象冒充,实现多重继承
  • Object 类是所有js类的基类

15.4多态的特性

  1. js的函数的重载文件

?

js默认不支持重载,我们可以通过,判断参数的个数来实现重载

<html>

<head>

<meta http-equiv="content-type" content="text/html;charset=utf-8"/>

?

<script type="text/javascript">

?

????

????//*****************说明js不支持重载*****

????/*function Person(){

????????

????????this.test1=function (a,b){

????????????window.alert(‘function (a,b)‘);????

????????}

????????this.test1=function (a){

????????????window.alert(‘function (a)‘);

????????}

????}

?

????var p1=new Person();

????//js中不支持重载.

????p1.test1("a","b");

????p1.test1("a");*/

?

???? ?

????

????//js怎么实现重载.通过判断参数的个数来实现重载

?

????function Person(){

????????

????????this.test1=function (){

????????????

????????????if(arguments.length==1){

????????????????this.show1(arguments[0]);

????????????}else if(arguments.length==2){

????????????????this.show2(arguments[0],arguments[1]);

????????????}else if(arguments.length==3){

????????????????this.show3(arguments[0],arguments[1],arguments[2]);

????????????}

?

????????}

????????

?

????????this.show1=function(a){

????????????window.alert("show1()被调用"+a);

????????}

?

????????this.show2=function(a,b){

????????????window.alert("show2()被调用"+"--"+a+"--"+b);

????????}

?

????????function show3(a,b,c){

????????????window.alert("show3()被调用");

????????}

????}

?

????var p1=new Person();

????//js中不支持重载.

????p1.test1("a","b");

????p1.test1("a");

?

</script>

</html>

?

  1. 覆盖

?

当子类有一个方法和父类一样,则我们称子类的方法覆盖了父类的方法 。

//父类

function Stu(){

????????

????????this.show=function(){

????????????window.alert("stu show");

????????}

????}

//子类

????function MidStu(){

????????

????????this.stu=Stu;

????????this.stu();

????????//一定要放在类定义的后面

????????this.show=function(){

????????????window.alert("midstu show");

????????}

????}

?

????var midstu=new MidStu();

?

????midstu.show();

?

? 要实现覆盖,需要把子类的方法,防止类定义的后面.

?

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

?

  • 多态的基本概念
  • 所谓多态,我们可以简单的理解就是一个引用类型 (对象/变量) 在不同情况下的多种状态
  • js 本身是无态,js天生就支持多态.

?

js的多态的一个案例:

<script type="text/javascript">

?

????//人类

????function Person(){

????????this.test1=function (){

????????window.alert("Person test1");

????}

????

????}

?

????//猫类

????function Cat(){

????????this.test1=function(){

????????????window.alert("Cat test1()");

????}

????}

?

????var v=new Person();

var p=v //防止后面v被猫类替代后,v代表person这个类被垃圾回收机制回收。

????

????v.test1();

?

????//v的类型

????if(v instanceof Person){

????????window.alert("23 行 v变量是人类");

????}

????

????v=new Cat(); ????

v.test1();

?

????if(v instanceof Cat){

????????window.alert("30 行 v变量是猫类");

????}//在这里,v是猫类,而同时,其以前代表的人类被回收机制给收走了。如果要让其恢复,只要按上面的红色加背景文字处理即可,定义var p=v

?

</script>

?

?

js的多态的经典案例

?

?

技术分享

?

<script type="text/javascript">

????// Master类

????function Master(name){

????????this.nam=name;

????????//方法[给动物喂食物]

????????

????}

????//原型法添加成员函数

????Master.prototype.feed=function (animal,food){

????????

????????window.alert("给"+animal.name+" 喂"+ food.name);

????}

?

????function Food(name){

????????this.name=name;

????}

?

????//鱼类

????function Fish(name){

????????this.food=Food;

????????this.food(name);

????}????

?

????//骨头

????function Bone(name){

????????this.food=Food;

????????this.food(name);

????}

?

????function Peach(name){

????????this.food=Food;

????????this.food(name);

????}

?

????//动物类

????function Animal(name){

????????this.name=name;

????}

????//猫猫

????function Cat(name){

????????this.animal=Animal;

????????this.animal(name);

????}

?

????//狗狗

????function Dog(name){

????????this.animal=Animal;

????????this.animal(name);

????}

????//猴子

????function Monkey(name){

????????this.animal=Animal;

????????this.animal(name);

????}

????var cat=new Cat("大花猫");

????var fish=new Fish("黄花鱼");

?

????var dog=new Dog("大花狗");

????var bone=new Bone("猪骨头");

?

????//创建一个主人

????var master=new Master("韩顺平");

????master.feed(dog,bone);

?

????//扩展

????var monkey=new Monkey("金丝猴");

????var peach=new Peach("仙桃");

?

????master.feed(monkey,peach);

?

</script>

总结:多态有利于代码的维护和扩展,这里我们可以考虑,如果食物 加入

桃子,动物加入 猴子,可以看到,Master的feed函数不需要的变化。

?

十三、js的内部类

概述 : js的设计者,为了让我们开发方便,事先提供了一下内部类(Array,Number,String,Date,Math....) , 我们可以直接使用。

?

技术分享技术分享技术分享

技术分享

?

再次说明 :js的类又叫原型对象

1.js内部类的分类 如下图:

技术分享

?

安装使用内部类的属性和方法的不同,我们主要分成两种,

?

  1. 动态类????????先创建一个对象实例,然后再使用其属性和方法

?

Array, String ..

?

var arr=new Array(); //var arr=[1,45,90];

调用方法是????????????arr.push()...;

调用属性????????????arr.length;

  1. 静态类????????通过类名,就可以使用其属性和方法(Math)

?

Math.random(); //php 静态方法 类名::静态方法名

?

  1. 两种调用方式都有

?

Number类

?

<script type="text/javascript">

????

????var num=new Number("12.3456");

????//要四舍五入

????alert(num.toFixed(2));

?

????alert(Number.MIN_VALUE);

?

</script>

2.Math类

Math是静态类,提供了常用的数学函数和常数,我这给大家介绍几个最常用的函数,其它的请大家参考javascript帮助文档。

?

abs(x) ????返回数的绝对值

ceil(x) ????对一个数进行上舍入

floor(x) ????对一个数进行下舍入

max(x,y) ????求x,y中较大的数

min(x,y) ????求x,y中较小的数

round(x) ????对 x进行四舍五入

random() ????一个大于0小于1的16位小数位的数字(含0但是不含1)

?

<script type="text/javascript">

????

????var a=90.1;

????//ceil 向上取整

//????window.alert(Math.ceil(a)); //91

?

????//floor 向下取整

?

//????window.alert(Math.floor(45.99)); //45

?

????window.alert(Math.round(Math.random()*100)); //返回在[0,100) 之间的随机数

</script>

?

3.Date类(动态类)

Date() ????返回当前日期和时间

getDate() 从Date对象返回一个月中的某一天

getDay() ????从Date对象返回一周中的某一天

getMonth() ????从Date对象返回月份

getYear() ????从Date对象返回年

getHours() ????从Date对象返回小时数

getMinutes() 从Date对象返回分钟

getSeconds() 从Date对象返回秒数

toLocaleString()

<script type="text/javascript">

????

????//获取当前日期

????var mydate=new Date();

?

????window.alert(mydate.toLocaleString()); //js dom

?

????window.alert(mydate.getMonth()+1);

????

</script>

4.String类(动态类)

indexOf() ????返回某个字符串值在该字符串中首次出现的位置,找不到就返回-1

split() 把字符串分割为字符串数组

substr() ????提取取从start下标开始的指定数目的字符

substring() ????提取字符串中介于两个指定下标之间的子串(包头不包尾)

charAt() ????返回指定位置的字符

length????属性,可以得到字符串的长度

toString()????js中所有内部对象的成员方法,作用是将对象中的数据转成某个格式的字符串,我们在实际运用中在详细介绍

match()/replace()/search() 用的很多,但是涉及到正则表达式,这三个函数放在正则表达式章节中介绍

?

?

<script type="text/javascript">

????

????var txt="h韩llo中国";

????//document.write(txt.indexOf("worldr"));

?

//????var arr=txt.split("");

?

//????document.write(arr);

?

????//substri(start,length) 从start开始取,取出lenght个字符,如果不够取,则尽量的取

????????

//????var sub=txt.substr(3,3);

?

????//stringObject.substring(start,stop) 从start开始取,取到stop-1

????//var sub=txt.substring(0,2);

?

????//charAt(index) 表示取出第几个字符

????//var sub=txt.charAt(3);

?

????//window.alert(sub);

?

????//练习 输入文件全路径 获取文件名和后缀?

????var file_path="c:/abc/abc北京/helo/顺平.exe";

?

????//思路

????var last_index=file_path.lastIndexOf("/");

?

????window.alert(file_path.substr(last_index+1));

</script>

?

会遇到问题,是因为你基础没有扎实。

5.Array类(动态类)

Array提供了对数组的操作,使用Array对象可以轻松的创建数组,

并对数组进行删除、排序和合并等操作。

?

concat() ????连接两个或更多的数组,并返回结果。

sort()????对数组的元素进行排序

toString() 把数组转换为字符串,并返回结果

pop() ????删除并返回数组的最后一个元素

push() ????向数组的末尾添加一个或更多元素,并返回新的长度

splice() 方法用于插入、删除或替换数组的元素

length????属性

?

<script type="text/javascript">

?

????//数组的创建

?

????var arr=new Array();

?

????//静态设置数据

????arr[0]=23;

?

????arr[1]="顺平";

????arr[2]=567;

????//动态的添加

?

/*????for(var i=0;i<3;i++){

????????

????????arr[i]=window.prompt("请输入第"+(i+1)+"数");

????}*/

?

????//如何删除数组的某个元素

?

????//删除第2个元素->下标为1

????//arr.splice(1,1); //第一个1 表示删除第几个元素, 第二个1表示删除1个

?

????//修改第二个 "顺平"-> "小明"

????//arr.splice(1,1,"小明");//更新

?

????//把一个新的数据"北京",添加到第1元素后面

????//arr.splice(1,0,"北京");

?

????//遍历数组

????document.write("***********<br/>");

????for(var key in arr){

????????document.write(arr[key]+"<br/>");

????}

????

</script>

?

上面这种遍历的经典案例是查看window下的所有函数:

<script type="text/javascript">

????for(var key in window)

????document.write("<br/>"+key)????

????</script>

?

这里我们需要注意: splice() 函数,他把 删除,修改,添加 都可以完成,根据传入的参数的个数和值,不同来决定进行怎样的操作.

?

?

深入探讨 :对象数组. //用的挺多.

[坦克大战 ]

?

//**********对象数组的使用*************

?

????function Person(name,age){

????????

????????this.name=name;

????????this.age=age;

????}

?

/*????var p1=new Person("曹操",45);

????var p2=new Person("刘备",40);

????var p3=new Person("孙权",30);

?

????var arr=new Array();

?

????p2.name="赵云";

?

????arr[0]=p1;

????arr[1]=p2;

????arr[2]=p2;

?

????//遍历

????for(var key in arr){

????????

????????var p=arr[key];

????????window.alert(p.name);

????}*/

?

????结果显示是:曹操 赵云 赵云

?

原理图:

技术分享

另一个例子:

????var arr=new Array();

????function addHero(){

???? ?

????????for(var i=0;i<3;i++){

????????????

????????????var name=window.prompt("请输入英雄的名字");

????????????var age=window.prompt("请输入英雄的年龄");

????????????var p=new Person("","");

????????????p.name=name;

????????????p.age=age;

????????????arr[i]=p;

????????????

????????}

????}

????addHero();

????//遍历数组

????for(var key in arr){

????????

????????var p=arr[key];

????????document.write("<br/>"+p.name);

????}

?

? js的函数间传递数据时候,按照什么来传递

基本数据类型 number boolean string 是按照值传递

数组和对象是 引用传递.

案例如下:

技术分享

php比较一下: 传递数组的时候有一点区别 php默认是值传递,对象是引用传递.

总结就是,在php中,只有对象是引用传递,其他的(number boolean string、数组)都是值传递。

?

6.Boolean类

了解即可

7.Number类(动态类)

案例 number1.htm

1. 请输出23的二进制字符串和16进制的字符串

2. 计算7/3的结果,并保留到小数点后两位(四舍五入)

<script type="text/javascript">

????

????/*案例 number1.htm

1. 请输出23的二进制字符串和16进制的字符串

2. 计算7/3的结果,并保留到小数点后两位(四舍五入)????*/

?

????var n1=23;//<==> var n1=new Number(23);

?

????window.alert(typeof(n1));

????window.alert(n1.toString(10));

????

//toFixed();把一个数四舍五入到小数点的某一个位置.

?

????var n=7/3;

????window.alert(n.toFixed(4));

十四、系统函数

说 js的函数分为三个大的部分

① 自定义函数 (程序员自己根据编程的需要写的函数 [对象的成员函数,普通函数])

  • 内部类中的函数
  • 系统函数 (全局函数),可以自己使用.

?

具体介绍

?

encodeURI --编码

decodeURI --解码

?

function sendInfo(){

????????var name=encodeURI("韩顺平 abcd");

????????window.location.href="getInfo.php?address=beijing&name="+name;

????}

?

//js 去请求一个php页面

window.location.href=""

?

看看为什么需要

?

从案例演示我们看到,在使用js提交数据时,如果浏览器版本低,就可能出现乱码,或者错误情况.

?

eval函数的使用

?

该函数可以把一个字符串当做脚本来执行. 当根据输入的情况显示相应内容时候,可以用eval函数。

?

//????var str="window.alert(‘hello‘)";

?

//????eval(str);

?

????function test1(val){

????????????window.alert("我是test1函数"+ val);

????}

?

????function test2(val){

????????window.alert("我是test2函数"+val);

????}

?

????var input=window.prompt("请输入你希望执行哪个函数名");

????var val=window.prompt("请输入值");

?

????var str=input+"(‘"+val+"‘)";

????eval(str);

?

?

URL:Uniform Resource Locator,统一资源定位符;

URI:Universal Resource Identifier,通用资源标识符。

?

URI含义更广泛,URL是URI的一个部分,通常指网址

在一定程度上,你可以认为URI =URL

http://www.sohu.com:80/shareinfo/image1.jpg

技术分享

网页提交信息的三种方法:

1.通过表单[get/post];

2.通过超链接<a href="getInfo.php?name=zs"></a>;

3.通过js来提交数据;

?

无论上面三种哪一种提交,如果是用js来接受,那么其拿到的都是字符串。要讲字符串转成相应的类型,在进行处理。

十五、js的事件

概述 : js是采用事件驱动的机制来响应用户操作的,也就是说当用户对某个html元素进行某个操作时,会产生一个事件,该事件会驱动某些函数来处理,原理图 :

技术分享

Js最好是看手册,但是参考手册js事件里面的属性并不能进一步点进去深入了解。所以我们要通过dom event事件进行了解。该方法里面的属性可以点击后进一步了解。

?

技术分享

?

快速入门案例:

?

<script type="text/javascript">

?

????//事件处理函数

????function test1(event){

????????window.alert("ok");

????????window.alert(event.clientX);

????}

?

</script>

?

<input type="button" value="tesing" onclick="test1(event)"/>

?

这里我们有几个新的名词,需要理解:

技术分享

?

事件源: 就是产生事件的地方(html元素)

事件: 点击/鼠标移动/键按下..

事件对象: 当某个事件发生时,可能会产生一个事件对象,这个事件对象会封装该事件的信息(比如点击的x,y. keycode),传递给事件处理程序

事件处理程序: 响应用户的事件.

?

快速入门 :

<html> <head>

<script type="text/javascript">

function show_coords(event) {

x=event.clientX;

y=event.clientY;

alert(event+"X coords: " + x + ", Y coords: " + y)

}

</script>

</head>

<!--body元素响应onmousedown事件 -->

<body onmousedown="show_coords(event)">

<p>Click in the document. An alert box will alert the x and y coordinates of the mouse pointer.</p>

</body>

</html>

?

1.事件的分类

  • 鼠标事件
  • 键盘事件

    ?

    onkeydown onkeyup onkeypress

    ?

    我想知道用户按下什么键!

    ?

    <html> <head>

    <script type="text/javascript">

    ?

    ????function showkey(event){

    ????????if(event.keyCode==65){

    ????????????window.alert("a被按下");

    ????????}else if(event.keyCode==66){

    ????????????window.alert("b被按下");

    ????????}

    ????}

    </script>

    </head>

    <!--body元素响应onmousedown事件 -->

    <body onkeydown="showkey(event)">

    ?

    </body>

    </html>

  • html事件
  • 其它事件

    ?

    案例:通过红色和蓝色按钮切换红色和蓝色。

    技术分享

    ?

    ????function mychange(val){

    ????????var div1=document.getElementById("div1");

    ????????if(val.value==‘red‘){

    ????????????//通过js获取div这个对象

    ????????????

    ????????????//window.alert(div1.style.width);

    ????????????div1.style.backgroundColor="red";

    ????????}else if(val.value=="black"){

    ????????????//通过js获取div这个对象

    ????????????

    ????????????//window.alert(div1.style.width);

    ????????????div1.style.backgroundColor="black";

    ????????}

    ????}

    ?

    ????function sayHello(){

    ????????window.alert("red按钮被按下");

    ????}

    ????

    </script>

    </head>

    ?

    <body>

    ?

    ????<div id="div1" style="width:400px;height:300px;background-color:red">

    ????</div>

    ????<input type="button" value="red" onclick="mychange(this),sayHello()"/>

    ????<input type="button" value="black" onclick="mychange(this)"/>

    ?

    </body>

    ?

    ?

    2.不同的浏览器事件种类不一样

    如何区分当前浏览器的内核是什么?(区分出ie6/7/8/ 火狐等)

    ?

    代码如下:

    ?

    <script language="javascript">

    if(window.XMLHttpRequest)

    { //Mozilla, Safari, IE7,IE8

    ???? ????if(!window.ActiveXObject)

    ????????????{???? // Mozilla, Safari,

    ????????alert(‘Mozilla, Safari‘);

    ????????}

    Else

    {

    ????????alert(‘IE7 .8‘);

    ????????}

    ???? }

    else

    {

    ????alert(‘IE6‘);

    ????}

    </script>

    3.案例:防止用户通过点击鼠标右键菜单拷贝网页内容

    ????<script type="text/javascript">

    ???? ?

    ????????function test(){

    ????????//window.alert("没有菜单");

    ????????return false;

    ????}

    ????function test2(){

    ????????//window.alert("全选不行");

    ????????return false;

    ????}

    ????

    </script>

    </head>

    <!--body元素响应onmousedown事件 -->

    <body oncontextmenu="return test();" onselectstart="return test2();">

    我的内容!是大幅度

    </body>

    十六、dom编程的介绍

    Javascript 精彩网页特效实例精粹 韩老师没有发给我,记得找他要。

    ?

  1. dom的必要性

实际上js更重要的作用是可以让用户对网页元素进行交互操作,这才是学习js的精华之所在。

(1)贪吃蛇 (2)推箱子(3)坦克大战 ,这些都需呀用的dom编程,当我们学习完这一章节后,大家可以很轻松的写出类似的项目了。

dom编程,也是我们学习ajax技术的基础,所以我们必须掌握好dom编程。前端(html+css+js[dom编程]) | 后台

?

  1. dom的介绍

?

dom的来源:

技术分享

技术分享

?

让弹出窗口变小:

<script type="text/javascript">

????????window.resizeTo(300,200);

</script>

1.dom对象

前面说过,js把浏览器,网页文档和网页文档中的html 元素都用相应的内置对象(看文档)来表示,这些对象与对象间的层次关系构成dom,针对网页(html,jsp,php,aspx.net)的dom就是html dom。我们这讲的就是html dom

?

这里有几个特别重要的概念要给大家说清楚:

①上面说的内置对象就是dom 对象,准确的说是html dom对象。

②因为我目前讲的是 html dom 编程,所以我提到的dom 编程,dom

对象都是说的 html dom 编程 和 html dom对象,请大家不要犯迷糊。

③dom 编程时,会把html文档看做是一颗dom 树(对照乌龟抓鸡来的代码来说明dom编程.(首先要画出html dom图[参看资料文件夹,已经画好])

  1. dom 编程的核心就是各个dom 对象,下一章节会详细讲解.

?

2.html dom 树

在进行 html dom 编程时,我们把html文件 看成是一个dom树,该dom树在内存中有层级关系,通过操作 dom树,就可以改变 html 页面的显示效果

技术分享

?

从上图可以得出 : 从 html dom 的角度看 ,每个html文件的元素都会被当做一个Node节点对象来看待,就可以使用它的方法,同时对于 html dom说,因为元素本身可能就是img/button/form同时可以看成 Button Img Form 内置对象

?

html文件

?

<img id=‘myimg‘ src="a.jpg" />

?

<script>

var myimg=document.getElementById("myimg");

</script>

?

xml 文件

<class>

<stu id="mystu">

顺平

</stu>

</class>

?

var mystu=document.getElementById("mystu");

?

这是 mystu就是 Node对象

3.html dom编程的实例

js面向对象的方式来编写.

?

w ->上

a->左

s->下

d->右

课后练习: 对乌龟游戏添加新的功能:

?

  • 当乌龟碰到边界时,不能再移动
  • 让鸡可以自由的移动
  • 可以通过上下左右的按钮控制乌龟移动
  • 乌龟上下左右移动的时候可以换成相应的图片.

?

乌龟抓鸡代码

<html>

????<head>

????????<meta http-equiv="content-type" content="text/html; charset=UTF-8"/>

????????<script type="text/javascript">

????????????//定义两个类

????????????function Tortoise(x,y){

????????????????this.x=x;

????????????????this.y=y;

????????????????this.speed=10;//移动一个像素

????????????????this.Catch=function(){

????????????????????if((this.x>=cock.x-80)

????????????????????&&(this.x<=cock.x+80)

????????????????????&&(this.y>=cock.y-60)

????????????????????&&(this.y<=cock.y+60)){

????????????????????????alert("抓到!");

????????????????????}

????????????????}

????????????????//向上移动

????????????????this.move_up=function(){

????????????????????

????????????????????this.y-=this.speed;

????????????????????//同时修改乌龟的top的值

????????????????????//dom编程体现

????????????????????//先得到这个乌龟的图片

????????????????????var wugui_div=document.getElementById("wugui");

????????????????????wugui_div.style.top=this.y+"px";

????????????????}

????????????????//向下移动

????????????????this.move_down=function(){

????????????????????this.y+=this.speed;

????????????????????var wugui_div=document.getElementById("wugui");

????????????????????wugui_div.style.top=this.y+"px";????????????

????????????????}

????????????????//向左移动

????????????????this.move_left=function(){

????????????????????this.x-=this.speed;

????????????????????var wugui_div=document.getElementById("wugui");

????????????????????wugui_div.style.left=this.x+"px";????????????

????????????????}

????????????????//向右移动

????????????????this.move_right=function(){

????????????????????this.x+=this.speed;

????????????????????var wugui_div=document.getElementById("wugui");

????????????????????wugui_div.style.left=this.x+"px";????????????

????????????????}

????????????}

????????????function Cock(x,y){

????????????????this.x=x;

????????????????this.y=y;

????????????????this.speed=1;//移动一个像素 setInterval(定时器)

????????????}

????????????//创建全局的乌龟和公鸡对象

????????????var tortoise=new Tortoise(100,200);

????????????var cock=new Cock(200,200);

????????????//响应用户的操作

????????????function move(obj){

????????????????switch(obj.value){

????????????????????

????????????????????case "向上走":

????????????????????????tortoise.move_up();

????????????????????????tortoise.Catch();

????????????????????????break;

????????????????????case "向下走":

????????????????????????tortoise.move_down();

????????????????????????tortoise.Catch();

????????????????????????break;

????????????????????case "向左走":

????????????????????????tortoise.move_left();

????????????????????????tortoise.Catch();

????????????????????????break;

????????????????????case "向右走":

????????????????????????tortoise.move_right();

????????????????????????tortoise.Catch();

????????????????????????break;

????????????????}

????????????}

????????????//响应用户的操作

????????????function move2(event){

????????????????switch(event.keyCode){

????????????????????case 87:

????????????????????????tortoise.move_up();

????????????????????????tortoise.Catch();

????????????????????????break;

????????????????????case 83:

????????????????????????tortoise.move_down();

????????????????????????tortoise.Catch();

????????????????????????break;

????????????????????case 65:

????????????????????????tortoise.move_left();

????????????????????????tortoise.Catch();

????????????????????????break;

????????????????????case 68:

????????????????????????tortoise.move_right();

????????????????????????tortoise.Catch();

????????????????????????break;

????????????????????default:

????????????????????????break;

????????????????}

????????????}

????????</script>

????</head>

????<body onkeydown="return move2(event)">

????????<table id="mytable" border="1">

????????<tr>

????????<td></td>

????????<td><input type="button" value="向上走" onclick="move(this)" /></td>

????????<td>shunping</td>

????????</tr>

????????<tr>

????????<td><input type="button" value="向左走" onclick="move(this)" /></td>

????????<td></td>

????????<td><input type="button" value="向右走" onclick="move(this)" /></td>

????????</tr>

????????<tr>

????????<td></td>

????????<td><input type="button" value="向下走" onclick="move(this)" /></td>

????????<td></td>

????????</tr>

????????</table>

????????<input type="button" value="delete row" onclick="test();"/>

????????<!--把乌龟放在一个div-->

????????<div id="wugui" style="position: absolute ;left:100px;top:200px;">

????????<img src="image/1.bmp" border="1" height=60px; width=80px;/>

????????</div>

????????<div id="cock" style="left:200px;position:absolute;top:200px;">

????????<img src="image/2.bmp" border="1" height=60px; width=80px;/>

????????</div>

????????</body>

</html>

4.bom

bom 的全称是浏览器对象模型 (bowser object model)., 它规定所有的浏览器在设计时,要考虑支持 bom提出的规范,这样才能正常浏览网页.

dom 和 bom 的关系

bom一个纲领性,dom 就是具体的.( dom 对象、属性、方法.)

?

bom 包括 浏览器所有对象

dom (document object model)主要是 bom(document对象的扩展)

?

5.dom的层级关系

?

?? 在进行dom编程时,每个html的元素被看成一个Node节点(对象),你如果要看具体信息,到 xml dom 的 Node章节查看.

6.window对象

常用的函数和属性.

?

  • 6.1 confirm:

?

var res=window.confirm("确认安装该软件吗?");

????

????if(res){

????????window.alert("安装ok");

????}else{

????????window.alert("安装ok");

????}

?

  • 6.2 setInterval("函数名()",调用该函数的间隔时间) 和 clearInterval

?

?

  1. 简单时钟

?

<html>

<head>

<title>文档标题</title>

</head>

<body>

当前时间是, <!--读10秒自动停止,并弹出一句话"hello.wrold"-->

<span id="myspan">???</span>

</body>

<script type="text/javascript">

????var i=0;

????var myspan=document.getElementById("myspan");

????

????function abc(){

????????

????????//window.alert(++i);

????????var mytime=new Date()????;????????

????????//对象.innterText表示在该对象对应标签的中间放入文本

????????myspan.innerText=mytime.toLocaleString();

?

????????if(++i==10){

????????????window.clearInterval(mytime2);

????????????window.alert("hello,world,不走了");

????????}

????}

????//做了一个定时器

????var mytime2=window.setInterval("abc()",1000);

?

</script>

</html>

  1. 小游戏

技术分享

<html>

<head>

<title>文档标题</title>

</head>

<body>

<img id="boy" src="1.png" /><br/>

<input type="button" value="加速"/>

<input type="button" value="减速"/>

<input type="button" value="停止" onclick="sendCommand(this)"/>

<input type="button" value="开始" onclick="sendCommand(this)"/>

</body>

<script type="text/javascript">

????var boy=document.getElementById("boy");

????var img_no=0;

????function start(){

????????var no=((img_no++)%8);

????????boy.src=no+".png";

????}

????function stop(){

????????window.clearInterval(time1);

????}

????//每隔一秒切换一次图片

????var time1="";

????function sendCommand(obj){

????????switch(obj.value){

????????????case "开始":

????????????????time1=setInterval("start()",100);

????????????????break;

????????????case "停止":

????????????????stop();

????????????????break;

????????????}

????}

</script>

</html>

?

课堂练习时,请大家把小孩的加速和减速做了.

?

  • 6.3 setTimeout / clearTimeout

该函数也可以做定时器,但是它只调用函数一次,就结束了

function abc(){

????????

????????window.alert("hello");

????}

????//启用一个定时器

????var time1=window.setTimeout("abc()",3000);

????window.clearTimeout(time1);

  • 6.4 moveTo moveBy resizeTo resizeBy

?

<script type="text/javascript">

????

????window.moveTo(200,200);//以当前的屏幕的左上角为原点,进行移动

????function abc(){

????????//window.moveBy(20,20);//这是以当前的窗口的左上角为原点,进行移动

????????window.resizeBy(20,20);//在当前窗口大小的前提下,调整大小

????}

????window.resizeTo(100,300);//将当前这个窗口的大小,调整为指定的大小(同时调整之后的窗口左上角与屏幕左上角重合)

</script>

?

  • 6.5 open 函数 该函数用于打开一个新窗口

?

<script type="text/javascript">

????

????function test(){

????????????//第二个参数可以指定,是替换本窗口(_self),还是开窗口(_blank 默认)

????????????//第三个参数可以指定新窗口的样式.

????????????window.open("newwindow.html","_blank","width=300,height=300,toolbar=yes,titlebar=yes,status=yes,location=yes,resizable=yes");//开新窗口

????}

</script>

<input onclick="test();" type="button" value="开新窗口"/>

?

关于两个html页面相互通信的案例

?

opener 属性 子窗口引用父窗口信息

?

A页面:

<script type="text/javascript">

????var newwindow="";

????function test(){

????????//open函数本身就会返回子窗口的引用

????????newwindow=window.open("b.html");

????}

????function test2(){

????????//取出用户希望发送给子窗口的信息

????????var my_text=document.getElementById("myinfo");

????//newwindow.document 实际上b.html页面的文档

????????var chlid_text=newwindow.document.getElementById("myinfo");

????????chlid_text.value=my_text.value;

????}

</script>

<input onclick="test();" type="button" value="开新窗口"/>

?

<input type="text" id="myinfo" />

<input type="button" onclick="test2()" value="发送给子窗口"/>

?

B页面

?

<script type="text/javascript">

????function send(){

????????

????????var chlid_text=document.getElementById("myinfo2");

????????//opener表示该页面的父窗口

????????opener.document.getElementById(‘myinfo‘).value=chlid_text.value;

????}

</script>

<h1>我是b.html页面</h1>

<input type="text" id="myinfo"/>

<input type="text" id="myinfo2"/>

<input type="button" value="送给父窗口" onclick="send()"/>

?

7.history对象

history对象 记录用户访问的url

go back forward

?

入门案例:

?

<html>

<head>

<script type="text/javascript">

????function myback(){

????????//window.alert(‘ok‘);

????????//window.history.back();

????????window.alert(history.length);

????????window.history.go(-1);

????}

</script>

</head>

<h1>b.html</h1>

<input type="button" onclick="myback()" value="返回上一次页面1"/>

</html>

8.location对象

location对象包含当前url的信息

?

  • reload方法

重新加载本页面(刷新本页面)

?

<script>

????function myfresh(){

????window.location.reload(); // ajax局部刷新

}

?

//每隔十秒刷新页面

window.setInterval("myfresh()",10000);

</script>

?

  • href属性

通过该属性可以指定 载入新的页面

?

window.location.href="url" //url可以本网址,也可以另一个网址

9.navigator

该对象包括浏览器的信息

想看该对象下的所有属性可以通过遍历获得。

?

<script type="text/javascript">

?

for (var key in navigator )

{document.write("<br/>"+key+"="+navigator[key]);

}

</script>

10.screen对象

这个对象包括 用户显示屏幕的信息

?

当用户的分辨率是不1024×768时,给出提示,请写出该程序!

<script type="text/javascript">

if (screen.height!=768||screen.width!=1024)

{window.alert("请将您的浏览器分辨率调整到1024*768!")

}

</script>

11.Event对象(!!!!)

给某个html元素(控件), 绑定事件的三种方法

?

  • 静态绑定

?

<input type="button" onclick="函数" vlaue="xx值"/>

?

  • 动态绑定

?

//获取某个对象再绑定

?

getElementById("htmlid").事件=方法

?

<script type="text/javascript">

????

????function test1(){

????

????????window.alert("test1");

????????//这句话的意思就是把but2 的onclick 和 test2函数绑定

????????//document.getElementById(‘but2‘).onclick=test2;//

????????

????????//but2.onclick=test2;

????????$(‘but2‘).onclick=test2;

????????

????}

????

????function $(id){

????????return document.getElementById(id);

????}

?

????function test2(){

????????

????????window.alert("test2");

????}

</script>

?

<input type="button" id="but1" onclick="test1()" value="测试">

<input type="button" id="but2" value="测试2">

?

  • 通过 attachEvent 和 detachEvent 方法来绑定事件和解除事件绑定

?

<input type="button" id="but1" value="投布什一票">

<script type="text/javascript">

????

????//第一个参数是事件名

????but1.attachEvent("onclick",vote);

?

????function vote(){

????????

????????window.alert("你投了布什一票,以后不能再投");

?

????????//解除绑定

????????but1.detachEvent("onclick",vote);

????}

?

</script>

js 中事件对象的获取 (IE和火狐不一样)

在ie中有两种方法

?

<script>

?

//1.第一方法

function test(){

????

????//通过 window.event.属性

????window.alert(window.event.clientX);

}

?

//2.第二种方法

function test2(event){

????//event

????window.alert(event.clientX);

}

function abc(){

????window.alert("窗口变化");

}

</script>

<body onresize="abc()">

<input type="button" value="测试" onclick="test()"/>

<input type="button" value="测试2" onclick="test(event)"/>

</body>

?

?

特别说明一下: 我们的表单除了常规提交方式,还可以通过js来动态的提交

?

技术分享

?

Event的一个案例:监测鼠标在页面中的移动位置:

????<script type="text/javascript">

????function test()

????{

????showxy.innerText="x="+window.event.screenX+"y="+window.event.screenY;

????}

</script>

<body>

????<div onmousemove="test();" style="width:400px;height:300px;border:1px solid red;"></div>

????<span id="showxy"></span>

</body>

event 的一个案例:

请在文本框中输入一个六位数,第一位不能为0,不能超过六位数,必须全是数字,如何实现?

技术分享

<body>

请输入一个六位数 <input type="text" id="pageNow" onkeydown="return checkNum(this)"/>

</body>

<script type="text/javascript">

?

<!--

var i=0;

?

function checkNum(obj){

?

????//判断输入数字的长度是否超过六

????if(i==6){

????????

????????window.alert("输入的字符串>6");

????????return false;

????}

????//防止首位是0

????if(i==0){

????????if(window.event.keyCode==‘0‘.charCodeAt(0)){

????????????alert(‘首位不能是0‘);

????????????return false;

????????}

????}

?

????//window.alert("用户输入了一个"+window.event.keyCode);

????//如果我们记不住 0->48 9->57,我们可以这样做

????if(window.event.keyCode<‘0‘.charCodeAt(0) || window.event.keyCode>‘9‘.charCodeAt(0)){

????????window.alert("你输入的不是数");

????????return false;

????????//window.event.returnValue=false;

????}else{

???? //如果被接收

????????i++;

????}

}

//-->

</script>

?

?

12.document对象

最重要的三个方法

?

getElementById [html php jsp] (如果页面中有多个相同的id,则返回第一个对象引用)

getElementsByName 通过html控件的名字返回对象集合 多用于多选。

?

getElementsByTagName 通过html的标签名返回对象集合

?

案例:请选择你的爱好

技术分享

?

<script type="text/javascript">

????//通过id获取对象

????function test(){

????????var a1=document.getElementById("a1");

????????//如果要取出某个属性

????????window.alert(a1.id+" "+a1.href+" "+a1.innerText);

?

????????a1.innerText="连接到百度";

????????a1.href="http://www.baidu.com";

????}

?

????//通过name来获取.对象

????function test2(){

???? ?

????????//使用

????????var hobbies=document.getElementsByName("hobby");

????????//遍历这个集合

????????for(var i=0;i<hobbies.length;i++){

????????????

????????????//判断

????????????//window.alert(i+ " "+hobbies[i].checked);

????????????if(hobbies[i].checked){

????????????????window.alert("你的爱好是"+hobbies[i].value);

????????????}

????????}

????}

?

????//通过标签名

????function test3(){

????????var inputs=document.getElementsByTagName("input");

????????window.alert(inputs.length);

????}

?

</script>

<body>

<a id="a1" href="http://www.sina.com">连接到sina</a><br/>

<a id="a1" href="http://www.sohu.com">连接到sohu</a><br/>

<a id="a3" href="http://www.baidu.com">连接到baidu</a><br/>

<input type="button" value="测试" onclick="test()"/><br/>

请选择你的爱好:

<input type="checkbox" name="hobby" value="旅游">旅游

<input type="checkbox" name="hobby" value="音乐">音乐

<input type="checkbox" name="hobby" value="体育">体育

<input type="checkbox" name="hobby" value="电影">电影

<input type="button" value="看看你的爱好" onclick="test2()"/><br/>

<input type="button" value="通过tagname来获取元素" onclick="test3()"/><br/>

</body>

?

  • 我们综合运用一下前面学习到的各种知识

动态的创建元素(节点)/添加元素(节点)/删除元素(节点)

技术分享

?

注意用四个节点属性:

createElement() 方法创建新的元素节点:

appendChild() 方法向已存在的节点添加子节点。(发射子弹)

removeChild() 方法删除指定的节点。 (子弹消失)

parentNode 属性可返回某节点的父节点。

?

?

<script type="text/javascript">

????

????function test1(){

????????//window.alert(‘ok‘);

????????//1创建 a 元素 createElment(标签名),

????????var myhref=document.createElement("a"); //<a >???</a>

????????myhref.innerText="连接到sina";

????????myhref.href="http://www.baidu.com"

????????myhref.id="myhref";

????????//document.body.appendChild(myhref);

????????div1.appendChild(myhref);

????}

?

????function test2(){

????//document.getElementById(‘div1‘).removeChild(document.getElementById(‘myhref‘));

????????var node=document.getElementById(‘myhref‘);

????????node.parentNode.removeChild(node);

????}

?

</script>

<body>

<input type="button" value="创建一个a标签" onclick="test1()"/><br/>

<input type="button" value="删除a标签" onclick="test2()"/><br/>

<!--引入 css id class [dom如何去操作一个外表css!补讲 ]-->

<div id="div1" style="width:200px;height:200px;background-color:green">div1</div>

</body>

?

制作一个函数查询按键的keycode编码!

代码如下:

?

<script type="text/javascript">

????function test()

????{

????????window.alert("我所按下的键的keycode的代码是"+window.event.keyCode);

????}

</script>

<body>

????<input type="button" onkeydown="test()" value="tesing"/>

</body>

?

技术分享

?

思路很重要

?

  1. 响应用户按 j 键
  2. 让乌龟发子弹 函数 fire内容多.

2.1 创建子弹

我认为子弹就是一个图片 / 也可以认为是一个div span

?

  • 让子弹飞一会

?

用了一个this.move_bullet函数让它定时修改 横坐标,产生移动的效果.

为什么发送第二颗子弹,第一颗就停止?

?

  • 请大家思考一个问题,怎样让子弹碰到边界后,就停下,并且消失

?

提示: window.alert("body的宽="+document.body.clientWidth);

<script type="text/javascript">

????//定义两个类

????function Tortoise(x,y){

????????

????????this.x=x;

????????this.y=y;

????????//var bullet_img="";//子弹

????????

????????//子弹数组

????????var bullet_imgs=new Array();

????????var bullet_img_speed=2;

????????this.speed=1;//移动一个像素

????????var isStart=false;

????????this.move_up=function(){

????????????

????????????this.y-=this.speed;

????????????//同时修改乌龟的top值.

????????????//dom编程体现

????????????//1先得到这个乌龟图片 div

????????????var wugui_div=document.getElementById("wugui");

????????????wugui_div.style.top=this.y+"px";

????????????//判断乌龟是否和公鸡碰撞.

????????????//window.alert("乌龟当前的 x y"+this.x+" "+this.y);

????????????//window.alert("公鸡当前的 x y"+cock.x+" "+cock.y);

?

????????}

????????//向右移动

????????this.move_right=function(){

????????????

????????????this.x+=this.speed;

????????????//同时修改乌龟的top值.

????????????//dom编程体现

????????????//1先得到这个乌龟图片 div

????????????var wugui_div=document.getElementById("wugui");

????????????wugui_div.style.left=this.x+"px";

????????}

?

????????//开火

????????this.fire=function(){

????????????//window.alert("乌龟发子弹");

????????????var bullet_img=document.createElement("img");

????????????bullet_img.src="bullet.bmp";

????????????//设置bullet_img的x,y

????????????//定子弹的横坐标

????????????bullet_img.style.left=(this.x+94)+"px";

????????????bullet_img.style.top=(this.y+33)+"px";

????????????//做出绝对定位

????????????bullet_img.style.position="absolute";

????????????document.body.appendChild(bullet_img);

????????????//把这颗新子弹放入 数组中,进行管理

????????????bullet_imgs[bullet_imgs.length]=bullet_img;

?

????????????//启动子弹[请注意一下,如果我们调用是一个对象的成员方法]

????????????//setInteval 应该这样去掉 window.setInteval("对象名.函数名()",时间);

????????????//如果子弹数组中有子弹,就不要在调用

?

????????/*????if(bullet_imgs.length==1){

????????????????window.setInterval("tortoise.move_bullet()",50);

????????????} */

?

????????????if(!isStart){

????????????????window.setInterval("tortoise.move_bullet()",10);

????????????????isStart=true;

????????????}

????????}

?

????????//让子弹移动

????????this.move_bullet=function(){

????????????

????????????//遍历子弹数组.看看每颗子弹是否已经到到边界,如果到了边界,则删除

????????????//for(var i=0;i<bullet_imgs.length;i++){

????????????????

????????????//}

????????????

????????????if(bullet_imgs.length==0){

????????????????//stop定时器.

????????????????//isStart=false;

????????????}

?

????????????//这里要求访问 bullet_img

?

????????????//修改bullet_img 的 left即可 100px

?

????????????//遍历子弹数组,让每颗子弹移动

????????????for(var i=0;i<bullet_imgs.length;i++){

?

????????????????//取出每颗子弹

????????????????var bullet_img=bullet_imgs[i];

????????????????

????????????????var bullet_img_x=bullet_img.style.left.substring(0,bullet_img.style.left.indexOf("p"));

????????????

????????????????bullet_img.style.left=parseInt(bullet_img_x)+bullet_img_speed+"px";

?

????????//遍历子弹数组.看看每颗子弹是否已经到到边界,如果到了边界,则删除

????????????????if(parseInt(bullet_img_x)+17>=document.body.clientWidth){

????????????????????//到达边界,就删除该子弹

????????????????????bullet_imgs.splice(i,1); //3 2 1

????????????????????//同时从html dom树种删除

????????????????????bullet_img.parentNode.removeChild(bullet_img);

????????????????}

????????????}

????????}

????}

?

????function Cock(x,y){

????????this.x=x;

????????this.y=y;

????????this.speed=1;//一定一个像素 setInterval(定时器)

?

????}

????

????//创建全局的乌龟对象和公鸡对象

????

????var tortoise=new Tortoise(100,120);

?

????var cock=new Cock(200,200);

?

????//用于响应用户点击的操作

????function move(obj){

????????

????????switch(obj.value){

????????????

????????????case "向上走":

????????????????tortoise.move_up();

????????????????break;

????????????case "向右走":

????????????????tortoise.move_right();

????????????????break;

????????}

????}

????//用于响应用户按键的操作

????function move2(event){

????????

????????switch(event.keyCode){

????????????

????????????case 65:

????????????????tortoise.move_left(); //乌龟向左

????????????????break;

????????????case 68:

????????????????tortoise.move_right();

????????????????break;

????????????case 83:

????????????????tortoise.move_down();

????????????????break;

????????????case 87:

????????????????tortoise.move_up();

????????????????break;

????????????//响应用户按j这个键

????????????case 74:

????????????????//发送子弹的行为封装到fire

????????????????tortoise.fire();

????????????????break;

????????????default:

????????????????break;

????????}

????????

????}

?

</script>

</head>

<body onkeydown="move2(event)">

<table id="mytable" border="1">

<tr>

<td></td>

<td><input type="button" value="向上走" onclick="move(this)" /></td>

<td>shunping</td>

</tr>

<tr>

<td><input type="button" value="向左走" /></td>

<td></td>

<td><input type="button" value="向右走" onclick="move(this)" /></td>

</tr>

<tr>

<td></td>

<td><input type="button" value="向下走" /></td>

<td></td>

</tr>

</table>

?

<!--把乌龟放在一个div-->

<div id="wugui" style="position: absolute ;left:100px;top:120px;">

<img src="1.bmp" border="1" />

</div>

<div id="cock" style="left:200px;position:absolute;top:200px;">

<img src="2.bmp" border="1" />

</div>

</body>

</html>

?

考虑加入:

  • 让公鸡可以移动
  • 如果子弹击中公鸡,公鸡消失 [做成爆炸效果.]
  • 子弹可以向 上下左右 都可以发送.

12.1常用的dom 的每个Node 节点属性和方法(加强篇)

(取到父节点、兄弟节点、子节点等 )

?

<head>

<title>无标题页</title>

????<meta http-equiv="content-type" content="text/html;charset=utf-8"/>

</head>

<body>

<table border="1">

<tr>

<td></td>

<td><input type="button" value="向上走" onclick="move(this)" /></td>

<td></td>

</tr>

<tr>

<td><input type="button" value="向左走" onclick="move(this)" /></td>

<td></td>

<td><input type="button" value="向右走" onclick="move(this)" /></td>

</tr>

<tr>

<td></td>

<td><input type="button" value="向下走" onclick="move(this)" /></td>

<td></td>

</tr>

</table>

?

<div id="wugui" style="position: absolute ;left:100px;top:120px;">

<img src="1.bmp" border="1" />

</div>

?

<div id="cock" style="left:200px;position:absolute;top:200px;">

<img src="2.bmp" border="1" />

</div>

<input type="button" value="tesing" onclick="test()"/>

<input type="button" value="tesing2" onclick="test1()"/>

</body>

<script type="text/javascript">

?

????function test(){

????????

????????//得到乌龟节点

????????var wugui=document.getElementById("wugui");

?

????????window.alert("类型"+wugui.nodeType);

????????window.alert("名字"+wugui.nodeName);

?

????????var wugui_parent=wugui.parentNode;

?

????????window.alert("父节点类型"+wugui_parent.nodeType);

????????window.alert("父节点名字"+wugui_parent.nodeName);

????????var wugui_next_borther=wugui.nextSibling;

????????window.alert("下一个兄弟 类型"+wugui_next_borther.nodeType);

????????window.alert("下一个兄弟 名字"+wugui_next_borther.nodeName);

????????var wugui_pre_borther=wugui.previousSibling;

?

????????window.alert("前一个兄弟 类型"+wugui_pre_borther.nodeType);

????????window.alert("前一个兄弟 名字"+wugui_pre_borther.nodeName);

?

????????//取出孩子节点

????????var wugui_chlid=wugui.firstChild;

?

????????window.alert("孩子 类型"+wugui_chlid.nodeType);

????????window.alert("孩子 名字"+wugui_chlid.nodeName+wugui_chlid.src);

????}

????function test1(){

????????????document.bgColor="black";//背景色

????????????document.fgColor="white";//前景色

????????????window.alert(document.title+" "+document.URL);

????????}

</script>

</html>

13.body对象

body对象是document对象的一个成员属性,通过document.body来访问.

使用body对象,要求文档的主体创建后才能使用,也就是说不能在文档的body体还没有创建就去访问body,

?

Body常用属性:

appendChild() ????添加元素

removeChild() ????删除元素

getElementsByTagName() 通过html元素名称,得到对象数组.

bgColor ???? ????文档背景色

backgorund ???? ????文档背景图

innerText????????某个元素间的文本

innerHtml????????某个元素间的html代码

onload事件 ????文档加载时触发

onunload事件 ????文档关闭时触发

onbeforeunload事件 ????文档关闭前触发

该对象是 document对象的属性.

?

innerText????innerHTML

?

????<meta http-equiv="content-type" content="text/html;charset=utf-8"/>

</head>

<body>

?

<input type="button" value="tesing" onclick="test()"/>

?

<span id="myspan"></span>

</body>

<script type="text/javascript">

?

????function test(){

????????//myspan.innerText="<a href=‘http://www.sohu.com‘>连接到sohu</a>";

????????myspan.innerHTML="<a href=‘http://www.sohu.com‘>连接到sohu</a>";

????}

????

</script>

</html>

13.1Body案例:设置固定边栏广告!

<script id=clientEventHandlersJS language=javascript>

<!--

?

function window_onscroll() {

????//让这个超链接 top 和 left和滚动条,保持一个关系

????myHref.style.top=document.body.scrollTop+20;

????myHref.style.left=document.body.scrollLeft;

}

?

function document_onselectstart() {

????return false;//返回false,这样就可以禁止用户选网页中的文本 ,

//当用户选择文本时,会触发 onselectstart 事件,当返回false时,就不会选中

//你也可以在body加入 onselectstart="return false;"同样达到这个效果

}

?

//-->

</script>

<script language=javascript for=document event=onselectstart>

<!--

//这样的写法等同于再 body上 onselectstart=‘return false‘

window.alert(‘abc‘);

return document_onselectstart()

//-->

</script>

?

</head>

????<body onscroll="return window_onscroll()" >

????????<TEXTAREA id="Textarea1" name="Textarea1" rows="500" cols="500">

????????这个文本域足够大!

????????有着深远影响和价值的画,就是名画。

  一方面所谓的价值体现在作者本人的绘画功底上,有价值的画其作者的绘画功底一定是精湛的,是超凡脱群的,最起码也要有自己的风格,跟别人与众不同,这样才会受到关注。其次,光有精湛的水平也是不够的,还要在画面上体现一种精神,一种思想,也就是说要托画言志,用艺术的手法表现一种有高度的,更深一层的东西。比如说毕加索的格尔尼卡,它的价值就在于用新颖,深刻,抽象的表现手法将残酷的战争诠释的淋淋尽致,把战争的发人深省剖析开来给人看,这种影响是可以穿越肤色,穿越种族,穿越时间和空间的,是有深刻的历史高度的,同时画家自身的画技也不容忽视,所以说它是有价值的。再比如米勒的晚钟,虽然表现的是两位普普通通,穿着朴素,也许并没有什么高学历的勤劳农民,但是他们脸上那种对于上帝的虔诚,那种对于平凡生活的热爱,被米勒用饱含着感情的笔触描绘出来,用其影响力和感染力诠释着价值的内在。

  另一方面有些作品之所以成为名画,是因为它所要表达的内涵是永恒的,虽然诞生在那个时代,但是也同样是生活在现代的我们共同追求的大主题,配合着当时的时代背景,加上画家主观的表现提炼,这样创作出来的作品便被称为名画,因此它有着深远影响。

有着深远影响和价值的画,就是名画。

  一方面所谓的价值体现在作者本人的绘画功底上,有价值的画其作者的绘画功底一定是精湛的,是超凡脱群的,最起码也要有自己的风格,跟别人与众不同,这样才会受到关注。其次,光有精湛的水平也是不够的,还要在画面上体现一种精神,一种思想,也就是说要托画言志,用艺术的手法表现一种有高度的,更深一层的东西。比如说毕加索的格尔尼卡,它的价值就在于用新颖,深刻,抽象的表现手法将残酷的战争诠释的淋淋尽致,把战争的发人深省剖析开来给人看,这种影响是可以穿越肤色,穿越种族,穿越时间和空间的,是有深刻的历史高度的,同时画家自身的画技也不容忽视,所以说它是有价值的。再比如米勒的晚钟,虽然表现的是两位普普通通,穿着朴素,也许并没有什么高学历的勤劳农民,但是他们脸上那种对于上帝的虔诚,那种对于平凡生活的热爱,被米勒用饱含着感情的笔触描绘出来,用其影响力和感染力诠释着价值的内在。

  另一方面有些作品之所以成为名画,是因为它所要表达的内涵是永恒的,虽然诞生在那个时代,但是也同样是生活在现代的我们共同追求的大主题,配合着当时的时代背景,加上画家主观的表现提炼,这样创作出来的作品便被称为名画,因此它有着深远影响。

有着深远影响和价值的画,就是名画。

  一方面所谓的价值体现在作者本人的绘画功底上,有价值的画其作者的绘画功底一定是精湛的,是超凡脱群的,最起码也要有自己的风格,跟别人与众不同,这样才会受到关注。其次,光有精湛的水平也是不够的,还要在画面上体现一种精神,一种思想,也就是说要托画言志,用艺术的手法表现一种有高度的,更深一层的东西。比如说毕加索的格尔尼卡,它的价值就在于用新颖,深刻,抽象的表现手法将残酷的战争诠释的淋淋尽致,把战争的发人深省剖析开来给人看,这种影响是可以穿越肤色,穿越种族,穿越时间和空间的,是有深刻的历史高度的,同时画家自身的画技也不容忽视,所以说它是有价值的。再比如米勒的晚钟,虽然表现的是两位普普通通,穿着朴素,也许并没有什么高学历的勤劳农民,但是他们脸上那种对于上帝的虔诚,那种对于平凡生活的热爱,被米勒用饱含着感情的笔触描绘出来,用其影响力和感染力诠释着价值的内在。

  另一方面有些作品之所以成为名画,是因为它所要表达的内涵是永恒的,虽然诞生在那个时代,但是也同样是生活在现代的我们共同追求的大主题,配合着当时的时代背景,加上画家主观的表现提炼,这样创作出来的作品便被称为名画,因此它有着深远影响。

有着深远影响和价值的画,就是名画。

  一方面所谓的价值体现在作者本人的绘画功底上,有价值的画其作者的绘画功底一定是精湛的,是超凡脱群的,最起码也要有自己的风格,跟别人与众不同,这样才会受到关注。其次,光有精湛的水平也是不够的,还要在画面上体现一种精神,一种思想,也就是说要托画言志,用艺术的手法表现一种有高度的,更深一层的东西。比如说毕加索的格尔尼卡,它的价值就在于用新颖,深刻,抽象的表现手法将残酷的战争诠释的淋淋尽致,把战争的发人深省剖析开来给人看,这种影响是可以穿越肤色,穿越种族,穿越时间和空间的,是有深刻的历史高度的,同时画家自身的画技也不容忽视,所以说它是有价值的。再比如米勒的晚钟,虽然表现的是两位普普通通,穿着朴素,也许并没有什么高学历的勤劳农民,但是他们脸上那种对于上帝的虔诚,那种对于平凡生活的热爱,被米勒用饱含着感情的笔触描绘出来,用其影响力和感染力诠释着价值的内在。

  另一方面有些作品之所以成为名画,是因为它所要表达的内涵是永恒的,虽然诞生在那个时代,但是也同样是生活在现代的我们共同追求的大主题,配合着当时的时代背景,加上画家主观的表现提炼,这样创作出来的作品便被称为名画,因此它有着深远影响。

有着深远影响和价值的画,就是名画。

  一方面所谓的价值体现在作者本人的绘画功底上,有价值的画其作者的绘画功底一定是精湛的,是超凡脱群的,最起码也要有自己的风格,跟别人与众不同,这样才会受到关注。其次,光有精湛的水平也是不够的,还要在画面上体现一种精神,一种思想,也就是说要托画言志,用艺术的手法表现一种有高度的,更深一层的东西。比如说毕加索的格尔尼卡,它的价值就在于用新颖,深刻,抽象的表现手法将残酷的战争诠释的淋淋尽致,把战争的发人深省剖析开来给人看,这种影响是可以穿越肤色,穿越种族,穿越时间和空间的,是有深刻的历史高度的,同时画家自身的画技也不容忽视,所以说它是有价值的。再比如米勒的晚钟,虽然表现的是两位普普通通,穿着朴素,也许并没有什么高学历的勤劳农民,但是他们脸上那种对于上帝的虔诚,那种对于平凡生活的热爱,被米勒用饱含着感情的笔触描绘出来,用其影响力和感染力诠释着价值的内在。

  另一方面有些作品之所以成为名画,是因为它所要表达的内涵是永恒的,虽然诞生在那个时代,但是也同样是生活在现代的我们共同追求的大主题,配合着当时的时代背景,加上画家主观的表现提炼,这样创作出来的作品便被称为名画,因此它有着深远影响。

有着深远影响和价值的画,就是名画。

  一方面所谓的价值体现在作者本人的绘画功底上,有价值的画其作者的绘画功底一定是精湛的,是超凡脱群的,最起码也要有自己的风格,跟别人与众不同,这样才会受到关注。其次,光有精湛的水平也是不够的,还要在画面上体现一种精神,一种思想,也就是说要托画言志,用艺术的手法表现一种有高度的,更深一层的东西。比如说毕加索的格尔尼卡,它的价值就在于用新颖,深刻,抽象的表现手法将残酷的战争诠释的淋淋尽致,把战争的发人深省剖析开来给人看,这种影响是可以穿越肤色,穿越种族,穿越时间和空间的,是有深刻的历史高度的,同时画家自身的画技也不容忽视,所以说它是有价值的。再比如米勒的晚钟,虽然表现的是两位普普通通,穿着朴素,也许并没有什么高学历的勤劳农民,但是他们脸上那种对于上帝的虔诚,那种对于平凡生活的热爱,被米勒用饱含着感情的笔触描绘出来,用其影响力和感染力诠释着价值的内在。

  另一方面有些作品之所以成为名画,是因为它所要表达的内涵是永恒的,虽然诞生在那个时代,但是也同样是生活在现代的我们共同追求的大主题,配合着当时的时代背景,加上画家主观的表现提炼,这样创作出来的作品便被称为名画,因此它有着深远影响。

?

????????</TEXTAREA>

????????<a id = myHref href="http://www.sohu.com" style="LEFT: 0px; POSITION: absolute; TOP: 50px;word-break: keep-all"><img src="ad.bmp" /></a>

????</body>

</html>

13.2案例:广告图片在网页中飘动,碰到网页边沿改变漂移方向

<html >

<head>

<title>广告图片在网页中飘动</title>

</head>

<body style="BACKGROUND-IMAGE: url(./1.png)">

????<div id="div1" style="LEFT: 100px; POSITION: absolute; TOP: 0px"><img src="太阳.gif"/></div>

????<script language="javascript" type="text/javascript">

????<!--

????//向x方向移动速度

????var divX=1;

????//向y方向移动速度

????var divY=1;

????var posX=0;//div的x坐标

????var posY=0;//div的y坐标

?

????//window.alert(div1.offsetWidth+" "+div1.offsetHeight);

????function move(){

????????

????????//让div的横坐标 增加 2*divX

????????posX+=2*divX;

????????//让div纵坐标增加 2*divX

????????posY+=2*divY;

????????

????????div1.style.top=posY+"px";

????????div1.style.left=posX+"px";

????????//posX表示div碰到最左边

????????//posX+div1.offsetWidth>=document.body.clientWidth 碰到最右

????????// div自己的宽度

????????if(posX<=0||posX+div1.offsetWidth>=document.body.clientWidth){

????????????divX=-divX;

????????}

????????//posY表示碰到最上

????????//posY+div1.offsetHeight>=document.body.clientHeight 碰到最上

????????if(posY<=0||posY+div1.offsetHeight>=document.body.clientHeight){

????????????divY=-divY;

????????}

????}

????//启动一个定时器

????setInterval("move()",10);

????//-->

</script>

</body>

</html>

13.3随意拖拽窗口:用户用鼠标点中,浮动窗口,可以随意的拖拽该窗口。

技术分享

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

<title>拖动层</title>

</head>

?

<script language="javascript">

var x = 0, y = 0, x1 = 0, y1 = 0;

var moveable = false;

var index = 20000;

?

//开始拖动

?

function startDrag(obj, evt) {

e = evt ? evt : window.event;

?

// if (true) {

?

if (!window.captureEvents) {

?

obj.setCapture();

} else {

?

window.captureEvents(Event.MOUSEMOVE | Event.MOUSEUP);

}

var win = obj.parentNode;//取得父窗体(父窗体就是该div得上一级div)

win.style.zIndex = ++index;//设置父窗体的Z轴值

x = e.clientX;//取得当前鼠标的X坐标

y = e.clientY;//取得当前鼠标的Y坐标

x1 = parseInt(win.style.left);//将父窗体的距浏览器左边界的距离转换为NUMBER

?

y1 = parseInt(win.style.top);//将父窗体的距浏览器上边界的距离转换为NUMBER

moveable = true;

?

// }

}

function drag(obj, evt) {

?

e = evt ? evt : window.event;

if (moveable) {

?

var win = obj.parentNode;

win.style.left = x1 + e.clientX - x;

?

win.style.top = y1 + e.clientY - y;

?

}

}

//停止拖动

function stopDrag(obj) {

if (moveable) {

?

if (!window.captureEvents) {

obj.releaseCapture();

} else {

window.releaseEvents(Event.MOUSEMOVE | Event.MOUSEUP);

}

moveable = false;

}

}

</script>

<body>

<div id="l1"

style="position: absolute; width: 200px; height: 200px; background-color: #99CCFF; z-index: 200; top: 100px; left: 154px;">

<div id="title" onMouseDown="startDrag(this,event);"

onMouseMove="drag(this,event);" onMouseUp="stopDrag(this);"

style="width: 200px; height: 20px; background-color: #330033; top: 0px; left: 0px; z-index: 200; position: absolute; font-size: 9pt; color: #FFFFFF; padding-top: 5px; padding-left: 5px;">浮动窗口</div>

</div>

</body>

</html>

14.style

style对象不是针对某一个html元素,而是对所有的html元素而言的,也就是说,我们可以通过 document.getElementById("id").style.property="值",来控制网页文档的任何一个元素(对象)的样式,当然这个很重要的.

?

技术分享

?

14.1web版坦克大战(1)

<html>

<script type="text/javascript">

?

//面向对象

function Wall(){

}

?

function Bullet(){

}

function Water(){

?

}

?

function Hero(x,y){

????this.x=x;

????this.y=y;

????this.speed=1;

????this.direct=0;//0 -》上 1->右 2->下 3->左

?

????this.move_up=function(){

????????this.y-=this.speed;

????????myhero.style.backgroundPositionY="0px";

????????myhero.style.top=this.y+"px";

????}

????this.move_down=function(){

????????this.y+=this.speed;

????????myhero.style.backgroundPositionY="80px";

????????myhero.style.top=this.y+"px";

????}

????this.move_left=function(){

????????//首先让坦克转向

????????this.x-=this.speed;

????????myhero.style.backgroundPositionY="40px";

????????

????????myhero.style.left=this.x+"px";

????}

????this.move_right=function(){

????????this.x+=this.speed;

???? myhero.style.backgroundPositionY="120px";

????????myhero.style.left=this.x+"px";

????}

}

?

//创建自己的坦克

var hero=new Hero(100,250);

?

function sendCommand(){

????

????switch(window.event.keyCode){

????????

????????????case 65:

????????????????hero.move_left(); //自己坦克向左

????????????????break;

????????????case 68:

????????????????hero.move_right();

????????????????break;

????????????case 83:

????????????????hero.move_down();

????????????????break;

????????????case 87:

????????????????hero.move_up();

????????????????break;

????????????//响应用户按j这个键

????????????case 74:

????????????????//发送子弹的行为封装到fire

????????????????hero.fire();

????????????????break;

????????????default:

????????????????break;

????}

}

?

</script>

?

<!--作战区-->

<body onkeydown="sendCommand()">

<div style="width:400px;height:300px;background-color:black;position:absolute">

<div id="myhero" style="background-image: url(‘itank.gif‘);background-position-y: 0px;width:40px;height:40px;left:100px;top:250px;position:absolute"></div>

</div>

</body>

</html>

?

Css复习主要是看技术分享 这个很全面。

晚上:

让自己的坦克可以发送子弹.

子弹碰到边界,就?消失

?

显示敌人的坦克(3个)

?

当自己发射的子弹击中敌人坦克后,敌人坦克就爆炸

14.2如何去做网页层切换效果

代码:

<html >

<head>

????<link href="my.css" type="text/css" rel="stylesheet"/>

<title>无标题页6</title>

????<script language="javascript" type="text/javascript">

????<!--

????function change(obj,obj2){

????????//因为style在外边css,所以这样获取不到,但是设置后,就可以在本页获取了

????????//window.alert(content1.style.display);

????????//window.alert(obj.innerText.length+"="+"出国".length);

????????obj2.style.backgroundColor="#FFC63D";

????????if(obj=="zs"){

????????????//window.alert(‘招生‘);

????????????content1.style.display="block";

????????????content2.style.display="none";

????????????content3.style.display="none";

?

????????}else if(obj=="rz"){

????????????//window.alert(‘热招‘);

????????????content1.style.display="none";

????????????content2.style.display="block";

????????????content3.style.display="none";

????????}else if(obj=="cg"){

????????????//window.alert(‘出国‘);

????????????content1.style.display="none";

????????????content2.style.display="none";

????????????content3.style.display="block";

????????????

????????}

????}

????function change2(obj){

????????

????????obj.style.backgroundColor="#E8E8E8";

????}

????//-->

????</script>

</head>

<body>

????<div class="div1">

????<div class="navi">

????<ul>

????<li onmouseover="change(‘zs‘,this);" onmouseout="change2(this)">招生</li>

????<li onmouseover="change(‘rz‘,this);" onmouseout="change2(this)">热招</li>

????<li onmouseover="change(‘cg‘,this);" onmouseout="change2(this)">出国</li>

????</ul>

????</div>

????<div id="content2" class="content2">

????<ul>

????????<li><a href=‘#‘>热招热招热招月!</a></li>

????????<li><a href=‘#‘>热招热招热招月!</a></li>

????????<li><a href=‘#‘>热招热招热招月!</a></li>

????????<li><a href=‘#‘>热招热招热招月!</a></li>

????????<li><a href=‘#‘>热招热招热招月!</a></li>

????????<li><a href=‘#‘>热招热招热招月!</a></li>

????????<li><a href=‘#‘>热招热招热招月!</a></li>

????????<li><a href=‘#‘>热招热招热招月!</a></li>

????</ul>

????</div>

????<div id="content3" class="content3">

????<ul>

????????<li><a href=‘#‘>出国出国出国月!</a></li>

????????<li><a href=‘#‘>出国出国出国月!</a></li>

????????<li><a href=‘#‘>出国出国出国月!</a></li>

????????<li><a href=‘#‘>出国出国出国月!</a></li>

????????<li><a href=‘#‘>出国出国出国月!</a></li>

????????<li><a href=‘#‘>出国出国出国月!</a></li>

????????<li><a href=‘#‘>出国出国出国月!</a></li>

????????<li><a href=‘#‘>出国出国出国月!</a></li>

????</ul>

????</div>

????<div id="content1" class="content1">

????<ul>

????????<li><a href=‘#‘>澳洲留学高中月!</a></li>

????????<li><a href=‘#‘>澳洲留学高中月!</a></li>

????????<li><a href=‘#‘>澳洲留学高中月!</a></li>

????????<li><a href=‘#‘>澳洲留学高中月!</a></li>

????????<li><a href=‘#‘>澳洲留学高中月!</a></li>

????????<li><a href=‘#‘>澳洲留学高中月!</a></li>

????????<li><a href=‘#‘>澳洲留学高中月!</a></li>

????????<li><a href=‘#‘>澳洲留学高中月!</a></li>

????</ul>

????</div>

????</div>

????

</body>

</html>

?

My.css

body

{

font-size:12px;

margin:0;/*把body的边距清零*/

}

?

.div1{

????width:132px;/*width:128px;*/

????height:160px;

????/*background-color:pink;*/

}

.navi{

????height:160px;

????width:22px;

????/*background-color:green;*/

????float:left;

}

.navi ul{

????padding:0px;

????margin-left:0px;

}

.navi ul li{

????height:50px;

????width:22px;

????background-color:#E8E8E8;

????float:left;

????list-style-type :none;

????margin-top:3px;

????text-align:center;

????padding-top:5px;

}

.content3,.content1,.content2{

????height:160px;

????width:104px;

????margin-left:2px;

????/*background-color:blue;*/

????

????float:left;

}

.content2 ul,.content3 ul,.content1 ul{

????padding:0px;

????margin-left:4px;

????margin-top:2px;

????/*background-color:green;*/

}

.content2 ul li,.content3 ul li,.content1 ul li{

???? ?

????

????float:left;

????list-style-type :none;

????font-size:12px;

????line-height:20px;

????

}

.content2{

????display:none;

????

}

.content3{

display:none;

????

}

?

通过style对象,我们可以去控制某个html元素的外观.

补充讲解:

技术分享

?

14.3display 和 visiability 区别

这个属性都可以用于设置某个区域或者控件,显示不显示, display 设置 none; 它不显示同时让出自己占用的空间

visiability 这个属性设置成 hidden 就不显示, 但是它不让这个空间.

14.4style对象的案例:

技术分享

<body>

<span id="myspan" onclick="test(this);" style="border: 3px solid red;cursor:hand;

">+</span> 我的家庭

<ul id="myul" style="display:none">

<li>爸爸</li>

<li>妈妈</li>

<li>哥哥</li>

</ul>

?

</body>

<script type="text/javascript">

?

<!--

?

????function test(obj){

????????//myspan

????????if(obj.innerText=="+"){

????????????//显示成员

????????????myul.style.display="block";

????????????obj.innerText="-";

????????}else if(obj.innerText=="-"){

????????

????????????myul.style.display="none";

????????????obj.innerText="+";

????????}

????}

?

//-->

</script>

14.5style 的小案例- 简易购物车

技术分享

?

<body>

?

<h1>请选择你喜欢的水果</h1>

?

<input type="checkbox" onclick="shop(this,10)" price="10" name="fruits" value="苹果">苹果 10<br/>

<input type="checkbox" onclick="shop(this,20)" price="20" name="fruits" value="西瓜">西瓜 20<br/>

<input type="checkbox" onclick="shop(this,30)" price="30" name="fruits" value="香蕉">香蕉 30<br/>

<input type="checkbox" onclick="shop(this,40)" price="40" name="fruits" value="葡萄">葡萄 40<br/>

<input type="checkbox" onclick="shop(this,50)" price="50" name="fruits" value="桃">桃 50<br/>

?

<span id="showres"></span>

</body>

<script type="text/javascript">

?

<!--

????var allPrice=0;

????function shop(obj,price){

????????

????????//遍历整个复选框,看看谁被选中.

????/*????var frutis=document.getElementsByName("fruits");

????????for(var i=0;i<frutis.length;i++){

????????????//if(frutis[i].checked){

????????????//????window.alert(frutis[i].value+"被选中"+" 该价格是"+frutis[i].price);

????????????//}

????????????if(frutis[i].checked){

????????????????allPrice+=parseInt(frutis[i].price);

????????????}

????????}*/

?

????????//直接判断点击行为是选中,还是取消,然后是决定对allPrice进行+,-

?

????????if(obj.checked){

????????????//window.alert("中");

????????????allPrice+=parseInt(obj.price);

????????}else{

????????????//window.alert("取消");

????????????allPrice-=parseInt(obj.price);

????????}

????????showres.innerText=allPrice;

????}

//-->

</script>

  1. forms对象集合和form对象

15.1案例一:

?

这里我们说明form对象

form对象名.某控件名.

?

<body>

?

<form action="a.php" method="post">

u:<input type="text" name="username" value="hello"/><br/>

p:<input type="password" name="password" value="xxx"/><br/>

<input type="submit" value="提交"/>

?

</form>

?

<form action="b.php" method="post">

u:<input type="text" name="username"/>

</form>

?

<input type="button" onclick="mysubmit()" value="提交"/>

</body>

<script type="text/javascript">

?

<!--

?

????//window.alert(document.forms.item(1).action);

????

????//取出第一个from

????function mysubmit(){

?

????var form1=document.forms.item(1);

????

????//window.alert(form1.username.value);

????//window.alert(form1.password.value);

????

????form1.submit();

????}

?

//-->

</script>

15.2案例2:验证用户注册

技术分享

<html>

<head>

<meta http-equiv="content-type" content="text/html;charset=utf-8"/>

<script type="text/javascript">

????function check(){

????????//通过表单对象来回去用户的输入

????????var form = document.forms.item(0);

????????var name=form.username.value;

????????var passwd=form.passwd.value;

????????var passwd2=form.passwd2.value;

????????//window.alert(name+passwd+passwd2);

????????if(name.length<4 || name.length>6){

????????????????//window.alert("error");

????????????????error1.style.display="inline";

????????????????return false;

????????????}

????????if(passwd!=passwd2){

????????????????error2.innerText="两次密码不一致";

????????????????error2.style.display="inline";

????????????????return false;

????????????}

????}

</script>

</head>

<body>

<h1>用户注册</h1>

<form action="">

<table border="0">

<tr><td>用户 名:</td><td class="style2"><input class="style1" type="text" id="username" name="username"/><span style="display: none;color: red;font-size: 10px" id="error1">用户名必须在4-6位间</span></td></tr>

<tr><td>密  码:</td><td><input class="style1" type="password" name="passwd" id="passwd"/></td></tr>

<tr><td>确认密码</td><td><input class="style1" type="password" name="passwd2" id="passwd2"/><span style="display: inline;color: red;" id="error2"></span></td></tr>

<tr><td>年  龄</td><td><input class="style1" type="text" name="age" id="age"/></td></tr>

<tr><td>电子邮件</td><td><input class="style1" type="text" name="email" id="email"/></td></tr>

<tr><td>电话号码</td><td><input class="style1" type="text" name="phone" id="phone"/></td></tr>

<tr><td><input type="submit" onclick="return check();" value="注册用户"></td><td><input type="reset" value="重新填写"/></td></tr>

</table>

</form>

</body>

</html>

15.3案例:文本框中自动设置鼠标光标!

技术分享

?

<html>

<head>

?

</head>

<body>

?

<form>

name:<input type="text" id="text1" />

age: <input type="text" id="text2" />

<br />

<input type="button" onclick="setFocus()" value="Set focus" />

<input type="button" onclick="loseFocus()" value="Lose focus" />

</form>

?

</body>

<script type="text/javascript">

?

document.getElementById("text1").focus();

?

</script>

</html>

16.table 对象是我们的一个重点

概述,在我们的网页中,每出现一次 table标签,就会有一个table对象产生.

?

table对象 中的集合对象有两个

rows[] 还有一个 cells[]

?

rows[] 表示所有行的一个集合

cells[] 表示一行的所有列

16.1快速入门案例

技术分享

要求,点击testing 按钮可以显示 宋江的名字,但是不能通过id 获取 table对象来获取.

<html>

<head>

<script type="text/javascript">

????function test(){

????????

????????//window.alert(document.getElementById(‘name‘).innerText);

????????

????????var mytable=document.getElementById("mytab");//mytable就是一个table对象

????????window.alert(mytable.rows[2].cells[2].innerText);

?

????????//window.alert(typeof(mytable));

????????//请取出卢俊义的外号

?

????}

?

????function addHero(){

????????//创建一个

????????//document.createElement("<tr>");

????????//添加一行

????????var mytable=document.getElementById("mytab");

????????//3表示添加到表格的第几行

????????//tableRow表示一个新行,它的类型是TableRow

????????var tableRow=mytable.insertRow(3); //<tr></tr>

????????//通过tableRow添加新列 tableCell类型是 TableCell

????????var tableCell=tableRow.insertCell(0); //<tr><td></td></tr>

????????tableCell.innerHTML="3"; //<tr><td>3</td></tr>

?

????????var tableCell1=tableRow.insertCell(1);

????????tableCell1.innerHTML="吴用"; //<tr><td>3</td><td>吴用</td></tr>

????????var tableCell2=tableRow.insertCell(2);

????????tableCell2.innerHTML="智多星"; //<tr><td>3</td><td>吴用</td></tr>

????}

????function deleteHero(){

????????//删除一个英雄

????????var mytable=document.getElementById("mytab");

????????mytable.deleteRow(3);

????}

????function updateHero(){

????????//找到宋江的外号这个对象<td></td> TableCell

????????var mytable=document.getElementById("mytab");

????????mytable.rows[1].cells[2].innerHTML="黑三郎";

????}

</script>

</head>

<body>

<table id="mytab" border="1px">

<tr><td>排名</td><td>姓名</td><td>外号</td></tr>

<tr><td>1</td><td>宋江</td><td>及时雨</td></tr>

<tr><td>2</td><td>卢俊义</td><td>玉麒麟</td></tr>

</table>

<input type="button" onclick="test()" value="tesing"/>

<input type="button" onclick="addHero()" value="添加"/>

<input type="button" onclick="deleteHero()" value="删除"/>

<input type="button" onclick="updateHero()" value="修改"/>

?

</body>

</html>

16.2Table对象的综合案例

技术分享

?

实现两个功能:1.动态添加 2.如果有重复,弹出了跳窗有重复。

?

<html>

<head>

<script type="text/javascript">

?

????function addhero(){

????????

????????//获取用户的输入信息

????????var no=document.getElementById(‘no‘).value;

????????var heroname=document.getElementById(‘heroname‘).value;

????????var nickname=document.getElementById(‘nickname‘).value;

????????var mytab=document.getElementById(‘mytab‘);

????????//window.alert(no+" "+heroname+" "+nickname);

????????//先判断,再添加

????????for(var i=0;i<mytab.rows.length;i++){

????????????if(mytab.rows[i].cells[0].innerHTML==no){

????????????????window.alert("编号重复");

????????????????return false;

????????????}

????????????//在遍历的时候,要想办法确定这个新的英雄,适当的位置.

????????}

????????//添加一行

????????//获取table对象

????????var tableRow=mytab.insertRow(mytab.rows.length);

????????tableRow.insertCell(0).innerHTML=no;

????????tableRow.insertCell(1).innerHTML=heroname;

????????tableRow.insertCell(2).innerHTML=nickname;

????????tableRow.insertCell(3).innerHTML="<a href=‘#‘ onclick=‘abc(‘"+no+"‘)‘>删除用户</a>"

????}

</script>

</head>

<body>

<table id="mytab" border="1px">

<tr><td>排名</td><td>姓名</td><td>外号</td><td>删除</td></tr>

</table>

<h1>请输入英雄的信息</h1>

排名<input type="text" id="no" name="no"/><br/>

名字<input type="text" id="heroname" name="heroname" /><br/>

外号<input type="text" id="nickname" name="nickname" /><br/>

<input type="button" onclick="addhero()" value="添加"/>

</body>

</html>

十七、js的正则表达式

  • 为什么要学习正则表达式?

?

比如身份证., 电话.. 邮件.. 。。

1.正则表达式介绍

?

正则表达式,实际上是一个语法规则, 通过这个表达式,可以去匹配满足这个语法规则的字串. , 我们可以通过创建 RegExp 对象来创建规范

?

RegExp (regular expression)

2.快速入门案例:

从一个字串中,寻找 四个数字相互连接的案例 :

<html>

<head>

<script type="text/javascript">

?

????var str="akdlfaklhello 1234klfdksalfd9000kalsj2345fd;lsa"

?

????//创建一个正则对象 \d表示一个数 100数字相连

????//var reg=/(\d){4}/gi; //reg表示一个语法 //gi [g表示全局][i表示是否区分大小写] \d 表示任意的数 (\d) 表示子表达式

????var reg=new RegExp("(\\d){4}","gi");//显示创建

????var res="";

????while(res=reg.exec(str)){ //res 表示找到一个结果,该结果是一个数组. [0]->结果是什么 如果 正则表达式有子表达式,[1]->第一个子表达式的结果

????//[2]->第2个子表达式的结果 ...

????????window.alert(res);

????}

????

</script>

</head>

<body>

?

</body>

</html>

?

?

2.1找到四个数字,个位和仟位,十位和百位相同

<html>

<head>

<script type="text/javascript">

????var str="akdlfaklhello 1234klfd1441ksalfd9000kals8998j2345fd;lsa"

?

????//创建一个正则对象 \d表示一个数 100数字相连

????var reg=/(\d)(\d)\2\1/gi; //reg表示一个语法 //gi [g表示全局][i表示是否区分大小写] \d 表示任意的数 (\d) 表示子表达式

????

????var res="";

????while(res=reg.exec(str)){ //res 表示找到一个结果,该结果是一个数组. [0]->结果是什么 如果 正则表达式有子表达式,[1]->第一个子表达式的结果

????//[2]->第2个子表达式的结果 ...

????????window.alert(res);

????}

????

</script>

</head>

</html>

3.正则表达式详解

问正则表达式是什么?

答: 正则表达式是一个语法(句法)规则,通过该规则可以从一个大的字符串中去匹配满足该规则的 子字符串.

4.正则表达式对象

创建方法

  • 隐式创建

?

var reg=/pattern/gi 【g 表示全局, i表示在匹配的时候不区分大小写,m 表示多行匹配】

?

举例说明 gmi 的含义

代码 reg3.html

<html>

<head>

<script type="text/javascript">

?

????var str="aklfdjakabcadkflsakfabclABCsa";

?

????//需求,使用正则找到 abc子串

?

????var reg=/abc/gim;

?

????//使用reg对象方法 exec null "" 0

????//res 是一个数组 [0]->找到的子串 res[1]=> 是一个子表达式的内容 res[2]=>

????var res="";

????//执行正则表达式

????while(res=reg.exec(str)){

????????

????????window.alert(res[0]);

????}

????

</script>

</head>

<body>

?

</body>

</html>

?

reg4.html:

<script type="text/javascript">

var str="wwlkel123fklsd908wwlkk \r\nwwl";

?

//var myReg=/(\\d){3}/gi;

//new RegExp("^(Wwl)","igm"); 表示找到每行的开头的 wwl字符(不区分大小写)

var myReg=new RegExp("^(Wwl)","ig");//m就会找到两个wwl,如果没有m就会只找到一个wwl就是头一个,通常我们使用gi

while(res=myReg.exec(str)){

window.alert(res[0]);

}

</script>

?

执行正则表达式的第二个方法:

var res2=str.match(reg); //该方法比较简单,会返回得到子串的数组

?

????for(var i=0;i<res2.length;i++){

????????window.alert(res2[i]);

????}

?

  • 显式创建

var reg=new RegExp("pattern","选项gim");

?

3.方法

exec() 方法

test() 方法,可以检测一个字串中,是否含义满足 正则规范的子串. 返回true,或者fasle

?

?

5.String对象的几个方法

match search replace split

?

代码:

<html>

<head>

<script type="text/javascript">

?

????var str="aklfabcdj1234akabcadkfl韩顺sakfabc5678lABCsa";

?

????/*var reg=/韩顺平/gi;

?

????if(reg.test(str)){

????????window.alert("含有");

????}else{

????????window.alert("没有");

????}*/

?

????//现在我们把abc子串转成 北京

????

/*????var reg=/abc/gi;

????var newStr=str.replace(reg,"北京");

?

????window.alert(newStr);*/

?

????var reg=/(\d){4}/gi;

????//按照正则表达式来分割

????var newStr=str.split(reg);

?

????for(var i=0;i<newStr.length;i++){

????????window.alert(newStr[i]);

????}

?

????

</script>

?

</head>

<body>

?

</body>

</html>

?

?

6.综合小案例:

技术分享

?

代码:

<script type="text/javascript">

?

function abc(){

?

????//先得到用户输入

????var inputcon=document.getElementById(‘myta‘).innerText; //value

????//得打text1

????var text1=document.getElementById(‘text1‘).value;

????var test2=document.getElementById("text2").value;

????var reg="/"+text1+"/gi"; //abc /abc/gi

?

????window.alert("reg"+reg);

????//str怎么当做对象.

????var newString=inputcon.replace(eval(reg),test2);

?

????//把新的串放入到第二个文本域

????document.getElementById("myta2").innerText=newString;

?

}

?

</script>

?

<h1>替换小测试</h1>

<textarea cols="30" rows="7" id="myta" >

hello

</textarea>

&nbsp;&nbsp;&nbsp;&nbsp;

?

<textarea cols="30" rows="7" id="myta2">

</textarea>

<br />

<br />

请输入你要查找的字符串:<input type="text" id="text1" /> <br /><br />

请输入你要替换成什么穿:<input type="text" id="text2" /><br />

<input type="button" value="开始替换" onclick="abc()" />

7.正则表达式中重要的概念

  1. 子表达式

我们可以用圆括号组成一个比较复杂的匹配模式,那么一个圆括号的

部分我们可以看作是一个子表达式。

?

举例

?

var reg=/(\d)([a-z])/gi

?

(\d)就是第一个子表达式

([a-z]) 是第二个子表达式

  1. 捕获

多个子表达式所匹配到的内容按顺序出现在内存的缓冲区中,这个我

们称为捕获

  1. 反向引用

圆括号的内容被捕获后,可以在这个括号后被使用,从而写出一个比

较实用的匹配模式,这个我们称为反向引用

?

?

var str="1adkk"

var reg=/(\d)([a-z])/gi

?

把 (\d)匹配到的结果 1 放入缓存区 =》引用 \1

把 ([a-z])匹配的内容 a 放入缓存区 => 引用\2

?

?

?

思考题:

?

请思考下面的问题:

请在字符串中检索商品编号,形式如:12321-333999111 这样的号码,要求满足前面是一个五位数,然后一个-号,然后是一个九位数,连续的每三位要相同

?

代码:

?

var str = "aaaaabbbb45678-678900034bv123hhh55555 88888 99999 12345-444555999777";

?

var reg=/(\d){5}-(\d)\2{2}(\d)\3{2}(\d)\4{2}/gi;

?

???? var regs=str.match(reg);

?

???? for(var i=0;i<regs.length;i++){

????????window.alert(regs[i]);

???? }

8.正则表达式语法的细节:

8.1常用的正则表达式

<script type="text/javascript">

//????var str="1111111";

????//{n} n 是一个非负整数。匹配确定的 n 次。

//????var reg=/1{2}/gi;

????//{n,m} 表示指定字符串出现次数大于等于n小于等于m m>=n

???? //使用贪婪匹配模式

//???? var reg=/1{3,5}/gi;

?

????//+ 表示出现1次到任意多次

????//* 表示出现0次到任意多次

//????var reg=/1+/gi;

?

????//? 表示出现0次到1次

//????var reg=/a1?/gi;

?

????//[a-z] 表示可以匹配a-z中任意一个字符

????//[0-9] 表示可以匹配0-9中任意一个字符

????//[a-zA-Z0-9] 表示可以匹配a-z或者 A-Z或者0-9中任意一个字符

//????var str="hell.....o111";

//????var reg=/[a-z]/gi;

????

????//[^a-z] 表示可以匹配不是a-z中的任意一个字符

//????var reg=/[^a-z]/gi;

????

????//[abcd] 表示可以匹配abcd中的任意一个字符。

????//[^abcd] 表示可以匹配不是abcd中的任意一个字符

//????var reg=/[^abcd]/gi;

?

//????. 匹配出 \n 之外的所有字符,如果要匹配.本身则需要使用 \.

//????var reg=/\./gi;

?

????//([\d\D])\1{2} 任意三个连续的字符

//????var reg=/([\d\D])\1{2}/gi;

?

????//xn的用法 特殊的字符可以使用\xn

//????var reg=/\x21/gi;

????

????//^ 匹配目标字符串的开始位置

//???? var str="hanjjkj hihihi han";

//???? var reg=/^han/gi;

????

????//$ 匹配目标字符串的结束位置

//???? var reg=/han$/gi;

????// \ 检索某些特殊字符的时候,需要用到转义符号,否则检索不到结果,

???? //需要用到转义符号的字符 . * + ( ) $ / \ ? [ ] ^ { }

//???? var reg=/\$/gi;

?

????//选择匹配符号 | 既可以匹配这个,又可以匹配那个

???? var reg=/\$ | han/gi;

????

????var res=str.match(reg);

????window.alert(res+"发现位置"+RegExp.index);

</script>

8.2电子邮件的正则表达式

<script type="text/javascript">

var str = "hashunping@sohu.com.";

/*只能有一个@,@前面是用户名,可以是a-z A-Z 0-9 _-字符 @后面是域名,可以是sohu.com 或者 tsinghua.org.cn 并且域名只能是英文字母163.com*/

?

// var reg= /[a-zA-Z0-9]+@[a-zA-Z0-9]+\.[a-zA-Z]/gi; //验证是否是电子邮件的reg

var reg=/^[a-zA-Z0-9_]+@[a-zA-Z]+(\.[a-zA-Z]+)+$/gi;

if(reg.test(str)){

window.alert("格式ok");

}else{

window.alert("电子邮件的格式不ok");

}????

</script>

?

8.3结巴程序:

<script type="text/javascript">

var str = "我....我要....学学学学....编程程程程程程phppppppp";

?

//1.考虑把.去掉

var reg1=/\./gi;

var reg2=/(.)\1+/gi; //用于去捕获出现多次的字符

var res1=str.replace(reg1,"").replace(reg2,"$1");

window.alert(res1);

</script>

JavaScript学习

标签:

原文地址:http://www.cnblogs.com/Prozhu/p/5569675.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!