JavaScript

JavaScript

JS代码需要编写到Script标签中

<script type="text/javascript">

</script>
警告框
<script type="text/javascript">
alert("警告框");
</script>
让计算机在页面中输出内容
/*作用是向body中输出一个内容*/
document.write("要输出的内容");
向控制台输出一个内容
console.log("向控制台内容");

 

  • 可以将js代码编写到标签的onclick属性中

当点击按钮时,js代码才会执行

<button onclick="alert('点击时提示框上的字');">点我干嘛</button>
  • 可以将代码写在超链接的href属性中,这样当点击超链接时,会执行js代码

<a href="javascript:alert('提示框上的提示语');">按钮</a>

/*此时实现点击超链接没有反应*/
<a href="javascript:;">按钮</a>

虽然写在标签的属性中,但他们属于结构和行为耦合,不方便维护,不推荐使用。

 

将js代码编写到外部的js文件中,通过script标签引入

script标签一旦用于引入外部文件了,就不能在编写代码了,即使编写了浏览器也会忽略;如果需要则可以再创建一个新的script标签用于编写内部代码。

执行顺序为从上到下一行一行的执行。

<script type="text/javascript" src="js/script.js"></script>
JS语法的注释

/* */ 多行注释

// 单行注释

 

  • JS中严格区分大小写。

  • JS中每一条语句以分号 ; 结尾。

    • 如果不写分号,浏览器会自动添加,但是会消耗一些系统资源,而且有些时候,浏览器会加错分号,所以在开发中分号必须写。

  • JS中会忽略多个空格和换行,所以我们可以利用空格 &nbsp 和换行对代码进行格式化

 

字面量和变量

字面量:都是一些不可改变的值;字面量都是可以直接使用,但是我们一般都不会直接使用字面量

变量:可以用来保存字面量,而且变量的值可以任意改变,变量更方便使用。

声明变量

JS中使用 var 关键字来声明一个变量

var a;

 

标识符

在JS中所有的可以有我们自主命名的都可以成为是标识符

例如:变量名,函数名,属性名都属于标识符

命名一个标识符时需要遵守如下的规则:

1.标识符中可以含有字母,数字,_ ,$

2.标识符不能以数字开头

3.标识符不能是ES中的关键字或保留字

4.标识符一般都采用驼峰命名法

- 首字母小写,每个单词的开头字母大写,其余字母小写;eg:helloWorld

数据类型

数据类型指的就是字面量的类型

  • 在JS中一共有六种数据类型

    • String 字符串

    • Number 数值

    • Boolean 布尔值

    • Null 空值

    • Undefined 未定义

    • Object 对象

其中前5种是基本数据类型,而Object属于引用数据类型。

字符串

要使用引号引起来

  • 双引号和单引号到可以,但不要混着用

  • 引号不能嵌套,双引号不能放双引号,单引号不能放单引号

var str="hello";
转义字符

在字符串中使用 \ 作为转义字符。在符号前加。

\n 表示换行

\t 制表符

\ \ 表示\

 

alert("str");  //输出str字符串
alert(str);		//输出变量str
Number

在JS中所有的数值都是Number类型,包括整数和浮点数(小数)。

typeof 检查变量类型

会返回类型

typeof a;

 

  • JS中可以表示的数字的最大值为 Number.MAX_VALUE

    如果使用Number表示的数字超过了最大值,则会返回一个Infinity,表示正无穷,-Infinity表示负无穷,使用typeof检查Infinity也会返回Number

  • NaN 是一个特殊的数字,表示Not A Number;

  • Number.MIN_value 大于0的最小值,正值。

 

注意:如果用JS进行浮点运算,可能得到一个不精确的结果,所以千万不要使用JS进行对精确度要求比较高的运算。

Boolean 布尔值

true - 表示真

false - 表示假

//注意,不加引号
var bool=true;

 

  • Null(空值)类型的值只有一个,就是null,努力了这个值专门用来表示一个为空的对象,使用typeof检查一个null值时,会返回object。

  • Undefined(未定义)类型的值只有一个,就undefind,当声明一个变量,但是并不给变量赋值时,他的值就是undefined,使用typeof检查一个undefined时也会返回一个undefined

强制类型转换

  • 指将一个数据类型强制转换为其他的数据类型

  • 类型转换主要指,将其他的数据类型,转换为String Number Boolean

将其他的数据类型转换为String
方法一:
  • 调用被转换数据类型的toString()方法

  • 该方法不会影响到原变量,他会将转换的结果返回

  • 注意:null和undefined这两个值没有toString()方法

    var a = 123;
    //调用a的toString()方法
    //调用xxx的yyy方法,就是xxx.yyy()
    a = a.toString();
方式二:
  • 调用String()函数,并将被转换的数据作为参数传递给函数 //调用什么函数就直接写 String()

  • 使用String()函数做强制类型转换时,对于Number和Boolean实际上就是调用打的toString()方法,但是对于null和undefined,就不会调用toString()。它会将null和undefined转换成“null”和“undefined”。

a = String(a);
方式三:(隐式)

任意的数据类型 + 一个""(空串),即可转化为String类型。

将其他的数据类型转换为Number
转换方式一:

使用Number()函数:

- 字符串 -- > 数字

1 如果是纯数字的字符串,则直接转换

2 如果字符串中有非数字的内容,则转换为NaN

3 如果字符串是一个空串或者全为空格,转换为0

- 布尔值 -- > 数字

true --> 1 false --> 0

- Null --> 0

- undefined --> 0

转换方式二:
  • parseInt()把一个字符串转换为一个整数

    parseInt()可以将一个字符串中的有效的整数内容取出来,从左到右直到检测到非数字。

  • parseFloat()把字符转换成浮点数

var a = "123"; //"abc"  转不了
a = Number(a); 
其他进制的数字

在js中,16进制需要以0x开头

a = 0x10; //16

8进制,以0开头

a = 070; //56

2进制,以0b开头,但不是所有浏览器都支持。

//像”070“这种字符串,有些浏览器会当成8进制解析,有些会当成10进制解析
a = "070";
//解决方法
a = parseInt(a,10); //第二个参数表示进制
转换为Boolean
  • 使用Boolean()函数

    数字 --> 布尔 :除了NaN和0,其余都是true

    字符串 -- > 布尔 :除了空串,其余都是true

    null --> false

    undefined --> false

    对象也会转换为true

  • 方式二:(隐式类型转换)

    为任意的数据类型做两次非运算,即可将其转换为Boolean类型

运算符

算术运算符:

加法:

-对非Number类型的值进行运算时,会将这些值转换为Number类型然后运算

-任何值和NaN做运算都得NaN

-两个字符串进行加法运算,则会拼串(将两个字符串转换成一个字符串)

-任何字符串加法运算,将值转换为字符串,再做拼串

//我们可以利用这一特点,将任意数据类型转换为String;我们只需要为任意的数据类型 + 一个""(空串),即可转化为String类型。这是一种隐式类型转换,也是调用String()函数。

var c = "123";
c = c + "";
减法:除了加法其余都是转化成Number类型再进行运算

单目运算符

转换为数值类型的最简便写法

var a = "123";
a = +a;
非布尔值的与或运算
与运算:

如果两个值都为true,则返回后边的,

如果两个值中有false,则返回靠前的false

或运算

如果第一个值为true,则直接返回第一个值

如果第一个值为false,则直接返回第二个值

关系运算(比较)

非数值类型要转换成数值类型进行比较

如果字符串进行比较,就比较ASCII码,从左到右比较,若两值相同,在比较下一个。字符型的数字之间实现比较可以

console.log("1235456"< +"5");	//字符型的数字之间实现比较可以在前面加个+号实现数字之间的比较
Unicode编码

Unicode编码以 \u 开头

一般浏览器识别Unicode以 &#开头,并且编码是十进制

<h1>&#9760;</h1>

 

代码块

JS中可以用{}进行分组,要么都执行,要么都不执行,称之为代码块。

对象

 

创建一个对象
var obj = new Object();
向对象添加属性

语法:对象.属性名 = 属性值;

obj.name = "孙悟空";
读取对象中的属性

语法:对象.属性名

console.log(obj.name);
修改对象的属性值

语法:对象.属性名 = 新值

删除对象属性

语法:delete 对象.属性名

如果要使用特殊的属性名,不能采用.的方式来操作,需要使用另外一种方式:

语法:对象["属性名"] = 属性值

Obj["123"] = 789;
//存的时候这么存,读取的时候也要这么取
console.log(obj["123"]);

使用[]这种形式去操作属性,更加的灵活,在[]中可以直接传递一个变量,这样变量值是多少就会读取那个属性

var n = "123";
console.log(obj[n]);
属性值

JS中的属性值可以是任意的数据类型;也可以是一个对象。

in运算符

通过该运算符可以检查一个对象中是否含有指定的属性,如果有则返回true,没有则返回false

语法:"属性名" in 对象

console.log("test2" in obj);	//检查obj中是否有test2。
  • 基本数据类型保存的是值,引用数据类型保存的是地址。

对象字面量

使用对象字面量来创建一个对象

var obj = {};
可以利用字面量创建对象的多个属性

语法:{属性名:属性值,属性名:属性值...};

对象字面量的属性名可以加引号也可以不加,建议不加,如果使用一些特殊的名字,则必须加引号

var obj = {
	name:"猪八戒",
	age:28,
	gender:"男",
	test:{name:"沙和尚"}
};
创建对象的方法(函数)

语法:对象名.方法名 = function(){}

 

函数 function

  • 函数也是一个对象

  • 函数中可以封装一些功能(代码),在需要时可以执行这些功能(代码)

创建一个函数:

var fun = new Function();

可以将要封装的代码以字符串的形式传递给构造函数;分装到函数里的代码不会立即执行,函数中的代码会在函数调用的时候执行

var fun = new Function("console.log('hello')");
函数调用

语法:函数对象()

fun();	//调用函数时,函数中的代码会按照顺序执行
创建函数
- 使用函数声明

语法:function 函数名(形参1,形参2...形参N){语句。。。}

function fun2(){
}
- 使用函数表达式

语法: var 函数名 = function(形参1,形参2....形参N){语句。。。}

var fun3 = function(){
	return b;	//可以利用return设置返回值,不需要返回值不用写
}
  • 函数参数可以是任意类型

  • 实参可以是一个对象,也可以是一个函数

    注意:函数() 是调用函数 - 是将函数返回值传给函数

    函数 是函数对象 - 是将函数传给函数

fun(fun1());	//使用fun1的返回值
fun(fun);		//使用fun()函数
立即执行函数

函数定义完,立即被调用,这种函数叫做立即执行函数,立即执行函数只会执行一次

语法:匿名函数用括号括起来,后面加上括号

(function(){
	//立即执行函数
})();
for...in 语句 对象中有几个属性,循环体就会执行几次

语法:for(var 变量 in 对象){}

每执行一次,就会将对象中的一个属性的名字赋值给变量

for(var n in obj){
	console.log(n);	//n是属性名
	console.log(obj[n]);	//不能用.的方式
}
作用域
  1. 全局作用域

    • 直接编写在script标签中的JS代码,都在全局作用域中;全局作用域在页面打开时创建,页面关闭时销毁

    • 在全局作用域中有一个全局对象window,代表的是浏览器窗口,由浏览器创建;我们可以直接使用

    • 在全局作用域中,我们创建的变量都会作为window对象的属性保存

  2. 函数作用域

    • 在函数中,不使用var声明的变量都会成为全局变量

变量的声明提前

使用var关键字声明的变量,会在所有的代码执行之前被声明(但是不会赋值),但是如果声明变量时不使用var关键字,则变量不会被声明提前

函数的声明提前

 

this

解析器在调用函数每次都会向函数内部传递一个隐含的参数,这个隐含的参数就是this,this指向的是一个对象,这个对象我们成为函数执行的上下文对象

根据函数调用的方式不同,this会指向不同的对象:

	1. 以函数的形式调用时,this永远都是window
	2. 以方法的形式调用时,this就是调用方法的对象
function fun(){
	console.log(this.name);
}
var obj = {
	name:"1",
	sayName:fun
};
var obj2 = {
	name:"2",
	sayName:fun
};
obj.sayName();
使用工程的方法创建对象

通过该方法可以大批量的创建对象

function cratePerson(name,age,gender){
	//创建一个新的对象
	var obj = new Object();
	
	//向对象中添加属性
	obj.name = name;
	obj.age = age;
	obj.gender = gender;
	obj.sayName = function(){
		alert(this.name);
	};
	//将新的对象返回
	return obj;
}
var obj2 = createPerson();
构造函数

创建一个构造函数,专门用来创建Person对象的

构造函数就是一个普通的函数,创建方式和普通函数没有区别,不同的是构造函数习惯上首字母大写。

构造函数和普通函数的区别就是调用方式的不同;普通函数是直接调用,而构造函数需要使用new关键字来调用

构造函数执行流程:

		1. 立刻创建一个新的对象
		2.  将新建的对象设置为函数中this,在构造函数中可以使用this来引用新建的对象
		3.  逐行执行函数中的代码
		4. 将新的对象作为返回值返回

使用同一个构造函数创建的对象,我们称为一类对象,也将一个构造函数称为一个类

我们将通过一个构造函数创建的对象,称为是该类的实例

