JavaScript学习

目录

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" alt="" height=60px; width=80px;/>

        </div>

        <div id="cock" style="left:200px;position:absolute;top:200px;">

        <img src="image/2.bmp" border="1" alt="" 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" alt="" />

</div>

<div id="cock" style="left:200px;position:absolute;top:200px;">

<img src="2.bmp" border="1" alt="" />

</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" alt="" />

</div>

 

<div id="cock" style="left:200px;position:absolute;top:200px;">

<img src="2.bmp" border="1" alt="" />

</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>

posted @ 2016-06-08 12:26  runningto  阅读(680)  评论(0编辑  收藏  举报