function Person(name){
	this.name = name;
	this.sayName = function(){
		alert(this.name);
	};
}
var per = new Person();
instanceof

使用instanceof可以检查一个对象是否是一个类的实例

将函数中的方法定义到全局中,可以避免多次调用同一个函数(不推荐使用)
function Person(name){
	this.name = name;
	this.sayName = fun;
}
function fun(){
	alert("this.name");
};
var per = new Person();
原型 prototype

我们所创建的每一个函数,解析器都会向函数中添加一个属性prototype,

这个属性对应着一个对象,这个对象就是我们所谓的原型对象

当函数以构造函数的形式调用时,它所创建的对象中都会有一个隐含的属性,指向该构造函数的原型对象,可以通过 _ proto _ 来访问该属性

原型对象就相当于一个公共的区域,所有同一个类的实例都可以访问到这个原型对象,我们可以将对象中共有的内容,统一设置到原型对象中。

当我们访问对象的一个属性或方法时,它会先在对象自身中寻找,如果有则直接使用,如果没有会去原型对象中寻找,如果找到则直接使用

向原型中添加方法

可避免多次调用方法和浪费全局空间

Person.prototype.sayName = function(){
	
};
  • 以后创建函数时,可以将这些对象共有的属性和方法,统一添加到构造函数的原型对象中

注意:
  • 使用in检查对象中是否含有某个属性时,如果对象中没有但是原型中有,也会返回true

console.log("name" in mc);
  • 可以使用hasOwnProperty()来检查对象自身中是否含有该属性

console.log(mc.hasOwnProperty("name"));

 

 

console.log(mc._proto_._proto_);	//原型的原型

Object对象的原型没有原型,如果在Object中依然没有找到,则返回undefined

toString()

当我们直接在页面中打印一个对象时,实际上是输出对象的toString()方法的返回值

console.log(per);

添加toString()方法

 

per.toString = function(){
	return "Person[name="+this.name"]";
};
修改Person原型的toString
per.prototype.toString = function(){
	return "Person[name="+this.name"]";
};

#####

垃圾回收(GC)

 

 

var obj = new Object();

 

数组

创建数组对象
var arr = new Array();
向数组中添加元素

语法:数组[索引] = 值

arr[arr.length]=数值;		//可以不计下标不停添加
使用字面量创建数组

语法:var 数组名 = [ ] ;

var arr = [];
  • 创建时就可以指定数组中的元素

var arr = [1,2,3];
  • 使用构造函数添加数组可以直接添加元素

var arr = new Array(1,2,3);
创建数组只传一个数值
//创建一个长度为10的数组
arr = new Array(10);	
arr = [10];
数组中的元素可以是任意的数据类型,也可以是对象和函数

 

push()

该方法向数组末尾添加一个或多个元素,并会返回数组新的长度

pop()

删除数组的最后一个元素,并将被删除的元素作为返回值返回

unshift()

向数组开头添加一个或多个元素,并返回新的数组长度

shift

可以删除数组的第一个元素,并将被删除的元素作为返回值返回

forEach()

JS提供这个方法,用来遍历数组;这个方法只支持IE8及以上浏览器

forEach()方法需要一个函数作为参数

  • 像这种函数,由我们创建,但是不由我们调用的,我们成为回调函数

  • 数组中有几个元素,函数就会执行几次;每次执行时,浏览器会将遍历到的元素以实参的形式传递进来

  • 浏览器会在回调函数中传递三个参数:(形参的名字无所谓,重要的是顺序)

    • 第一个参数,是当前正在遍历的元素

    • 第二个参数,就是当前正在遍历的元素的索引

    • 第三个参数,就是正在遍历的数组

arr.forEach(function(value,index,obj){
	console.log(value);		
});
slice()
- 从数组中提取指定的元素
- 该方法不会改变原数组,而是将截取到的元素封装到一个新数组中返回

参数:

1. 截取开始的位置的索引
2. 截取结束的位置的索引	,第二个参数可以省略不写,此时会截取从开始索引往后的所有元素

索引可以传递一个负值,如果传递一个负值,则从后往前计算倒数第几个

arr.slice(0,2);
splice()
- 删除数组中的指定元素
- 会影响原数组,会将指定原素从原数组删除,并将被删除的元素作为返回值返回
  • 参数:

    • 第一个,开始位置的索引 - 第二个,表示删除的数量 - 第三个及以后的元素,可以传递一些新的元素,这些元素将会自动插入到开始位置索引前边

concat()

可以连接两个或多个数组,并将新的数组返回

  • 该方法不会对原数组产生影响

  • 不光可以传数组,也可以穿单个的元素

var result = arr.concat(arr2,arr3,"hehe");
join()

该方法可以将一个数组转换为一个字符串

  • 该方法不会对原数组产生影响,而是将转换后的字符串作为结果返回

  • 在join()中可以指定一个字符串作为参数,这个字符串将会成为数组中元素的连接符

result = arr.join("!");
reverse()

反转数组

  • 该对方直接修改原数组

sort()

对数组中的元素进行排序

  • 会直接修改原数组,默认会按照Unicode编码进行排序(数字排序不准)

  • 可以自己指定排序的规则;在sort()中添加一个回调函数,来指定排序规则,

    • 回调函数中需要定义两个形参

    • 浏览器将会分别使用数组中的元素作为实参去调用回调函数

    • 使用哪个元素调用不确定,但是肯定的是在数组中a一定在b前边

    • 浏览器会根据回调函数的返回值来决定元素的顺序,如果返回一个大于0的值,则元素会交换位置;如果返回小于0的值,则元素位置不变;如果返回0,则认为两个元素相等,也不交换位置

arr.sort(function(a,b){
	return a-b ;
});

 

call() 和 appley()
- 这两个方法都是函数对象的,需要通过函数对象来调用
- 当对函数调用call()和apply()都会调用函数执行
- 在调用call()和apply()可以将一个对象指定为第一个参数;此时这个对象将会成为函数执行时的this;(可以用来指定this)
- call()方法可以将实参在对象之后依次传递
- apply()方法需要将实参封装到一个数组中统一传递
fun.call(obj,2,3);
fun.apply(obj,[2,3]);

 

  • this的情况:

    • 以函数形式调用时,this永远都是window

    • 以方法的形式调用时,this时调用方法的对象

    • 以构造函数的形式调用时,this是新创建的那个对象

    • 使用call和apply调用时,this是指定的那个对象

arguments

在调用函数时,浏览器每次都会传递进两个隐含的参数:

  1. 函数的上下文对象this

  2. 封装实参的对象 arguments

 

  • arguments是一个类数组对象,它也可以通过索引来操作数据,也可以获取长度

  • 在调用函数时,我们所传递的实参都会在arguments中保存

  • arguments.length 就是实参的长度

  • 我们即使不定义形参,也可以通过arguments来使用实参,只不过比较麻烦

    • arguments[i] 表示第i个实参(i从0开始)

  • 它里面有一个属性叫做callee,这个属性对应一个函数对象,就是当前正在执行的函数的对象

 

Date对象

在JS中使用Date对象来表示一个时间

创建一个Date对象
  • 如果直接使用构造函数创建一个Date对象,则会封装为当前代码执行的时间

var d = new Date();
  • 创建一个指定的时间对象

    需要在构造函数中传递一个表示时间的字符串作为参数

    格式:月份/日/年 时:分:秒

var d2 = new Date("12/03/2016 11:10:30");
console.log(d2);
getDate()

获取当前日期对象是几日

d.getDate();
getDay()

获取当前日期对象是周几

返回0-6的值 0表示周日

getMonth()

0-11的值

0表示1月,依次递推

getFullYear
getTime()

获得当前日期对象的时间戳

时间戳:指的是从格林威治标准时间的1970年1月1日 00:00:00 的毫秒数

计算机底层在保存时间时使用的都是时间戳

Date.now()

获取当前的时间戳

console.log(time);

 

Math

Math和其他对象不同,它不是一个构造函数,它属于一个工具类不用创建对象,它里面封装了数学运算相关的属性

Math.abs()

计算一个数的绝对值

Math.celi()

对一个数进行上舍入(向上取整)

Math.floor()

向下取整(只对数值)

Math.round()

四舍五入取整

Math.random()

生成0-1的随机数

  • 想要生成 X -Y之间的随机数

Math.round(Math.random()*(Y-X))+X
Math.max()

获取多个值中的最小值

pow()幂
sqrt() 开方

 

包装类

 

//创建一个Number类型的对象
var num = new Number(3);	//类型是Object
  • 但是注意:我们在实际应用中不会使用基本数据类型的对象,如果使用基本数据类型的对象,再做一些比较时可能会带来一些不可预期的结果。

 

字符串

创建一个字符串
var str = "hello Atguigu";
  • 在底层字符串是以字符数组的形式保存的

charAt()

可以返回字符串中指定位置的字符;根据索引获取指定的字符

var result str.charAt(0);
charCodeAt()

获取指定位置字符的字符编码(Unicode编码)

String.formCharCode()

可以根据字符编码去获取字符

concat()

可以用来连接两个或多个字符串;作用和+号一样;不会对原字符串产生影响

indexof()

检索一个字符串中是否含有指定内容;

找到返回第一次出现的索引,没有找到返回-1

可以指定第二个参数,指定开始查找的位置

result = str.indexOf("h",6);
lastIndexOf()

从后向前检索

slice(x,y)

从字符串截取指定的内容;不会影响原字符串,将截取的字符串返回

第二个参数可以设置成负数,负数代表从倒数第几个截取

substring()

可以截取一个字符串,和slice()类似

不同的是:这个方法不能接收负值,接收了赋值默认使用0;如果第二个参数小于第一个,则自动交换

split()

可以将一个字符串拆分成一个数组

result = str.split(",")
toUpperCase()

将字符串转换为大写并返回;不会改变原字符串

toLowerCase()

 

正则表达式

正则表达式用于定义一些字符串的规则

计算机可以根据正则表达式,来检查一个字符串是否符合规则,

获取将字符串中符合规则的内容提取出来

创建正则表达式对象

语法:var 变量 = new RegExp("正则表达式","匹配模式")

匹配模式:
	- i	忽略大小写
	- g   全局匹配模式
//这个正则表达式可以检查一个字符串中是否含有a,严格区分大小写
var reg  = new RegExp("a","i");
test()

使用该方法可以用来检查一个字符串是否符合正则表达式的规则,符合返回true,否则返回false

var result = reg.test(str);
console.log(result);
使用字面量创建正则表达式

语法: var 变量 = /正则表达式/匹配模式

var reg = /a/i;

用字面量的方式创建更加简单,使用构造函数创建更加灵活

创建一个正则表达式,检查一个字符串中是否有a或b

使用 | 表示的意思

[ ] 里的内容也是的关系 [ab]

reg = /a|b/;
console.log(reg.test("bcd"));
创建一个正则表达式检查一个字符串中是否有字母

[0-9] 任意数字

[a-z] 任意小写字母

[A-Z] 任意大写字母

[A-z] 任意字母

reg = /[A-z]/ ;
检查一个字符串中是否含有abc 或 adc 或 aec
reg = /a[bde]c/;
[^ ] 除了
//除了数字
reg = /[^0-9];

 

字符串和正则相关的方法

split()

可以将一个字符串拆分成一个数组

即使不指定全局匹配,也会全拆了。

根据任意字母将字符串拆分

可以传递一个正则表达式作为参数,这样方法会根据正则表达式去拆分字符串

var result = str.split(/[A-z]/);
search()

可以搜索字符串中是否含有指定内容

搜索到返回第一次出现的索引,没有搜索到返回-1

它可以接收一个正则表达式作为参数,然后会根据正则表达式去检索字符串

var result = str.search(/a[bed]c/);
match()
  • 根据正则表达式,从一个字符串中将符合条件的内容提取出来

  • 默认情况下match指挥找到第一个符合要求的内容,找到以后就停止检索,我们可以设置正则表达式为全局匹配模式,这样就会匹配到所有的内容

  • 可以为一个正则表达式设置多个匹配模式,且顺序无所谓 ig 或者 gi

  • match()会将匹配到的内容封装到一个数组中返回,即使只查询到一个结果

var result = str.match(/[A-z]/gi);
replace()
  • 可以将字符换中的指定内容替换成新的内容

  • 参数:

    1. 被替换的内容,接收一个正则表达式作为参数(就可以全部替换)

    2. 新的内容

  • 默认只替换第一个

var result = str.replace(/[a-z]/gi,"@");

 

量词
- 通过量词可以设置一个内容出现的次数
- 量词只对它前边的一个内容起作用
- {n}  正好出现n次
- {(ab){n}}  对多个起作用,要用()括起来
- {ab{3}c}   ac之间有连续的3个b
- {a{n,m}}  a出现n到m次
- {a{n,}}  n次以上
var reg = /a{3}/;

 

  • 同时使用^ 和 $

    reg = /^a$/ 只能是a

    reg = /^a|a$/ 以a开头或者以a结尾

     

创建一个正则表达式,来检查一个字符串是否是一个合法的手机号

规则:

1. 以1开头
2. 第二位 3-9
3. 三位以后任意数字9个

^1 [3-9] [0-9]{9}$

var phoneReg = /^1[3-9][0-9]{9}$/;
\ 转义字符

检查一个字符串是否含有 .

. 表示任意字符

\ . 来表示 .

 

\w - 任意字母,数字,_ [A-z0-9_]

 

// 检查一个字符串中是否有child
reg = /\bchild\b/;
接收用户的输入 prompt()
var str = prompt("请输入你的用户名:");
console.log(str);
去除掉字符串中的空格

使用""来替换空格

str = str.replace(/\s/g,"");
去除开头的空格
str = str.replace(/^\s/g,"");	//这样只会匹配到开头的一个空格
str = str.replace(/^\s*/,"");	
去除开头和结尾的空格
str = str.replace(/^\s*|\s*$/g,"");		

邮件的正则

任意字母数字下划线 . 任意字母数字下划线 @ 任意字母数字 . 任意字母(2-5位) . 任意字母(2-5位)

\w{3,} (\ . \w+)* @ [A-z0-9]+ (\ .[A-z]{2,5}){1,2}

var emaiReg = /^\w{3,}(\.\w+)*@[A-z0-9]+(\.[A-z]{2,5}){1,2}$/;

 

DOM

 

 

 

 

 

我们可以在事件对应的属性中设置一些js代码,这样当事件被触发时,这些代码将会执行

可以为按钮对应事件绑定处理函数的形式来响应事件

当时间被触发时,其对应的函数会被调用。

//获取按钮对象
var btn = document.getElementById("btn");
//可以为按钮对应事件绑定处理函数的形式来响应事件,当时间被触发时,其对应的函数会被调用。

//绑定一个单击事件
//像这种为单击事件绑定的函数,我们称为单击响应函数
btn.onclick = function(){		//响应函数
	alert("你还点~~");
};
文档的加载

浏览器在加载一个页面时,是按照自上向下的顺序加载的,读取到一行就运行一行,如果将script标签写在页面的上边,在代码执行时,页面还没有加载

要将js代码编写在页面下部

onload 事件

会在整个页面加载完成之后才触发

为window绑定一个onload事件

window.onload = function(){
		btn.onclick = function(){		
		alert("你还点~~");
	};
};

 

innerHTML

通过这个属性可以获取到元素内部的html代码

//Elements,多个元素返回数组,要用数组接,不然出错
var img = document.getElementsByTagName("img")[0];

 

 

children

children属性可以获取当前元素的所有子元素(不包括空白,不会获得文本)

firstElementChild (IE8及以下不支持)

获取当前元素的第一个子元素

 

innerText
- 该属性可以获取到元素内部的文本内容
- 它和innerHTML类似,不同的是它会自动将html去除

 

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
		<title>Untitled Document</title>
		<link rel="stylesheet" type="text/css" href="style/css.css" />
		<script type="text/javascript">
		
			/*
			 * 定义一个函数,专门用来为指定元素绑定单击响应函数
			 * 	参数:
			 * 		idStr 要绑定单击响应函数的对象的id属性值
			 * 		fun 事件的回调函数,当单击元素时,该函数将会被触发
			 */
			function myClick(idStr , fun){
				var btn = document.getElementById(idStr);
				btn.onclick = fun;
			}
		
			window.onload = function(){
				
				//为id为btn01的按钮绑定一个单击响应函数
				var btn01 = document.getElementById("btn01");
				btn01.onclick = function(){
					//查找#bj节点
					var bj = document.getElementById("bj");
					//打印bj
					//innerHTML 通过这个属性可以获取到元素内部的html代码
					alert(bj.innerHTML);
				};
				
				
				//为id为btn02的按钮绑定一个单击响应函数
				var btn02 = document.getElementById("btn02");
				btn02.onclick = function(){
					//查找所有li节点
					//getElementsByTagName()可以根据标签名来获取一组元素节点对象
					//这个方法会给我们返回一个类数组对象,所有查询到的元素都会封装到对象中
					//即使查询到的元素只有一个,也会封装到数组中返回
					var lis = document.getElementsByTagName("li");
					
					//打印lis
					//alert(lis.length);
					
					//变量lis
					for(var i=0 ; i<lis.length ; i++){
						alert(lis[i].innerHTML);
					}
				};
				
				
				//为id为btn03的按钮绑定一个单击响应函数
				var btn03 = document.getElementById("btn03");
				btn03.onclick = function(){
					//查找name=gender的所有节点
					var inputs = document.getElementsByName("gender");
					
					//alert(inputs.length);
					
					for(var i=0 ; i<inputs.length ; i++){
						/*
						 * innerHTML用于获取元素内部的HTML代码的
						 * 	对于自结束标签,这个属性没有意义
						 */
						//alert(inputs[i].innerHTML);
						/*
						 * 如果需要读取元素节点属性,
						 * 	直接使用 元素.属性名
						 * 		例子:元素.id 元素.name 元素.value
						 * 		注意:class属性不能采用这种方式,
						 * 			读取class属性时需要使用 元素.className
						 */
						alert(inputs[i].className);
					}
				};
				
				//为id为btn04的按钮绑定一个单击响应函数
				var btn04 = document.getElementById("btn04");
				btn04.onclick = function(){
					
					//获取id为city的元素
					var city = document.getElementById("city");
					
					//查找#city下所有li节点
					var lis = city.getElementsByTagName("li");
					
					for(var i=0 ; i<lis.length ; i++){
						alert(lis[i].innerHTML);
					}
					
				};
				
				//为id为btn05的按钮绑定一个单击响应函数
				var btn05 = document.getElementById("btn05");
				btn05.onclick = function(){
					//获取id为city的节点
					var city = document.getElementById("city");
					//返回#city的所有子节点
					/*
					 * childNodes属性会获取包括文本节点在呢的所有节点
					 * 根据DOM标签标签间空白也会当成文本节点
					 * 注意:在IE8及以下的浏览器中,不会将空白文本当成子节点,
					 * 	所以该属性在IE8中会返回4个子元素而其他浏览器是9个
					 */
					var cns = city.childNodes;
					
					//alert(cns.length);
					
					/*for(var i=0 ; i<cns.length ; i++){
						alert(cns[i]);
					}*/
					
					/*
					 * children属性可以获取当前元素的所有子元素
					 */
					var cns2 = city.children;
					alert(cns2.length);
				};
				
				//为id为btn06的按钮绑定一个单击响应函数
				var btn06 = document.getElementById("btn06");
				btn06.onclick = function(){
					//获取id为phone的元素
					var phone = document.getElementById("phone");
					//返回#phone的第一个子节点
					//phone.childNodes[0];
					//firstChild可以获取到当前元素的第一个子节点(包括空白文本节点)
					var fir = phone.firstChild;
					
					//firstElementChild获取当前元素的第一个子元素
					/*
					 * firstElementChild不支持IE8及以下的浏览器,
					 * 	如果需要兼容他们尽量不要使用
					 */
					//fir = phone.firstElementChild;
					
					alert(fir);
				};
				
				//为id为btn07的按钮绑定一个单击响应函数
				myClick("btn07",function(){
					
					//获取id为bj的节点
					var bj = document.getElementById("bj");
					
					//返回#bj的父节点
					var pn = bj.parentNode;
					
					alert(pn.innerHTML);
					
					/*
					 * innerText
					 * 	- 该属性可以获取到元素内部的文本内容
					 * 	- 它和innerHTML类似,不同的是它会自动将html去除
					 */
					//alert(pn.innerText);
					
					
				});
				
				
				//为id为btn08的按钮绑定一个单击响应函数
				myClick("btn08",function(){
					
					//获取id为android的元素
					var and = document.getElementById("android");
					
					//返回#android的前一个兄弟节点(也可能获取到空白的文本)
					var ps = and.previousSibling;
					
					//previousElementSibling获取前一个兄弟元素,IE8及以下不支持
					//var pe = and.previousElementSibling;
					
					alert(ps);
					
				});
				
				//读取#username的value属性值
				myClick("btn09",function(){
					//获取id为username的元素
					var um = document.getElementById("username");
					//读取um的value属性值
					//文本框的value属性值,就是文本框中填写的内容
					alert(um.value);
				});
				
				
				//设置#username的value属性值
				myClick("btn10",function(){
					//获取id为username的元素
					var um = document.getElementById("username");
					
					um.value = "今天天气真不错~~~";
				});
				
				
				//返回#bj的文本值
				myClick("btn11",function(){
					
					//获取id为bj的元素
					var bj = document.getElementById("bj");
					
					//alert(bj.innerHTML);
					//alert(bj.innerText);
					
					//获取bj中的文本节点
					/*var fc = bj.firstChild;
					alert(fc.nodeValue);*/
					
					alert(bj.firstChild.nodeValue);
					
					
				});
				
			};
			
		
		</script>
	</head>
	<body>
		<div id="total">
			<div class="inner">
				<p>
					你喜欢哪个城市?
				</p>

				<ul id="city">
					<li id="bj">北京</li>
					<li>上海</li>
					<li>东京</li>
					<li>首尔</li>
				</ul>

				<br>
				<br>

				<p>
					你喜欢哪款单机游戏?
				</p>

				<ul id="game">
					<li id="rl">红警</li>
					<li>实况</li>
					<li>极品飞车</li>
					<li>魔兽</li>
				</ul>

				<br />
				<br />

				<p>
					你手机的操作系统是?
				</p>

				<ul id="phone"><li>IOS</li> <li id="android">Android</li><li>Windows Phone</li></ul>
			</div>

			<div class="inner">
				gender:
				<input class="hello" type="radio" name="gender" value="male"/>
				Male
				<input class="hello" type="radio" name="gender" value="female"/>
				Female
				<br>
				<br>
				name:
				<input type="text" name="name" id="username" value="abcde"/>
			</div>
		</div>
		<div id="btnList">
			<div><button id="btn01">查找#bj节点</button></div>
			<div><button id="btn02">查找所有li节点</button></div>
			<div><button id="btn03">查找name=gender的所有节点</button></div>
			<div><button id="btn04">查找#city下所有li节点</button></div>
			<div><button id="btn05">返回#city的所有子节点</button></div>
			<div><button id="btn06">返回#phone的第一个子节点</button></div>
			<div><button id="btn07">返回#bj的父节点</button></div>
			<div><button id="btn08">返回#android的前一个兄弟节点</button></div>
			<div><button id="btn09">返回#username的value属性值</button></div>
			<div><button id="btn10">设置#username的value属性值</button></div>
			<div><button id="btn11">返回#bj的文本值</button></div>
		</div>
	</body>
</html>

 

 

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>全选练习</title>
<script type="text/javascript">

	window.onload = function(){
		
		
		//获取四个多选框items
		var items = document.getElementsByName("items");
		//获取全选/全不选的多选框
		var checkedAllBox = document.getElementById("checkedAllBox");
		
		/*
		 * 全选按钮
		 * 	- 点击按钮以后,四个多选框全都被选中
		 */
		
		//1.#checkedAllBtn
		//为id为checkedAllBtn的按钮绑定一个单击响应函数
		var checkedAllBtn = document.getElementById("checkedAllBtn");
		checkedAllBtn.onclick = function(){
		
			//遍历items
			for(var i=0 ; i<items.length ; i++){
				
				//通过多选框的checked属性可以来获取或设置多选框的选中状态
				//alert(items[i].checked);
				
				//设置四个多选框变成选中状态
				items[i].checked = true;
			}
			
			//将全选/全不选设置为选中
			checkedAllBox.checked = true;				
		};
		
		/*
		 * 全不选按钮
		 * 	- 点击按钮以后,四个多选框都变成没选中的状态
		 */
		//2.#checkedNoBtn
		//为id为checkedNoBtn的按钮绑定一个单击响应函数
		var checkedNoBtn = document.getElementById("checkedNoBtn");
		checkedNoBtn.onclick = function(){
			
			for(var i=0; i<items.length ; i++){
				//将四个多选框设置为没选中的状态
				items[i].checked = false;
			}
			
			//将全选/全不选设置为不选中
			checkedAllBox.checked = false;
			
		};
		
		/*
		 * 反选按钮
		 * 	- 点击按钮以后,选中的变成没选中,没选中的变成选中
		 */
		//3.#checkedRevBtn
		var checkedRevBtn = document.getElementById("checkedRevBtn");
		checkedRevBtn.onclick = function(){
			
			//将checkedAllBox设置为选中状态
			checkedAllBox.checked = true;
			
			for(var i=0; i<items.length ; i++){
				
				//判断多选框状态
				/*if(items[i].checked){
					//证明多选框已选中,则设置为没选中状态
					items[i].checked = false;
				}else{
					//证明多选框没选中,则设置为选中状态
					items[i].checked = true;
				}*/
				
				items[i].checked = !items[i].checked;
				
				//判断四个多选框是否全选
				//只要有一个没选中则就不是全选
				if(!items[i].checked){
					//一旦进入判断,则证明不是全选状态
					//将checkedAllBox设置为没选中状态
					checkedAllBox.checked = false;
				}
			}			
			//在反选时也需要判断四个多选框是否全都选中			
		};
		
		/*
		 * 提交按钮:
		 * 	- 点击按钮以后,将所有选中的多选框的value属性值弹出
		 */
		//4.#sendBtn
		//为sendBtn绑定单击响应函数
		var sendBtn = document.getElementById("sendBtn");
		sendBtn.onclick = function(){
			//遍历items
			for(var i=0 ; i<items.length ; i++){
				//判断多选框是否选中
				if(items[i].checked){
					alert(items[i].value);
				}
			}
		};
		
		
		//5.#checkedAllBox
		/*
		 * 全选/全不选 多选框
		 * 	- 当它选中时,其余的也选中,当它取消时其余的也取消
		 * 
		 * 在事件的响应函数中,响应函数是给谁绑定的this就是谁
		 */
		//为checkedAllBox绑定单击响应函数
		checkedAllBox.onclick = function(){
			
			//alert(this === checkedAllBox);
			
			//设置多选框的选中状态
			for(var i=0; i <items.length ; i++){
				items[i].checked = this.checked;
			}
			
		};
		
		//6.items
		/*
		 * 如果四个多选框全都选中,则checkedAllBox也应该选中
		 * 如果四个多选框没都选中,则checkedAllBox也不应该选中
		 */
		
		//为四个多选框分别绑定点击响应函数
		for(var i=0 ; i<items.length ; i++){
			items[i].onclick = function(){
				
				//将checkedAllBox设置为选中状态
				checkedAllBox.checked = true;
				
				for(var j=0 ; j<items.length ; j++){
					//判断四个多选框是否全选
					//只要有一个没选中则就不是全选
					if(!items[j].checked){
						//一旦进入判断,则证明不是全选状态
						//将checkedAllBox设置为没选中状态
						checkedAllBox.checked = false;
						//一旦进入判断,则已经得出结果,不用再继续执行循环
						break;
					}				
				}
			};
		}	
	};	
</script>
</head>
<body>
	<form method="post" action="">
		你爱好的运动是?<input type="checkbox" id="checkedAllBox" />全选/全不选 
		
		<br />
		<input type="checkbox" name="items" value="足球" />足球
		<input type="checkbox" name="items" value="篮球" />篮球
		<input type="checkbox" name="items" value="羽毛球" />羽毛球
		<input type="checkbox" name="items" value="乒乓球" />乒乓球
		<br />
		<input type="button" id="checkedAllBtn" value="全 选" />
		<input type="button" id="checkedNoBtn" value="全不选" />
		<input type="button" id="checkedRevBtn" value="反 选" />
		<input type="button" id="sendBtn" value="提 交" />
	</form>
</body>
</html>

 

document.body

在document中有一个属性body,他保存的是body的引用;可以直接获取

var body = document.body;
document.documentElement

保存的是html根标签

document.all

代表页面的所有元素

document.getElementsByClassName()

IE8及以下不支持

document.querySelector() (支持IE8及以上)

- 需要一个选择器的字符串作为参数,可以根据一个CSS选择器来查询一个元素节点对象

- 但该方法只可查询一个,若结果有多个,只返回第一个;

var div = document.querySelector(".box1 div");
document.querySelectorAll()

可返回多个;即使符合条件的是一个也会返回数组;

var box1 = document.querySelectorAll("box1");
console.log(box1.length);

 

DOM 增删改

 

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
		<title>Untitled Document</title>
		<link rel="stylesheet" type="text/css" href="style/css.css" />
		<script type="text/javascript">
		
			window.onload = function() {
				
				//创建一个"广州"节点,添加到#city下
				myClick("btn01",function(){
					//创建广州节点 <li>广州</li>
					//创建li元素节点
					/*
					 * document.createElement()
					 * 	可以用于创建一个元素节点对象,
					 * 	它需要一个标签名作为参数,将会根据该标签名创建元素节点对象,
					 * 	并将创建好的对象作为返回值返回
					 */
					var li = document.createElement("li");
					
					//创建广州文本节点
					/*
					 * document.createTextNode()
					 * 	可以用来创建一个文本节点对象
					 *  需要一个文本内容作为参数,将会根据该内容创建文本节点,并将新的节点返回
					 */
					var gzText = document.createTextNode("广州");
					
					//将gzText设置li的子节点
					/*
					 * appendChild()
					 * 	 - 向一个父节点中添加一个新的子节点
					 * 	 - 用法:父节点.appendChild(子节点);
					 */
					li.appendChild(gzText);
					
					//获取id为city的节点
					var city = document.getElementById("city");
					
					//将广州添加到city下
					city.appendChild(li);
					
					
				});
				
				//将"广州"节点插入到#bj前面
				myClick("btn02",function(){
					//创建一个广州
					var li = document.createElement("li");
					var gzText = document.createTextNode("广州");
					li.appendChild(gzText);
					
					//获取id为bj的节点
					var bj = document.getElementById("bj");
					
					//获取city
					var city = document.getElementById("city");
					
					/*
					 * insertBefore()
					 * 	- 可以在指定的子节点前插入新的子节点
					 *  - 语法:
					 * 		父节点.insertBefore(新节点,旧节点);
					 */
					city.insertBefore(li , bj);
					
					
				});
				
				
				//使用"广州"节点替换#bj节点
				myClick("btn03",function(){
					//创建一个广州
					var li = document.createElement("li");
					var gzText = document.createTextNode("广州");
					li.appendChild(gzText);
					
					//获取id为bj的节点
					var bj = document.getElementById("bj");
					
					//获取city
					var city = document.getElementById("city");
					
					/*
					 * replaceChild()
					 * 	- 可以使用指定的子节点替换已有的子节点
					 * 	- 语法:父节点.replaceChild(新节点,旧节点);
					 */
					city.replaceChild(li , bj);
					
					
				});
				
				//删除#bj节点
				myClick("btn04",function(){
					//获取id为bj的节点
					var bj = document.getElementById("bj");
					//获取city
					var city = document.getElementById("city");
					
					/*
					 * removeChild()
					 * 	- 可以删除一个子节点
					 * 	- 语法:父节点.removeChild(子节点);
					 * 		
					 * 		子节点.parentNode.removeChild(子节点);
					 */
					//city.removeChild(bj);
					
					bj.parentNode.removeChild(bj);
				});
				
				
				//读取#city内的HTML代码
				myClick("btn05",function(){
					//获取city
					var city = document.getElementById("city");
					
					alert(city.innerHTML);
				});
				
				//设置#bj内的HTML代码
				myClick("btn06" , function(){
					//获取bj
					var bj = document.getElementById("bj");
					bj.innerHTML = "昌平";
				});
				
				myClick("btn07",function(){
					
					//向city中添加广州
					var city = document.getElementById("city");
					
					/*
					 * 使用innerHTML也可以完成DOM的增删改的相关操作
					 * 一般我们会两种方式结合使用
					 */
					//city.innerHTML += "<li>广州</li>";
					
					//创建一个li
					var li = document.createElement("li");
					//向li中设置文本
					li.innerHTML = "广州";
					//将li添加到city中
					city.appendChild(li);
					
				});
				
				
			};
			
			function myClick(idStr, fun) {
				var btn = document.getElementById(idStr);
				btn.onclick = fun;
			}
			
		
		</script>
		
	</head>
	<body>
		<div id="total">
			<div class="inner">
				<p>
					你喜欢哪个城市?
				</p>

				<ul id="city">
					<li id="bj">北京</li>
					<li>上海</li>
					<li>东京</li>
					<li>首尔</li>
				</ul>
				
			</div>
		</div>
		<div id="btnList">
			<div><button id="btn01">创建一个"广州"节点,添加到#city下</button></div>
			<div><button id="btn02">将"广州"节点插入到#bj前面</button></div>
			<div><button id="btn03">使用"广州"节点替换#bj节点</button></div>
			<div><button id="btn04">删除#bj节点</button></div>
			<div><button id="btn05">读取#city内的HTML代码</button></div>
			<div><button id="btn06">设置#bj内的HTML代码</button></div>
			<div><button id="btn07">创建一个"广州"节点,添加到#city下</button></div>
		</div>
	</body>
</html>
document.createElement()
				 * 	可以用于创建一个元素节点对象,
				 * 	它需要一个标签名作为参数,将会根据该标签名创建元素节点对象,
				 * 	并将创建好的对象作为返回值返回
				var li = document.createElement("li");
document.createTextNode()
				 * 	可以用来创建一个文本节点对象
				 *  需要一个文本内容作为参数,将会根据该内容创建文本节点,并将新的节点返回
				var gzText = document.createTextNode("广州");
appendChild()
  • 向一个父节点中添加一个新的子节点

    • 用法:父节点.appendChild(子节点); li.appendChild(gzText);

 

insertBefore()
  • 可以在指定的子节点前插入新的子节点

    • 语法:

      • 父节点.insertBefore(新节点,旧节点); city.insertBefore(li , bj);

replaceChild()
  • 可以使用指定的子节点替换已有的子节点

    • 语法:父节点.replaceChild(新节点,旧节点); city.replaceChild(li , bj);

removeChild()
  • 可以删除一个子节点

    • 语法:父节点.removeChild(子节点);

      • 子节点.parentNode.removeChild(子节点); city.removeChild(bj);

使用innerHTML也可以完成DOM的增删改的相关操作
				 * 一般我们会两种方式结合使用
				//city.innerHTML += "<li>广州</li>";	不推荐使用

```
					//创建一个li
					var li = document.createElement("li");
					//向li中设置文本
					li.innerHTML = "广州";
					//将li添加到city中
					city.appendChild(li);
```

 

增删改练习
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>

	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
		<title>添加删除记录练习</title>
		<link rel="stylesheet" type="text/css" href="ex_2_style/css.css" />
		<script type="text/javascript">
		
			/*
			 * 删除tr的响应函数
			 */
			function delA() {

				//点击超链接以后需要删除超链接所在的那行
				//这里我们点击那个超链接this就是谁
				//获取当前tr
				var tr = this.parentNode.parentNode;

				//获取要删除的员工的名字
				//var name = tr.getElementsByTagName("td")[0].innerHTML;
				var name = tr.children[0].innerHTML;

				//删除之前弹出一个提示框
				/*
				 * confirm()用于弹出一个带有确认和取消按钮的提示框
				 * 	需要一个字符串作为参数,该字符串将会作为提示文字显示出来
				 * 如果用户点击确认则会返回true,如果点击取消则返回false
				 */
				var flag = confirm("确认删除" + name + "吗?");

				//如果用户点击确认
				if(flag) {
					//删除tr
					tr.parentNode.removeChild(tr);
				}

				/*
				 * 点击超链接以后,超链接会跳转页面,这个是超链接的默认行为,
				 * 	但是此时我们不希望出现默认行为,可以通过在响应函数的最后return false来取消默认行为
				 */
				return false;
			};

			window.onload = function() {

				/*
				 * 点击超链接以后,删除一个员工的信息
				 */

				//获取所有额超链接
				var allA = document.getElementsByTagName("a");

				//为每个超链接都绑定一个单击响应函数
				for(var i = 0; i < allA.length; i++) {
					allA[i].onclick = delA;
				}

				/*
				 * 添加员工的功能
				 * 	- 点击按钮以后,将员工的信息添加到表格中
				 */

				//为提交按钮绑定一个单击响应函数
				var addEmpButton = document.getElementById("addEmpButton");
				addEmpButton.onclick = function() {

					//获取用户添加的员工信息
					//获取员工的名字
					var name = document.getElementById("empName").value;
					//获取员工的email和salary
					var email = document.getElementById("email").value;
					var salary = document.getElementById("salary").value;

					//alert(name+","+email+","+salary);
					/*
					 *  <tr>
							<td>Tom</td>
							<td>tom@tom.com</td>
							<td>5000</td>
							<td><a href="javascript:;">Delete</a></td>
						</tr>
						需要将获取到的信息保存到tr中
					 */

					//创建一个tr
					var tr = document.createElement("tr");

					//创建四个td
					var nameTd = document.createElement("td");
					var emailTd = document.createElement("td");
					var salaryTd = document.createElement("td");
					var aTd = document.createElement("td");

					//创建一个a元素
					var a = document.createElement("a");

					//创建文本节点
					var nameText = document.createTextNode(name);
					var emailText = document.createTextNode(email);
					var salaryText = document.createTextNode(salary);
					var delText = document.createTextNode("Delete");

					//将文本条件到td中
					nameTd.appendChild(nameText);
					emailTd.appendChild(emailText);
					salaryTd.appendChild(salaryText);

					//向a中添加文本
					a.appendChild(delText);
					//将a添加到td中
					aTd.appendChild(a);

					//将td添加到tr中
					tr.appendChild(nameTd);
					tr.appendChild(emailTd);
					tr.appendChild(salaryTd);
					tr.appendChild(aTd);

					//向a中添加href属性
					a.href = "javascript:;";

					//为新添加的a再绑定一次单击响应函数
					a.onclick = delA;

					//获取table
					var employeeTable = document.getElementById("employeeTable");
					//获取employeeTable中的tbody
					var tbody = employeeTable.getElementsByTagName("tbody")[0];
					//将tr添加到tbodye中
					tbody.appendChild(tr);

				};

			};
		</script>
	</head>

	<body>

		<table id="employeeTable">
			<tr>
				<th>Name</th>
				<th>Email</th>
				<th>Salary</th>
				<th>&nbsp;</th>
			</tr>
			<tr>
				<td>Tom</td>
				<td>tom@tom.com</td>
				<td>5000</td>
				<td>
					<a href="javascript:;">Delete</a>
				</td>
			</tr>
			<tr>
				<td>Jerry</td>
				<td>jerry@sohu.com</td>
				<td>8000</td>
				<td>
					<a href="deleteEmp?id=002">Delete</a>
				</td>
			</tr>
			<tr>
				<td>Bob</td>
				<td>bob@tom.com</td>
				<td>10000</td>
				<td>
					<a href="deleteEmp?id=003">Delete</a>
				</td>
			</tr>
		</table>

		<div id="formDiv">

			<h4>添加新员工</h4>

			<table>
				<tr>
					<td class="word">name: </td>
					<td class="inp">
						<input type="text" name="empName" id="empName" />
					</td>
				</tr>
				<tr>
					<td class="word">email: </td>
					<td class="inp">
						<input type="text" name="email" id="email" />
					</td>
				</tr>
				<tr>
					<td class="word">salary: </td>
					<td class="inp">
						<input type="text" name="salary" id="salary" />
					</td>
				</tr>
				<tr>
					<td colspan="2" align="center">
						<button id="addEmpButton">
						Submit
					</button>
					</td>
				</tr>
			</table>

		</div>

	</body>

</html>
点击超链接以后,超链接会跳转页面,这个是超链接的默认行为
			 * 	但是此时我们不希望出现默认行为,可以通过在响应函数的最后return false来取消默认行为
			return false;
  • 或者将超链接的 href:"javascript:;"

confirm()

带有确认和取消两个选项

简化增删改练习
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>

	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
		<title>添加删除记录练习</title>
		<link rel="stylesheet" type="text/css" href="ex_2_style/css.css" />
		<script type="text/javascript">
		
			/*
			 * 删除tr的响应函数
			 */
			function delA() {

				//点击超链接以后需要删除超链接所在的那行
				//这里我们点击那个超链接this就是谁
				//获取当前tr
				var tr = this.parentNode.parentNode;

				//获取要删除的员工的名字
				//var name = tr.getElementsByTagName("td")[0].innerHTML;
				var name = tr.children[0].innerHTML;

				//删除之前弹出一个提示框
				/*
				 * confirm()用于弹出一个带有确认和取消按钮的提示框
				 * 	需要一个字符串作为参数,该字符串将会作为提示文字显示出来
				 * 如果用户点击确认则会返回true,如果点击取消则返回false
				 */
				var flag = confirm("确认删除" + name + "吗?");

				//如果用户点击确认
				if(flag) {
					//删除tr
					tr.parentNode.removeChild(tr);
				}

				/*
				 * 点击超链接以后,超链接会跳转页面,这个是超链接的默认行为,
				 * 	但是此时我们不希望出现默认行为,可以通过在响应函数的最后return false来取消默认行为
				 */
				return false;
			};

			window.onload = function() {

				/*
				 * 点击超链接以后,删除一个员工的信息
				 */

				//获取所有额超链接
				var allA = document.getElementsByTagName("a");

				//为每个超链接都绑定一个单击响应函数
				for(var i = 0; i < allA.length; i++) {
					allA[i].onclick = delA;
				}

				/*
				 * 添加员工的功能
				 * 	- 点击按钮以后,将员工的信息添加到表格中
				 */

				//为提交按钮绑定一个单击响应函数
				var addEmpButton = document.getElementById("addEmpButton");
				addEmpButton.onclick = function() {

					//获取用户添加的员工信息
					//获取员工的名字
					var name = document.getElementById("empName").value;
					//获取员工的email和salary
					var email = document.getElementById("email").value;
					var salary = document.getElementById("salary").value;

					//alert(name+","+email+","+salary);
					/*
					 *  <tr>
							<td>Tom</td>
							<td>tom@tom.com</td>
							<td>5000</td>
							<td><a href="javascript:;">Delete</a></td>
						</tr>
						需要将获取到的信息保存到tr中
					 */

					//创建一个tr
					var tr = document.createElement("tr");

					//设置tr中的内容
					tr.innerHTML = "<td>"+name+"</td>"+
									"<td>"+email+"</td>"+
									"<td>"+salary+"</td>"+
									"<td><a href='javascript:;'>Delete</a></td>";
									
					//获取刚刚添加的a元素,并为其绑定单击响应函数				
					var a = tr.getElementsByTagName("a")[0];
					a.onclick = delA;
					
					//获取table
					var employeeTable = document.getElementById("employeeTable");
					//获取employeeTable中的tbody
					var tbody = employeeTable.getElementsByTagName("tbody")[0];
					//将tr添加到tbodye中
					tbody.appendChild(tr);
					/*tbody.innerHTML += "<tr>"+
					
					"<td>"+name+"</td>"+
									"<td>"+email+"</td>"+
									"<td>"+salary+"</td>"+
									"<td><a href='javascript:;'>Delete</a></td>"
					
					+"</tr>";*/

				};

			};
		</script>
	</head>

	<body>

		<table id="employeeTable">
			<tr>
				<th>Name</th>
				<th>Email</th>
				<th>Salary</th>
				<th>&nbsp;</th>
			</tr>
			<tr>
				<td>Tom</td>
				<td>tom@tom.com</td>
				<td>5000</td>
				<td>
					<a href="javascript:;">Delete</a>
				</td>
			</tr>
			<tr>
				<td>Jerry</td>
				<td>jerry@sohu.com</td>
				<td>8000</td>
				<td>
					<a href="deleteEmp?id=002">Delete</a>
				</td>
			</tr>
			<tr>
				<td>Bob</td>
				<td>bob@tom.com</td>
				<td>10000</td>
				<td>
					<a href="deleteEmp?id=003">Delete</a>
				</td>
			</tr>
		</table>

		<div id="formDiv">

			<h4>添加新员工</h4>

			<table>
				<tr>
					<td class="word">name: </td>
					<td class="inp">
						<input type="text" name="empName" id="empName" />
					</td>
				</tr>
				<tr>
					<td class="word">email: </td>
					<td class="inp">
						<input type="text" name="email" id="email" />
					</td>
				</tr>
				<tr>
					<td class="word">salary: </td>
					<td class="inp">
						<input type="text" name="salary" id="salary" />
					</td>
				</tr>
				<tr>
					<td colspan="2" align="center">
						<button id="addEmpButton">
						Submit
					</button>
					</td>
				</tr>
			</table>
		</div>
	</body>
</html>

 

使用DOM操作CSS

通过JS修改元素的样式:

语法: 元素.style.样式名 = 样式值

  • 通过style属性设置和读的都是内联样式,无法读取样式表中的样式

注意:如果CSS的样式名中含有 - 号,这种名称在JS中是不合法的;比如:background-color,

需要将这种样式名修改为驼峰命名法:去掉 - 号,然后将 - 号后的字母大写:backgroundColor

box1.style.width = "300px";

我们通过style属性设置的样式都是内联样式,而内联样式有较高的优先级,所以通过JS修改的样式往往会立即显示;

但是如果在样式中写了 !important,则此时样式会有最高的优先级,即使JS也无法覆盖。

 

获取元素的样式:
获取元素的当前显示的样式 (只有IE浏览器支持,不推荐使用)

语法: 元素.currentStyle.样式名

  • 获取的是当前的样式,如果当前样式未生效,则获取默认值

alert(box1.currentStyle.width);
在其他浏览器中使用:(IE8 及以下不支持)

getComputedStyle() 这个方法来获取元素当前的样式

  • 这个方法是window的方法,可以直接使用;

  • 需要两个参数:

    • 第一个:要获取样式的元素。

    • 第二个:可以传递一个伪元素,一般都传null。

该方法会返回一个对象,对象中封装了当前元素对应的样式

  • 如果获取的样式没有设置,则会获取到真实的值,而不是默认值。比如:没有设置width,他不会获取到auto,而是一个长度。

var obj = getComputedStyle(box1,null);
alert(getComputedStyle(box1,null).width);

 

终极方法:定义一个函数,来获取指定样式

参数:

obj 要获取样式的元素

name 要获取的样式名

function getStyle(obj,name){
		//灵活获取参数name 用[name]
	
	//方式一:
	if(window.getComputedStyle){
		//正常浏览器的方式,具有getComputedStyle()方法
		return getComputedStyle(obj,null)[name];
	}else{
		//IE8的方式,没有getComputedStyle()方法
		return obj.currentStyle[name];
	}
	
	//方式二:
	return window.getComputedStyle?getComputedStyle(obj,null)[name]:obj.currentStyle[name];
	
	
}

注意:通过currentStyle和getComputedStyle()读取的样式都是只读的,不能修改,如果要修改,必须通过style属性

注意:带px的要用parseInt()取整数,再计算

 

其他样式相关属性
clientWidth 和 clientHeight
- 这两个属性可以获取元素的**可见**高度和宽度
- 这些属性都是不带px的,返回都是一个数字,可以直接进行计算;
- 会获取元素宽度和高度,包括内容区(width)和内边距(padding)
- 只读不可改
offsetWidth 和 offsetHeight
- 获取元素的整个的高度和宽度,包括内容区,内边距,边框
offsetParent
  • 定位父元素

  • 会获取到离当前元素最近的开启了定位的祖先元素;如果所有的祖先元素都没有开启定位,则返回body

offsetLeft

当前元素相对于其他定位元素的水平偏移量

offsetTop

当前元素相对于其他定位元素的垂直偏移量

scrollWidth 和 scrollHeight

可以获取元素整个滚动区域的宽度和高度

scrollLeft 和 scrollTop

可以获取水平和垂直滚动条滚动的距离

 

  • 当满足 srollHeight - scrollTop == clientHeight 时说明垂直滚动条滚动到底了

同理: scrollWith - scrollLeft == clientWidth

  • 如果为表单项添加 disabled = "disabled" 则表单项将变成不可用的状态

  •  

onscroll

该事件会在元素的滚动条滚动时触发

//阅读协议检测滚动条是否滚动到底
<script type="text/javascript">
			window.onload = function(){
				
				/*
				 * 当垂直滚动条滚动到底时使表单项可用
				 * onscroll
				 * 	- 该事件会在元素的滚动条滚动时触发
				 */
				
				//获取id为info的p元素
				var info = document.getElementById("info");
				//获取两个表单项
				var inputs = document.getElementsByTagName("input");
				//为info绑定一个滚动条滚动的事件
				info.onscroll = function(){
					
					//检查垂直滚动条是否滚动到底
					if(info.scrollHeight - info.scrollTop == info.clientHeight){
						//滚动条滚动到底,使表单项可用
						/*
						 * disabled属性可以设置一个元素是否禁用,
						 * 	如果设置为true,则元素禁用
						 * 	如果设置为false,则元素可用
						 */
						inputs[0].disabled = false;
						inputs[1].disabled = false;
					}
					
				};
				
			};
			
			
		</script>

 

onmousemove

该事件将会在鼠标在元素中移动时被触发

事件对象
- 当时间的响应函数被触发时,浏览器每次都会将一个事件对象作为实参传递进响应函数
- 在事件对象中封装了当前事件相关的一切信息,比如:鼠标的坐标,键盘哪个案件被按下,鼠标滚轮滚动得方向
- 给函数设置一个形参event,当想获取事件相关信息时,都可找event

在IE8中,响应函数被处罚时,浏览器不会传递事件对象, 在IE8及以下的浏览器中,是将事件对象作为window对象的属性保存的 window.clientX (火狐不兼容)

处理兼容性问题:
//方法一,加上:
		if(!event){
			event = window.event;
		}
		
//方法二:
event = event || window.event;

 

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<style type="text/css">

	#areaDiv {
		border: 1px solid black;
		width: 300px;
		height: 50px;
		margin-bottom: 10px;
	}
	
	#showMsg {
		border: 1px solid black;
		width: 300px;
		height: 20px;
	}

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

	window.onload = function(){
		/*
		 * 当鼠标在areaDiv中移动时,在showMsg中来显示鼠标的坐标
		 */
		//获取两个div
		var areaDiv = document.getElementById("areaDiv");
		var showMsg = document.getElementById("showMsg");
		
		/*
		 * onmousemove
		 * 	- 该事件将会在鼠标在元素中移动时被触发
		 * 
		 * 事件对象
		 * 	- 当事件的响应函数被触发时,浏览器每次都会将一个事件对象作为实参传递进响应函数,
		 * 		在事件对象中封装了当前事件相关的一切信息,比如:鼠标的坐标  键盘哪个按键被按下  鼠标滚轮滚动的方向。。。
		 */
		areaDiv.onmousemove = function(event){
			
			/*
			 * 在IE8中,响应函数被处罚时,浏览器不会传递事件对象,
			 * 	在IE8及以下的浏览器中,是将事件对象作为window对象的属性保存的
			 */
			/*if(!event){
				event = window.event;
			}*/
			
			//解决事件对象的兼容性问题
			event = event || window.event;
			
			/*
			 * clientX可以获取鼠标指针的水平坐标
			 * cilentY可以获取鼠标指针的垂直坐标
			 */
			var x = event.clientX;
			var y = event.clientY;
			
			//alert("x = "+x + " , y = "+y);
			
			//在showMsg中显示鼠标的坐标
			showMsg.innerHTML = "x = "+x + " , y = "+y;
			
		};
		
	};

</script>
</head>
<body>

	<div id="areaDiv"></div>
	<div id="showMsg"></div>

</body>
</html>

 

pageX 和 pageY 可以获取鼠标相对于当前页面的坐标
//设置div随鼠标移动

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
		<style type="text/css">
			#box1{
				width: 100px;
				height: 100px;
				background-color: red;
				/*
				 * 开启box1的绝对定位
				 */
				position: absolute;
			}
			
		</style>
		
		<script type="text/javascript">
			window.onload = function(){
				
				/*
				 * 使div可以跟随鼠标移动
				 */
				
				//获取box1
				var box1 = document.getElementById("box1");
				//绑定鼠标移动事件
				document.onmousemove = function(event){
					
					//解决兼容问题
					event = event || window.event;
					
					//获取滚动条滚动的距离
					/*
					 * chrome认为浏览器的滚动条是body的,可以通过body.scrollTop来获取
					 * 火狐等浏览器认为浏览器的滚动条是html的,
					 */
					var st = document.body.scrollTop || document.documentElement.scrollTop;
					var sl = document.body.scrollLeft || document.documentElement.scrollLeft;
					//var st = document.documentElement.scrollTop;
					
					
					//获取到鼠标的坐标
					/*
					 * clientX和clientY
					 * 	用于获取鼠标在当前的可见窗口的坐标
					 * div的偏移量,是相对于整个页面的
					 * 
					 * pageX和pageY可以获取鼠标相对于当前页面的坐标
					 * 	但是这个两个属性在IE8中不支持,所以如果需要兼容IE8,则不要使用
					 */
					var left = event.clientX;
					var top = event.clientY;
					
					//设置div的偏移量
					box1.style.left = left + sl + "px";
					box1.style.top = top + st + "px";
					
				};
				
				
			};
			
			
		</script>
	</head>
	<body style="height: 1000px;width: 2000px;">
		<div id="box1"></div>
	</body>
</html>

 

事件的委派

- 将事件统一绑定给元素的共同的祖先元素,这样当后代元素上的事件触发时,会冒泡给祖先元素,从而通过祖先元素的响应函数来处理事件。

- 事件委派是利用了冒泡,通过委派可以减少事件绑定次数,提高程序的性能。

target

event中的target表示的触发事件的对象

  • 如果触发事件的对象是我们期望的元素,则执行否则不执行

if(event.target.classNme == "link"){
	alert("我是ul的单击响应函数");
}
事件的绑定
  • 使用 对象.事件 = 函数 的形式绑定响应函数,他只能同时为一个元素的一个事件绑定一个响应函数,不能绑定多个,如果绑定了多个,则后边的会覆盖前边的。

    addEventListener() (IE8及以下不支持)

通过这个方法也可以为元素绑定响应函数

参数:

1. 事件的字符串,不要on

2. 回调函数,当事件触发时该函数会被调用

3. 是否在捕获阶段出发事件,需要一个布尔值,一般都传false

使用addEventListener()可以同时为一个元素的相同事件同时绑定多个响应函数,这样当事件被触发时,响应函数将会按照函数的绑定顺序执行

btn01.addEventLister("click",function(){
	alert(1);
},false);
btn01.addEventLister("click",function(){
	alert(2);
},false);
btn01.addEventLister("click",function(){
	alert(3);
},false);
attachEvent() (IE8支持)

在IE8可以用attachEvent()来绑定事件

参数:

1. 事件的字符串,要on

2. 回调函数

这个方法也可以为一个事件绑定多个处理函数,不同的是他是后绑定先执行,执行顺序和addEventListener()相反

 

btn01.attachEvent("onclick",function(){
	alert(1);
});
定义一个函数,用来为指定元素绑定响应函数 (兼容所有浏览器)

addEventListener() 中的this,是绑定事件的对象

attachEvent()中this,是window

参数:

obj 要绑定事件的对象

eventStr 事件的字符串(不要on)

callback 回调函数

function bind (obj,eventStr,callback){
	
	if(obj.addEventListener){
		//大部分浏览器兼容的方式
		obj.addEventListener(eventStr,callback,false);
	}else{
		//IE8及以下
		
		//this是谁,由调用方式决定
		//callback.call(obj)  可以改表this的值

		
		obj.attachEvent("on"+eventStr,function(){
			//可以使浏览器(window)调用匿名函数,在匿名函数中,我们自行调用回调函数,就可以指定this
			//在匿名函数中调用回调函数
			callback.call(obj);
		});
	}
}

bind(btn01,"click",function(){
	alert(1);
});
事件的传播

 

 

拖拽

拖拽box1元素

  • 拖拽的流程

    1. 当鼠标在被拖拽元素上按下时,开始拖拽 onmousedown

    2. 当鼠标移动时被拖拽元素跟随鼠标移动 onmousemove

    3. 当鼠标松开时,被拖拽元素固定在当前位置 onmouseup

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
		<style type="text/css">
			
			#box1{
				width: 100px;
				height: 100px;
				background-color: red;
				position: absolute;
			}
			
			#box2{
				width: 100px;
				height: 100px;
				background-color: yellow;
				position: absolute;
				
				left: 200px;
				top: 200px;
			}
			
		</style>
		
		<script type="text/javascript">
			
			window.onload = function(){
				/*
				 * 拖拽box1元素
				 *  - 拖拽的流程
				 * 		1.当鼠标在被拖拽元素上按下时,开始拖拽  onmousedown
				 * 		2.当鼠标移动时被拖拽元素跟随鼠标移动 onmousemove
				 * 		3.当鼠标松开时,被拖拽元素固定在当前位置	onmouseup
				 */
				
				//获取box1
				var box1 = document.getElementById("box1");
				var box2 = document.getElementById("box2");
				var img1 = document.getElementById("img1");
				
				//开启box1的拖拽
				drag(box1);
				//开启box2的
				drag(box2);
				
				drag(img1);
			
			};
			
			/*
			 * 提取一个专门用来设置拖拽的函数
			 * 参数:开启拖拽的元素
			 */
			function drag(obj){
				//当鼠标在被拖拽元素上按下时,开始拖拽  onmousedown
				obj.onmousedown = function(event){
					
					//设置box1捕获所有鼠标按下的事件
					/*
					 * setCapture()
					 * 	- 只有IE支持,但是在火狐中调用时不会报错,
					 * 		而如果使用chrome调用,会报错
					 */
					/*if(box1.setCapture){
						box1.setCapture();
					}*/
					obj.setCapture && obj.setCapture();
					
					
					event = event || window.event;
					//div的偏移量 鼠标.clentX - 元素.offsetLeft
					//div的偏移量 鼠标.clentY - 元素.offsetTop
					var ol = event.clientX - obj.offsetLeft;
					var ot = event.clientY - obj.offsetTop;
					
					
					//为document绑定一个onmousemove事件
					document.onmousemove = function(event){
						event = event || window.event;
						//当鼠标移动时被拖拽元素跟随鼠标移动 onmousemove
						//获取鼠标的坐标
						var left = event.clientX - ol;
						var top = event.clientY - ot;
						
						//修改box1的位置
						obj.style.left = left+"px";
						obj.style.top = top+"px";
						
					};
					
					//为document绑定一个鼠标松开事件
					document.onmouseup = function(){
						//当鼠标松开时,被拖拽元素固定在当前位置	onmouseup
						//取消document的onmousemove事件
						document.onmousemove = null;
						//取消document的onmouseup事件
						document.onmouseup = null;
						//当鼠标松开时,取消对事件的捕获
						obj.releaseCapture && obj.releaseCapture();
					};
					
					/*
					 * 当我们拖拽一个网页中的内容时,浏览器会默认去搜索引擎中搜索内容,
					 * 	此时会导致拖拽功能的异常,这个是浏览器提供的默认行为,
					 * 	如果不希望发生这个行为,则可以通过return false来取消默认行为
					 * 
					 * 但是这招对IE8不起作用
					 */
					return false;					
				};
			}			
		</script>
	</head>
	<body>
		
		我是一段文字
		
		<div id="box1"></div>
		
		<div id="box2"></div>
		
		<img src="img/an.jpg" id="img1" style="position: absolute;"/>
	</body>
</html>

 

滚轮的事件
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
		<style type="text/css">
			
			#box1{
				width: 100px;
				height: 100px;
				background-color: red;
			}
			
		</style>
		<script type="text/javascript">
			
			window.onload = function(){
				
				
				//获取id为box1的div
				var box1 = document.getElementById("box1");
				
				//为box1绑定一个鼠标滚轮滚动的事件
				/*
				 * onmousewheel鼠标滚轮滚动的事件,会在滚轮滚动时触发,
				 * 	但是火狐不支持该属性
				 * 
				 * 在火狐中需要使用 DOMMouseScroll 来绑定滚动事件
				 * 	注意该事件需要通过addEventListener()函数来绑定
				 */
				
				
				box1.onmousewheel = function(event){
					
					event = event || window.event;
					
					
					//event.wheelDelta 可以获取鼠标滚轮滚动的方向
					//向上滚 120   向下滚 -120
					//wheelDelta这个值我们不看大小,只看正负
					
					//alert(event.wheelDelta);
					
					//wheelDelta这个属性火狐中不支持
					//在火狐中使用event.detail来获取滚动的方向
					//向上滚 -3  向下滚 3
					//alert(event.detail);
					
					
					/*
					 * 当鼠标滚轮向下滚动时,box1变长
					 * 	当滚轮向上滚动时,box1变短
					 */
					//判断鼠标滚轮滚动的方向
					if(event.wheelDelta > 0 || event.detail < 0){
						//向上滚,box1变短
						box1.style.height = box1.clientHeight - 10 + "px";
						
					}else{
						//向下滚,box1变长
						box1.style.height = box1.clientHeight + 10 + "px";
					}
					
					/*
					 * 使用addEventListener()方法绑定响应函数,取消默认行为时不能使用return false
					 * 需要使用event来取消默认行为event.preventDefault();
					 * 但是IE8不支持event.preventDefault();这个玩意,如果直接调用会报错
					 */
					event.preventDefault && event.preventDefault();
					
					
					/*
					 * 当滚轮滚动时,如果浏览器有滚动条,滚动条会随之滚动,
					 * 这是浏览器的默认行为,如果不希望发生,则可以取消默认行为
					 */
					return false;									
					
				};
				
				//为火狐绑定滚轮事件
				bind(box1,"DOMMouseScroll",box1.onmousewheel);	
				
			};
					
			function bind(obj , eventStr , callback){
				if(obj.addEventListener){
					//大部分浏览器兼容的方式
					obj.addEventListener(eventStr , callback , false);
				}else{
					/*
					 * this是谁由调用方式决定
					 * callback.call(obj)
					 */
					//IE8及以下
					obj.attachEvent("on"+eventStr , function(){
						//在匿名函数中调用回调函数
						callback.call(obj);
					});
				}
			}
			
		</script>
	</head>
	<body style="height: 2000px;">
		
		<div id="box1"></div>
		
	</body>
</html>
键盘事件
  • onkeydown

    按键被按下

    对于onkeydown来说如果一直按着某个按键不松手,则事件会一直触发

    当onkeydown连续触发时,第一次和第二次之间会间隔稍微长一点,其他的会非常快,这种设计是为了防止误操作的发生。

  • onkeyup

    按键被松开

键盘事件一般都会绑定给可以获取焦点的对象或者是document

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
		<script type="text/javascript">	
			window.onload = function(){
				
				/*
				 * 键盘事件:
				 * 	onkeydown
				 * 		- 按键被按下
				 * 		- 对于onkeydown来说如果一直按着某个按键不松手,则事件会一直触发
				 * 		- 当onkeydown连续触发时,第一次和第二次之间会间隔稍微长一点,其他的会非常的快
				 * 			这种设计是为了防止误操作的发生。
				 * 	onkeyup
				 * 		- 按键被松开
				 * 
				 *  键盘事件一般都会绑定给一些可以获取到焦点的对象或者是document
				 */
				
				document.onkeydown = function(event){
					event = event || window.event;
					
					/*
					 * 可以通过keyCode来获取按键的编码
					 * 	通过它可以判断哪个按键被按下
					 * 除了keyCode,事件对象中还提供了几个属性
					 * 	altKey
					 * 	ctrlKey
					 * 	shiftKey
					 * 		- 这个三个用来判断alt ctrl 和 shift是否被按下
					 * 			如果按下则返回true,否则返回false
					 */
					
					//console.log(event.keyCode);
					
					//判断一个y是否被按下
					//判断y和ctrl是否同时被按下
					if(event.keyCode === 89 && event.ctrlKey){
						console.log("ctrl和y都被按下了");
					}						
				};
				
				/*document.onkeyup = function(){
					console.log("按键松开了");
				};*/
				
				//获取input
				var input = document.getElementsByTagName("input")[0];
				
				input.onkeydown = function(event){
					
					event = event || window.event;
					
					//console.log(event.keyCode);
					//数字 48 - 57
					//使文本框中不能输入数字
					if(event.keyCode >= 48 && event.keyCode <= 57){
						//在文本框中输入内容,属于onkeydown的默认行为
						//如果在onkeydown中取消了默认行为,则输入的内容,不会出现在文本框中
						return false;
					}		
				};
			};
			
		</script>
	</head>
	<body>
		<input type="text" />
	</body>
</html>

 

BOM

  • 浏览器对象模型

  • BOM可以是我们通过JS来操作浏览器

  • 在BOM中为我们提供了一组对象,用来完成对浏览器的操作

  • BOM对象:

    • window - 代表整个浏览器的窗口,同时window也是网页中的全局对象

    • navigator - 代表当前浏览器的信息,通过该对象可以来识别不同的浏览器。由于历史原因,Navigator对象中的大部分属性都已经不能帮助我们识别浏览器了。 - 一般我们只会使用userAgent来判断浏览器的信息 - userAgent是一个字符串,这个字符串中包含有用来描述浏览器信息的内容,不同的浏览器会有不同的userAgent

    • location

      • 代表当前浏览器的地址栏的信息,通过location可以获取地址栏信息,或者操作浏览器跳转页面

    • history

      • 代表浏览器的历史记录,可以通过该对象来操作浏览器的历史记录,由于隐私的原因,该对象不能获取具体的历史记录,只能操作浏览器向前向后翻页,而且操作只在当此访问有效

    • screen

      • 代表用户的屏幕信息,通过该对象可以获取到用户的显示器的相关信息

这些BOM对象在浏览器中都是作为window对象的属性保存的,可以通过window对象来使用,也可以直接使用

navigator
<script type="text/javascript">
			/*
			 * Navigator
			 * 	- 代表的当前浏览器的信息,通过该对象可以来识别不同的浏览器
			 * 	- 由于历史原因,Navigator对象中的大部分属性都已经不能帮助我们识别浏览器了
			 * 	- 一般我们只会使用userAgent来判断浏览器的信息,
			 * 		userAgent是一个字符串,这个字符串中包含有用来描述浏览器信息的内容,
			 * 		不同的浏览器会有不同的userAgent
			 * 
			 * 火狐的userAgent
			 * 	Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0
			 * 
			 * Chrome的userAgent
			 *  Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36
			 * 
			 * IE8
			 * 	Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/7.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E)
			 * 
			 * IE9
			 * 	Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/7.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E)
			 * 
			 * IE10
			 * 	Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/7.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E)
			 * 
			 * IE11
			 * 	Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; rv:11.0) like Gecko
			 * 	- 在IE11中已经将微软和IE相关的标识都已经去除了,所以我们基本已经不能通过UserAgent来识别一个浏览器是否是IE了
			 */
			
			//alert(navigator.appName);
			
			var ua = navigator.userAgent;
			
			console.log(ua);
			
			if(/firefox/i.test(ua)){
				alert("你是火狐!!!");
			}else if(/chrome/i.test(ua)){
				alert("你是Chrome");
			}else if(/msie/i.test(ua)){
				alert("你是IE浏览器~~~");
			}else if("ActiveXObject" in window){
				alert("你是IE11,枪毙了你~~~");
			}
			
			/*
			 * 如果通过UserAgent不能判断,还可以通过一些浏览器中特有的对象,来判断浏览器的信息
			 * 比如:ActiveXObject
			 */
			/*if("ActiveXObject" in window){
				alert("你是IE,我已经抓住你了~~~");
			}else{
				alert("你不是IE~~~");
			}*/
			
			/*alert("ActiveXObject" in window);*/		
		</script>
histery
length

属性:可以获取到当前访问的连接数量

back()

可以用来回退到上一个页面,作用和浏览器的回退按钮一样

forward()

可以跳转到下一个页面,作用和浏览器的前进按钮一样

history.back();
history.forword();
go()

可以用来跳转到指定的页面,需要一个整数作为参数

1 :表示向前跳转一个页面

2 :表示向前跳转两个页面

-n :向后跳转n个页面

history.go(-1);

 

location

如果直接打印location,则可以获取到地址栏的信息(当前页面的完整路径)

- 如果直接将location属性修改为一个完整的路径,或相对路径,则我们页面会自动跳转到该路径,并且生成响应的历史记录
location = "http://www.baidu.com";
location = "01.BOM.html";
assign()

用来跳转到其他的页面,作用和直接修改location一样

location.assign("地址");
reload()

用于重新加载当前页面,作用和刷新按钮一样

- 如果在方法中传递true做参数,则会强制清空缓存刷新页面
replace()

可以使用一个新的页面替换当前页面,调用完毕也会跳转页面

不会生成历史记录,不能使用回退按钮回退

 

定时器简介

setInterval
  • 定时调用

  • 可以将一个函数,每隔一段时间执行一次

  • 参数:

    1. 回调函数,该函数会每隔一段时间被调用一次

      1. 每次调用间隔的时间,单位是毫秒

  • 返回值:

    • 返回一个Number类型的数据

    • 这个数字用来作为定时器的唯一标识

clearInterval()
- 可以用来关闭一个定时器
- 方法中需要一个定时器的标识作为参数,这样将关闭标识对应的定时器
- 如果参数不是一个有效的标识,则什么也不做,不会报错
num = 1;
var timer =  setIntercal(function(){
	count.innerHTML = num++;
	
	if(num == 11){
		//关闭定时器
		clearInterval(timer);
	}
},1000);

 

定时器练习
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
		<script type="text/javascript">
			
			window.onload = function(){
				
				/*
				 * 使图片可以自动切换
				 */
				
				//获取img标签
				var img1 = document.getElementById("img1");
				
				//创建一个数组来保存图片的路径
				var imgArr = ["img/1.jpg","img/2.jpg","img/3.jpg","img/4.jpg","img/5.jpg"];
				
				//创建一个变量,用来保存当前图片的索引
				var index = 0;
				
				//定义一个变量,用来保存定时器的标识
				var timer;
				
				//为btn01绑定一个单击响应函数
				var btn01 = document.getElementById("btn01");
				btn01.onclick = function(){
					
					/*
					 * 目前,我们每点击一次按钮,就会开启一个定时器,
					 * 	点击多次就会开启多个定时器,这就导致图片的切换速度过快,
					 * 	并且我们只能关闭最后一次开启的定时器
					 */
					
					//在开启定时器之前,需要将当前元素上的其他定时器关闭
					clearInterval(timer);
					
					/*
					 * 开启一个定时器,来自动切换图片
					 */
					timer = setInterval(function(){
						//使索引自增
						index++;
						//判断索引是否超过最大索引
						/*if(index >= imgArr.length){
							//则将index设置为0
							index = 0;
						}*/
						index %= imgArr.length;
						//修改img1的src属性
						img1.src = imgArr[index];
						
					},1000);
				};
				
				//为btn02绑定一个单击响应函数
				var btn02 = document.getElementById("btn02");
				btn02.onclick = function(){
					//点击按钮以后,停止图片的自动切换,关闭定时器
					/*
					 * clearInterval()可以接收任意参数,
					 * 	如果参数是一个有效的定时器的标识,则停止对应的定时器
					 * 	如果参数不是一个有效的标识,则什么也不做
					 */
					clearInterval(timer);
					
				};					
			};	
		</script>
	</head>
	<body>
		<img id="img1" src="img/1.jpg"/>
		<br /><br />
		<button id="btn01">开始</button>
		<button id="btn02">停止</button>
	</body>
</html>

 

修改div移动练习

解决:每次第一步移动时都会卡一下

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
		<style type="text/css">
			#box1{
				width: 100px;
				height: 100px;
				background-color: red;
				position: absolute;
			}
		
		</style>
		
		<script type="text/javascript">
			
			//使div可以根据不同的方向键向不同的方向移动
			/*
			 * 按左键,div向左移
			 * 按右键,div向右移
			 * 。。。
			 */
			window.onload = function(){					
				//定义一个变量,来表示移动的速度
				var speed = 10;
				
				//创建一个变量表示方向
				//通过修改dir来影响移动的方向
				var dir = 0;
				
				//开启一个定时器,来控制div的移动
				setInterval(function(){
					/*
					 * 37 左
					 * 38 上
					 * 39 右
					 * 40 下
					 */
					switch(dir){
						case 37:
							//alert("向左"); left值减小
							box1.style.left = box1.offsetLeft - speed + "px";
							break;
						case 39:
							//alert("向右");
							box1.style.left = box1.offsetLeft + speed + "px";
							break;
						case 38:
							//alert("向上");
							box1.style.top = box1.offsetTop - speed + "px";
							break;
						case 40:
							//alert("向下");
							box1.style.top = box1.offsetTop + speed + "px";
							break;
					}
				},30);
			
				//为document绑定一个按键按下的事件
				document.onkeydown = function(event){
					event = event || window.event;
					
					//当用户按了ctrl以后,速度加快
					if(event.ctrlKey){
						speed = 500;
					}else{
						speed = 10;
					}
					
					//使dir等于按键的值
					dir = event.keyCode;
				};
				
				//当按键松开时,div不再移动
				document.onkeyup = function(){
					//设置方向为0
					dir = 0;
				};			
			};
		</script>
	</head>
	<body>
		<div id="box1"></div>
	</body>
</html>
延时调用
setTimeout()

延时调用一个函数不马上执行,间隔一段时间以后再执行,而且只执行一次

var timer = setTimeout(function(){
	console.log(num++);
},3000);
clearTimeout()

关闭一个延时调用

  • 延时调用和定时调用的区别,定时调用会执行多次,而延时调用只会执行一次

  • 延时调用和定时调用实际上是可以互相代替的,可根据需求选择

定时器的应用
//尝试创建一个可以执行简单动画的函数
/*
 * 参数:
 * 	obj:要执行动画的对象
 * 	attr:要执行动画的样式,比如:left top width height
 * 	target:执行动画的目标位置
 * 	speed:移动的速度(正数向右移动,负数向左移动)
 *  callback:回调函数,这个函数将会在动画执行完毕以后执行
 */
function move(obj, attr, target, speed, callback) {
	//关闭上一个定时器
	clearInterval(obj.timer);

	//获取元素目前的位置
	var current = parseInt(getStyle(obj, attr));

	//判断速度的正负值
	//如果从0 向 800移动,则speed为正
	//如果从800向0移动,则speed为负
	if(current > target) {
		//此时速度应为负值
		speed = -speed;
	}

	//开启一个定时器,用来执行动画效果
	//向执行动画的对象中添加一个timer属性,用来保存它自己的定时器的标识
	obj.timer = setInterval(function() {

		//获取box1的原来的left值
		var oldValue = parseInt(getStyle(obj, attr));

		//在旧值的基础上增加
		var newValue = oldValue + speed;

		//判断newValue是否大于800
		//从800 向 0移动
		//向左移动时,需要判断newValue是否小于target
		//向右移动时,需要判断newValue是否大于target
		if((speed < 0 && newValue < target) || (speed > 0 && newValue > target)) {
			newValue = target;
		}

		//将新值设置给box1
		obj.style[attr] = newValue + "px";

		//当元素移动到0px时,使其停止执行动画
		if(newValue == target) {
			//达到目标,关闭定时器
			clearInterval(obj.timer);
			//动画执行完毕,调用回调函数
			callback && callback();
		}

	}, 30);
}

/*
 * 定义一个函数,用来获取指定元素的当前的样式
 * 参数:
 * 		obj 要获取样式的元素
 * 		name 要获取的样式名
 */
function getStyle(obj, name) {

	if(window.getComputedStyle) {
		//正常浏览器的方式,具有getComputedStyle()方法
		return getComputedStyle(obj, null)[name];
	} else {
		//IE8的方式,没有getComputedStyle()方法
		return obj.currentStyle[name];
	}

}

 

轮播图界面
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
		
		<style type="text/css">
			*{
				margin: 0;
				padding: 0;
			}
			
			/*
			 * 设置outer的样式
			 */
			#outer{
				/*设置宽和高*/
				width: 520px;
				height: 333px;
				/*居中*/
				margin: 50px auto;
				/*设置背景颜色*/
				background-color: greenyellow;
				/*设置padding*/
				padding: 10px 0;
				/*开启相对定位*/
				position: relative;
				/*裁剪溢出的内容*/
				overflow: hidden;
			}
			
			/*设置imgList*/
			#imgList{
				/*去除项目符号*/
				list-style: none;
				/*设置ul的宽度*/
				/*width: 2600px;*/
				/*开启绝对定位*/
				position: absolute;
				/*设置偏移量*/
				/*
				 * 每向左移动520px,就会显示到下一张图片
				 */
				left: 0px;
			}
			
			/*设置图片中的li*/
			#imgList li{
				/*设置浮动*/
				float: left;
				/*设置左右外边距*/
				margin: 0 10px;
			}
			
			/*设置导航按钮*/
			#navDiv{
				/*开启绝对定位*/
				position: absolute;
				/*设置位置*/
				bottom: 15px;
				/*设置left值
				 	outer宽度  520
				 	navDiv宽度 25*5 = 125
				 		520 - 125 = 395/2 = 197.5
				 * */
				/*left: 197px;*/
			}
			
			#navDiv a{
				/*设置超链接浮动*/
				float: left;
				/*设置超链接的宽和高*/
				width: 15px;
				height: 15px;
				/*设置背景颜色*/
				background-color: red;
				/*设置左右外边距*/
				margin: 0 5px;
				/*设置透明*/
				opacity: 0.5;
				/*兼容IE8透明*/
				filter: alpha(opacity=50);
			}
			
			/*设置鼠标移入的效果*/
			#navDiv a:hover{
				background-color: black;
			}
		</style>
		
		<!--引用工具-->
		<script type="text/javascript" src="tools.js"></script>
		<script type="text/javascript">
			window.onload = function(){
				//获取imgList
				var imgList = document.getElementById("imgList");
				//获取页面中所有的img标签
				var imgArr = document.getElementsByTagName("img");
				//设置imgList的宽度
				imgList.style.width = 520*imgArr.length+"px";
				
				
				/*设置导航按钮居中*/
				//获取navDiv
				var navDiv = document.getElementById("navDiv");
				//获取outer
				var outer = document.getElementById("outer");
				//设置navDiv的left值
				navDiv.style.left = (outer.offsetWidth - navDiv.offsetWidth)/2 + "px";
				
				//默认显示图片的索引
				var index = 0;
				//获取所有的a
				var allA = document.getElementsByTagName("a");
				//设置默认选中的效果
				allA[index].style.backgroundColor = "black";
				
				/*
				 	点击超链接切换到指定的图片
				 		点击第一个超链接,显示第一个图片
				 		点击第二个超链接,显示第二个图片
				 * */
				
				//为所有的超链接都绑定单击响应函数
				for(var i=0; i<allA.length ; i++){
					
					//为每一个超链接都添加一个num属性
					allA[i].num = i;
					
					//为超链接绑定单击响应函数
					allA[i].onclick = function(){
						
						//关闭自动切换的定时器
						clearInterval(timer);
						//获取点击超链接的索引,并将其设置为index
						index = this.num;
						
						//切换图片
						/*
						 * 第一张  0 0
						 * 第二张  1 -520
						 * 第三张  2 -1040
						 */
						//imgList.style.left = -520*index + "px";
						//设置选中的a
						setA();
						
						//使用move函数来切换图片
						move(imgList , "left" , -520*index , 20 , function(){
							//动画执行完毕,开启自动切换
							autoChange();
						});
						
					};
				}
				
				
				//开启自动切换图片
				autoChange();
				
				
				//创建一个方法用来设置选中的a
				function setA(){
					
					//判断当前索引是否是最后一张图片
					if(index >= imgArr.length - 1){
						//则将index设置为0
						index = 0;
						
						//此时显示的最后一张图片,而最后一张图片和第一张是一摸一样
						//通过CSS将最后一张切换成第一张
						imgList.style.left = 0;
					}
					
					//遍历所有a,并将它们的背景颜色设置为红色
					for(var i=0 ; i<allA.length ; i++){
						allA[i].style.backgroundColor = "";
					}
					
					//将选中的a设置为黑色
					allA[index].style.backgroundColor = "black";
				};
				
				//定义一个自动切换的定时器的标识
				var timer;
				//创建一个函数,用来开启自动切换图片
				function autoChange(){
					
					//开启一个定时器,用来定时去切换图片
					timer = setInterval(function(){
						
						//使索引自增
						index++;
						
						//判断index的值
						index %= imgArr.length;
						
						//执行动画,切换图片
						move(imgList , "left" , -520*index , 20 , function(){
							//修改导航按钮
							setA();
						});
						
					},3000);
					
				}
				
				
			};
			
		</script>
	</head>
	<body>
		<!-- 创建一个外部的div,来作为大的容器 -->
		<div id="outer">
			<!-- 创建一个ul,用于放置图片 -->
			<ul id="imgList">
				<li><img src="img/1.jpg"/></li>
				<li><img src="img/2.jpg"/></li>
				<li><img src="img/3.jpg"/></li>
				<li><img src="img/4.jpg"/></li>
				<li><img src="img/5.jpg"/></li>
				<li><img src="img/1.jpg"/></li>
			</ul>
			<!--创建导航按钮-->
			<div id="navDiv">
				<a href="javascript:;"></a>
				<a href="javascript:;"></a>
				<a href="javascript:;"></a>
				<a href="javascript:;"></a>
				<a href="javascript:;"></a>
			</div>
		</div>
	</body>
</html>

 

类的操作

 

我们可以通过修改元素的class属性来间接的修改样式

  • 这样一来,我们只需要修改一次,即可同时修改多个样式,浏览器只需要重新渲染页面一次,性能比较好并且这种方式,可以使表现和行为进一步的分离

box.className = "b2";
box.className += " b2"; 	//中间要有空格

 

 

 

 

 

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
		<style type="text/css">
			
			.b1{
				width: 100px;
				height: 100px;
				background-color: red;
			}
			
			.b2{
				height: 300px;
				background-color: yellow;
			}
			
		</style>
		
		<script type="text/javascript">
			
			window.onload = function(){
				//获取box
				var box = document.getElementById("box");
				//获取btn01
				var btn01 = document.getElementById("btn01");
				
				//为btn01绑定单击响应函数
				btn01.onclick = function(){
					//修改box的样式
					/*
					 * 通过style属性来修改元素的样式,每修改一个样式,浏览器就需要重新渲染一次页面
					 * 	这样的执行的性能是比较差的,而且这种形式当我们要修改多个样式时,也不太方便
					 */
					/*box.style.width = "200px";
					box.style.height = "200px";
					box.style.backgroundColor = "yellow";*/
					
					/*
					 * 我希望一行代码,可以同时修改多个样式
					 */
					
					//修改box的class属性
					/*
					 * 我们可以通过修改元素的class属性来间接的修改样式
					 * 这样一来,我们只需要修改一次,即可同时修改多个样式,
					 * 	浏览器只需要重新渲染页面一次,性能比较好,
					 * 	并且这种方式,可以使表现和行为进一步的分离
					 */
					//box.className += " b2";
					//addClass(box,"b2");
					
					//alert(hasClass(box,"hello"));
					
					//removeClass(box,"b2");
					
					toggleClass(box,"b2");
				};
				
			};
			
			//定义一个函数,用来向一个元素中添加指定的class属性值
			/*
			 * 参数:
			 * 	obj 要添加class属性的元素
			 *  cn 要添加的class值
			 * 	
			 */
			function addClass(obj , cn){
				
				//检查obj中是否含有cn
				if(!hasClass(obj , cn)){
					obj.className += " "+cn;
				}
				
			}
			
			/*
			 * 判断一个元素中是否含有指定的class属性值
			 * 	如果有该class,则返回true,没有则返回false
			 * 	
			 */
			function hasClass(obj , cn){
				
				//判断obj中有没有cn class
				//创建一个正则表达式
				//var reg = /\bb2\b/;
				var reg = new RegExp("\\b"+cn+"\\b");
				
				return reg.test(obj.className);
				
			}
			
			/*
			 * 删除一个元素中的指定的class属性
			 */
			function removeClass(obj , cn){
				//创建一个正则表达式
				var reg = new RegExp("\\b"+cn+"\\b");
				
				//删除class
				obj.className = obj.className.replace(reg , "");
				
			}
			
			/*
			 * toggleClass可以用来切换一个类
			 * 	如果元素中具有该类,则删除
			 * 	如果元素中没有该类,则添加
			 */
			function toggleClass(obj , cn){
				
				//判断obj中是否含有cn
				if(hasClass(obj , cn)){
					//有,则删除
					removeClass(obj , cn);
				}else{
					//没有,则添加
					addClass(obj , cn);
				}
				
			}
			
		</script>
	</head>
	<body>
		
		<button id="btn01">点击按钮以后修改box的样式</button>
		
		<br /><br />
		
		<div id="box" class="b1 b2"></div>
	</body>
</html>

 

二级菜单
<!DOCTYPE html>
<html>

	<head>
		<meta charset="UTF-8">
		<title>二级菜单</title>
		<style type="text/css">
			* {
				margin: 0;
				padding: 0;
				list-style-type: none;
			}
			
			a,img {
				border: 0;
				text-decoration: none;
			}
			
			body {
				font: 12px/180% Arial, Helvetica, sans-serif, "新宋体";
			}
		</style>

		<link rel="stylesheet" type="text/css" href="css/sdmenu.css" />
		
		<script type="text/javascript" src="js/tools.js"></script>
		<script type="text/javascript">
			window.onload = function(){
				
				/*
				 * 我们的每一个菜单都是一个div
				 * 	当div具有collapsed这个类时,div就是折叠的状态
				 * 	当div没有这个类是,div就是展开的状态
				 */
				
				/*
				 * 点击菜单,切换菜单的显示状态
				 */
				//获取所有的class为menuSpan的元素
				var menuSpan = document.querySelectorAll(".menuSpan");
				
				//定义一个变量,来保存当前打开的菜单
				var openDiv = menuSpan[0].parentNode;
				
				//为span绑定单击响应函数
				for(var i=0 ; i<menuSpan.length ; i++){
					menuSpan[i].onclick = function(){
						
						//this代表我当前点击的span
						//获取当前span的父元素
						var parentDiv = this.parentNode;
						
						//切换菜单的显示状态
						toggleMenu(parentDiv);
						
						
						//判断openDiv和parentDiv是否相同
						if(openDiv != parentDiv  && !hasClass(openDiv , "collapsed")){
							//打开菜单以后,应该关闭之前打开的菜单
							//为了可以统一处理动画过渡效果,我们希望在这将addClass改为toggleClass
							//addClass(openDiv , "collapsed");
							//此处toggleClass()不需要有移除的功能
							//toggleClass(openDiv , "collapsed");
							//切换菜单的显示状态
							toggleMenu(openDiv);
						}
						
						//修改openDiv为当前打开的菜单
						openDiv = parentDiv;
						
					};
				}
				
				/*
				 * 用来切换菜单折叠和显示状态
				 */
				function toggleMenu(obj){
					//在切换类之前,获取元素的高度
					var begin = obj.offsetHeight;
					
					//切换parentDiv的显示
					toggleClass(obj , "collapsed");
					
					//在切换类之后获取一个高度
					var end = obj.offsetHeight;
					
					//console.log("begin = "+begin +" , end = "+end);
					//动画效果就是将高度从begin向end过渡
					//将元素的高度重置为begin
					obj.style.height = begin + "px";
					
					//执行动画,从bengin向end过渡
					move(obj,"height",end,10,function(){
						//动画执行完毕,内联样式已经没有存在的意义了,删除之
						obj.style.height = "";
					});
						
				}
				
				
			};
			
			
		</script>
		
	</head>

	<body>

		<div id="my_menu" class="sdmenu">
			<div>
				<span class="menuSpan">在线工具</span>
				<a href="#">图像优化</a>
				<a href="#">收藏夹图标生成器</a>
				<a href="#">邮件</a>
				<a href="#">htaccess密码</a>
				<a href="#">梯度图像</a>
				<a href="#">按钮生成器</a>
			</div>
			<div class="collapsed">
				<span class="menuSpan">支持我们</span>
				<a href="#">推荐我们</a>
				<a href="#">链接我们</a>
				<a href="#">网络资源</a>
			</div>
			<div class="collapsed">
				<span class="menuSpan">合作伙伴</span>
				<a href="#">JavaScript工具包</a>
				<a href="#">CSS驱动</a>
				<a href="#">CodingForums</a>
				<a href="#">CSS例子</a>
			</div>
			<div class="collapsed">
				<span class="menuSpan">测试电流</span>
				<a href="#">Current or not</a>
				<a href="#">Current or not</a>
				<a href="#">Current or not</a>
				<a href="#">Current or not</a>
			</div>
		</div>
	</body>
</html>

 

JSON
  • JS中的对象只有JS自己认时,其他的语言都不认识

  • JSON就是一个特殊格式的字符串,这个字符串可以被任意的语言所识别,并且转换为任意语言中的对象,JSON在开发中主要用来数据的交互

  • JSON:JavaScript Object Notation JS对象表示法

    • JSON和JS对象的格式一样,只不过JSON字符串中的属性名必须加双引号 - 其他和JS语法一致

  • JSON分类:

    • 对象{}

    • 数组[]

  • JSON中允许的值:

    • 字符串

    • 数值

    • 布尔值

    • null

    • 对象

    • 数组

将JSON字符串转换为JS中的对象

在JS中,为我们提供了一个工具类,就叫JSON;这个对象可以帮助我们将一个JSON对象转换为JS对象,也可以将一个JS对象转换为JSON。

JSON.parse()
- 可以将JSON字符串转换为js对象
- 他需要一个JSON字符串作为参数,会将该字符串转换为JS对象
var json = '{"name":"孙悟空","age":"18"}'
var o = JSON.parse(json);
console.log(o);
JSON.stringify()
- 可以将一个js对象转换为JSON字符串
- 需要一个介绍对象作为参数,会返回一个JSON字符串

注意:JSON这个对象在IE7及以下不支持

eval() (不推荐使用)
- 这个函数可以用来执行一段字符串形式得JS代码,并将执行结果返回
- 如果使用eval()执行得字符串中含有{ },它会将{ }当成是代码块,如果不希望将其当成代码块解析,则需要在字符串前后各加一个()
var str2 = 'alert(hello)';
eval(str2);
eval("("+str+")");

eval () 这个函数得功能很强大,可以直接执行一个字符串中得js代码,但在开发中尽量不要使用,首先它性能比较差,然后它还具有安全隐患

兼容IE7及以下 JSON 最终方案
引入外部的js文件

自己写JSON对象

posted @ 2022-01-04 15:11  Sr淑女  阅读(106)  评论(0)    收藏  举报