js
js
JavaScript概述
JavaScript历史
- 1992年Nombas开发出C-minus-minus(C--)的嵌入式脚本语言(最初绑定在CEnvi软件中).后将其改名ScriptEase.(客户端执行的语言)
- Netscape(网景)接收Nombas的理念,(Brendan Eich)在其Netscape Navigator 2.0产品中开发出一套livescript的脚本语言.Sun和Netscape共同完成.后改名叫Javascript
- 微软随后模仿在其IE3.0的产品中搭载了一个JavaScript的克隆版叫Jscript.
- 为了统一三家,ECMA(欧洲计算机制造协会)定义了ECMA-262规范.国际标准化组织及国际电工委员会(ISO/IEC)也采纳 ECMAScript 作为标准(ISO/IEC-16262)。从此,Web 浏览器就开始努力(虽然有着不同的程度的成功和失败)将 ECMAScript 作为 JavaScript 实现的基础。EcmaScript是规范.
JavaScript简介
1、它是一种客户端语言。
2、一个完整的JavaScript实现是由以下三个部分构成的:
- 核心(ECMAScript),语法规范(包括语法、类型、语句、关键字、运算符等)
- 文档对象模型(DOM) Document object model (整合js,css,html)
- 浏览器对象模型(BOM) Broswer object model(整合js和浏览器)
3、javascript在开发中绝大多数情况是基于对象的,也是面对对象的。
JavaScript引入方式
1.嵌入式:一般没有规定放在哪里,但是一般情况下,都放在<html>标签中和<body>标签平级并写在它后面,因为浏览器加载的时候是从上到下的,需要等标签加载完成了才能找到并操作标签。
<script> alert('222222'); </script>
2.引入js的文件,方法和上面基本一样,就是在script标签的属性中,加入src="js文件.js"
<script src="./js/out.js"></script>
基本语法
1、每行结束可以不加分号. 没有分号会以换行符作为每行的结束
2、 注释
多行注释:/* */
单行注释: //
3、使用{}来封装代码块
数据的基本类型
5种基本数据类型:Number 、String、Boolean、Undefined、Null
1种复合类型 object
注:
1、可以用typeof()查看类型
2、基本数据类型:存储在栈中
3、引用数据类型:定义的对象存储在堆中,栈中保存的地址
数字类型(Number)
最基本的数据类型
不区分整型数值和浮点型数值
所有数字都采用64位浮点格式存储,相当于Java和C语言中的double格式
能表示的最大值是±1.7976931348623157 x 10308
能表示的最小值是±5 x 10 -324
整数:
在JavaScript中10进制的整数由数字的序列组成
精确表达的范围是
-9007199254740992
(-253) 到 9007199254740992 (253)
超出范围的整数,精确度将受影响
浮点数:
使用小数点记录数据
例如:3.4,5.6
使用指数记录数据
例如:4.3e23 =
4.3 x 1023
16进制和8进制数的表达:
16进制数据前面加上0x,八进制前面加0
16进制数是由0-9,A-F等16个字符组成
8进制数由0-7等8个数字组成
字符串(String)
是由Unicode字符、数字、标点符号组成的序列
字符串常量首尾由单引号或双引号括起
JavaScript中没有字符类型
常用特殊字符在字符串中的表达
字符串中部分特殊字符必须加上右划线\
常用的转义字符 \n:换行 \':单引号 \":双引号 \\:右划线
布尔型(Boolean)
Boolean类型仅有两个值:true和false,也代表1和0,实际运算中true=1,false=0
布尔值也可以看作on/off、yes/no、1/0对应true/false
Boolean值主要用于JavaScript的控制语句,例如
if (x==1){
y=y+1;
}else {
y=y-1;
}
Undefined类型
Undefined 类型只有一个值,即 undefined。当声明的变量未初始化时,该变量的默认值是 undefined。
当函数无明确返回值时,返回的也是值 "undefined";
Null类型
另一种只有一个值的类型是 Null,它只有一个专用值 null,即它的字面量。值 undefined 实际上是从值 null 派生来的,因此 ECMAScript 把它们定义为相等的。
尽管这两个值相等,但它们的含义不同。undefined 是声明了变量但未对其初始化时赋予该变量的值,null 则用于表示尚未存在的对象(在讨论 typeof 运算符时,简单地介绍过这一点)。如果函数或方法要返回的是对象,那么找不到该对象时,返回的通常是 null。
复合类型
var oObj = {
name:"隔壁老王",
age:88,
}
var type = typeof(oObj);
alert(type); //Ojbect
alert(oObj.name); //隔壁老王
数据类型转换
基本数据类型转换
JavaScript属于松散类型的程序语言
变量在声明的时候并不需要指定数据类型
变量只有在赋值的时候才会确定数据类型
表达式中包含不同类型数据则在计算过程中会强制进行类别转换
数字 + 字符串:数字转换为字符串
数字 + 布尔值:true转换为1,false转换为0
字符串 + 布尔值:布尔值转换为字符串true或false
强制数据类型转换
函数parseInt: 强制转换成整数,不四舍五入。 例如parseInt("6.12")=6 ; parseInt(“12a")=12 ; parseInt(“a12")=NaN ;parseInt(“1a2")=1
NaN是not a number,属于number的一种
函数parseFloat: 强制转换成浮点数 parseFloat("6.12")=6.12
函数eval: 将字符串强制转换为表达式并返回结果 eval("1+1")=2 ; eval("1<2")=true
类型查询函数(typeof)
当你不知道数据转换到是什么类型的时候可以使用这个函数
ECMAScript 提供了 typeof 运算符来判断一个值是否在某种类型的范围内。可以用这种运算符判断一个值是否表示一种原始类型:如果它是原始类型,还可以判断它表示哪种原始类型。
函数typeof :查询数值当前类型 (string / number / boolean / object )
例如typeof("test"+3) "string"
例如typeof(null) "object " 注意null属于object
例如typeof(undefined) "undefined"
例如typeof(true+1) "number"
例如typeof(true-false) "number"
变量
变量的定义
在js中,定义一个变量很简单,只需要var一个变量名就可以了,它会根据你的赋的值自动判断,比如:
var iNumber = 100;
var sString = "hello";
var bBoolean = true;
一行可以声明多个变量并且可以是不同类型
var iOne = 10,iTwo = 20, iThre = 30;
变量命名规范
1.区分大小写
2.第一个字符必须是字母/下划线(_)/美元符号($)
3.其他字符可以是字母,下划线,美元符号,数字
4.最好做到见名知意
匈牙利命名法
标记法命名的变量前附加一个小写字母(或小写字母序列),说明该变量的类型。例如,i 表示整数,s 表示字符串,如下所示“
对象o Object 比如:oDiv
数组a Array 比如:aItems
字符串s String 比如:sUserName
整数i Integer 比如:iItemCount
布尔值b Boolean 比如:bIsComplete
浮点数f Float 比如:fPrice
函数fn Function 比如:fnHandler
正则表达式re RegExp 比如:reEmailCheck
常量和标识符
常量 :直接在程序中出现的数据值
标识符:
- 由不以数字开头的字母、数字、下划线(_)、美元符号($)组成
- 常用于表示函数、变量等的名称
- 例如:_abc,$abc,abc,abc123是标识符,而1abc不是
- JavaScript语言中代表特定含义的词称为保留字,不允许程序再定义为标识符

运算符
算数运算符
基本运算符
加(+)、 减(-)、 乘(*) 、除(/) 、余数(% ) 加、减、乘、除、余数和数学中的运算方法一样 例如:9/2=4.5,4*5=20,9%2=1
-除了可以表示减号还可以表示负号 例如:x=-y
+除了可以表示加法运算还可以用于字符串的连接 例如:"abc"+"def"="abcdef"
递增(++) 、递减(--)
假如x=2,那么x++表达式执行后的值为3,x--表达式执行后的值为1
i++相当于i=i+1,i--相当于i=i-1
递增和递减运算符可以放在变量前也可以放在变量后:--i
var i=1;
console.log(i++); 这个是先显示再加一
console.log(++i); 这个是先加一再显示
console.log(i--); 这个是先显示再减一
console.log(--i); 这个是先减一再显示
一元加减法
var c="10";
console.log(typeof (c)); //string
c=+c; //类型转换
console.log(typeof (c)); //number
//---------------------------------------
var a=1;
var b=1;
a=-a;
console.log(a)
//---------------------------------------
var iNumber = NaN;
console.log(iNumber>3); //false
console.log(iNumber>3); //false
console.log(iNumber==3); //false
console.log(iNumber==NaN); //false
console.log(iNumber!=1); //true
逻辑运算符
与 (&&) 、或(||) 、非(!)
1 && 1 = 1
1 && 0 = 0
0 && 0 = 0
1 || 1 = 1
1 || 0 = 1
0 || 0 = 0
!0=1
!1=0
注意:
1、如果某个运算数不是原始的 Boolean 型值,与和或并不一定返回 Boolean 值:
- 如果某个运算数是 null,返回 null。
- 如果某个运算数是 NaN,返回 NaN。
- 如果某个运算数是 undefined,返回undefined。
2、单个的&和|是位运算
3、AND下
如果一个运算数是对象,另一个是boolean值,返回该对象
如果两个运算数都是对象,返回第二个对象
4、OR下
如果一个运算数是对象,并且该对象左边的运算数值均为false,则返回该对象
如果两个运算数都是对象,返回第一个对象
赋值运算符
JavaScript中=代表赋值,两个等号==表示判断是否相等
例如,x=1表示给x赋值为1
if (x==1){...}程序表示当x与1相等时
if(x==“on”){…}程序表示当x与“on”相等时
配合其他运算符形成的简化表达式
例如i+=1相当于i=i+1,i*=1相当于i=i*1,
关系运算符
等于 ( == ) 、不等于( != ) 、 大于( > ) 、 小于( < ) 大于等于(>=) 、小于等于(<=)
特殊的例子:
1、
var bResult = "Blue" < "alpha";
alert(bResult); //输出 true,字符串 "Blue" 小于 "alpha",因为字母 B 的字符代码是 66,字母 a 的字符代码是 97。
2、
var bResult = "25" < "3";
alert(bResult); //输出 "true",字符串 "25" 和 "3"。两个运算数都是字符串,所以比较的是它们的字符代码("2" 的字符代码是 50,"3" 的字符代码是 51)。
3、
var bResult = "25" < 3;
alert(bResult); //输出 "false",字符串 "25" 将被转换成数字 25,然后与数字 3 进行比较
总结:
比较运算符两侧如果一个是数字类型,一个是其他类型,会将其类型转换成数字类型.
比较运算符两侧如果都是字符串类型,比较的是最高位的asc码,如果最高位相等,继续取第二位比较.
控制语句
if语句
if-else基本格式
if (表达式){
语句1;
......
}else{
语句2;
.....
}
功能说明:
如果表达式的值为true则执行语句1,否则执行语句2
if语句嵌套格式
if (表达式1) {
语句1;
}else if (表达式2){
语句2;
}else if (表达式3){
语句3;
} else{
语句4;
}
运行流程如图所示:

switch语句
switch基本格式
switch (表达式) {
case 值1:语句1;break; //当满足case,执行语句1,然后break退出switch,执行switch的下一条语句
case 值2:语句2;break;
case 值3:语句3;break;
default:语句4; //所以条件都不满足会执行语句四
}
例子:
var x=3 switch(x){ case 1:y="星期一"; break; case 2:y="星期二"; break; case 3:y="星期三"; break; case 4:y="星期四"; break; case 5:y="星期五"; break; case 6:y="星期六"; break; case 7:y="星期日"; break; default: y="未定义"; } console.log(y); //结果为星期三 switch(x){ case 1:y="星期一"; break; case 2:y="星期二"; break; case 3:y="星期三"; case 4:y="星期四"; case 5:y="星期五"; break; case 6:y="星期六"; break; case 7:y="星期日"; break; default: y="未定义"; } console.log(y); //结果是星期五,在switch中,跳出switch一共有两种方式,一个是break跳出来,一个是switch顺序执行完。这个例子结果是星期五的原因是,它满足等于3的条件,然后赋值为星期三,但是这个条件后面没有break来跳出switch,所以它会继续顺次执行,而且不管满不满足条件,直接执行语句,当遇到等于五并且给y赋值为了星期五之后,就跳出了循环。
补充:
首先要看一个问题,if 语句适用范围比较广,只要是 boolean 表达式都可以用 if 判断;而 switch 只能对基本类型进行数值比较。两者的可比性就仅限在两个基本类型比较的范围内。
说到基本类型的数值比较,那当然要有两个数。然后重点来了——
if 语句每一句都是独立的,看下面的语句:
if (a == 1) ...
else if (a == 2) ...
这样 a 要被读入寄存器两次,1 和 2 分别被读入寄存器一次。于是你是否发现其实 a 读两次是有点多余的,在你全部比较完之前只需要一次读入寄存器就行了,其余都是额外开销。但是 if 语句必须每次都把里面的两个数从内存拿出来读到寄存器,它不知道你其实比较的是同一个 a。
于是 switch case 就出来了,把上面的改成 switch case 版本:
switch (a) {
case 0:
break;
case 1:
}
总结:
1.switch用来根据一个整型值进行多路分支,并且编译器可以对多路分支进行优化
2.switch-case只将表达式计算一次,然后将表达式的值与每个case的值比较,进而选
择执行哪一个case的语句块
3.if..else 的判断条件范围较广,每条语句基本上独立的,每次判断时都要条件加载
一次。
所以在多路分支时用switch比if..else if .. else结构要效率高。
for语句
for循环基本格式
for (初始化;条件;增量){
语句1;
...
}
功能说明
实现条件循环,当条件成立时,执行语句1,否则跳出循环体
详细解释:当执行的for的一开始,先执行初始化的操作。然后判断条件是否满足,满足则继续执行循环体内语句,不满足则直接退出执行for循环体之后的语句。满足时,执行完循环体内语句后,执行增量的语句。增量语句执行完毕之后,再进行判断,如果满足则继续执行,执行方式和第一次时一致。
var iSum=0;
for(var iNum=1;iNum<=10;iNum++){
iSum+=iNum;
}
console.log(iSum);
while语句
while基本格式
while (条件){
语句1;
...
}
功能说明
运行功能和for类似,当条件成立循环执行语句花括号{}内的语句,否则跳出循环
例子:
var i=1;
while (i<=7) {
document.write("<H"+i+">hello</H "+i+"> ");
document.write("<br>");
i++;
}
//循环输出H1到H7的字体大小
异常处理语句
try {
//这段代码从上往下运行,其中任何一个语句抛出异常该代码块就结束运行
}
catch (e) {
// 如果try代码块中抛出了异常,catch代码块中的代码就会被执行。
//e是一个局部变量,用来指向Error对象或者其他抛出的对象
}
finally {
//无论try中代码是否有异常抛出(甚至是try代码块中有return语句),finally代码块中始终会被执行。
}
注:主动抛出异常 throw Error('xxxx')
ECMA对象
从传统意义上来说,ECMAScript 并不真正具有类。事实上,除了说明不存在类,在 ECMA-262 中根本没有出现“类”这个词。ECMAScript 定义了“对象定义”,逻辑上等价于其他程序设计语言中的类。
var o = new Object();
这种语法与 Java 语言的相似,不过当有不止一个参数时,ECMAScript 要求使用括号。如果没有参数,如以下代码所示,括号可以省略:
var o = new Object;
注意:尽管括号不是必需的,但是为了避免混乱,最好使用括号。
在 ECMAScript 中,所有对象并非同等创建的。
一般来说,可以创建并使用的对象有三种:本地对象、内置对象和宿主对象。
宿主环境:一般宿主环境由外壳程序创建与维护,只要能提供js引擎执行的环境都可称之为外壳程序。如:web浏览器,一些桌面应用系统等。即由web浏览器或是这些桌面应用系统早就的环境即宿主环境。
1、本地对象
ECMA-262 把本地对象(native object)定义为“独立于宿主环境的 ECMAScript 实现提供的对象”。
再来看一下,“本地对象”包含哪些内容:
Object、Function、Array、String、Boolean、Number、Date、RegExp、Error、EvalError、RangeError、ReferenceError、SyntaxError、TypeError、URIError
由此可以看出,简单来说,本地对象就是 ECMA-262 定义的类(引用类型)。
2、内置对象
ECMA-262 把内置对象(built-in object)定义为“由 ECMAScript 实现提供的、独立于宿主环境的所有对象,在 ECMAScript 程序开始执行时出现”。这意味着开发者不必明确实例化内置对象,它已被实例化了。
同样是“独立于宿主环境”。根据定义我们似乎很难分清“内置对象”与“本地对象”的区别。而ECMA-262 只定义了两个内置对象,即 Global 和 Math (它们也是本地对象,根据定义,每个内置对象都是本地对象)。
如此就可以理解了。内置对象是本地对象的一种。而其包含的两种对象中,Math对象我们经常用到,可这个Global对象是啥东西呢?
Global对象是ECMAScript中最特别的对象,因为实际上它根本不存在,但大家要清楚,在ECMAScript中,不存在独立的函数,所有函数都必须是某个对象的方法。类似于isNaN()、parseInt()和parseFloat()方法等,看起来都是函数,而实际上,它们都是Global对象的方法。而且Global对象的方法还不止这些。有关Global对象的具体方法和属性,感兴趣的同学可以看一下这里:JavaScript 全局对象参考手册
3.宿主对象
由ECMAScript实现的宿主环境提供的对象,可以理解为:浏览器提供的对象。所有的BOM和DOM都是宿主对象。
4.自定义对象
这个可能让人有些发懵,简单总结一下:
1 JS中,可以将对象分为“内部对象”、“宿主对象”和“自定义对象”三种。 2 1,内部对象 3 js中的内部对象包括Array、Boolean、Date、Function、Global、Math、Number、Object、RegExp、String以及各种错误类对象,包括Error、EvalError、RangeError、ReferenceError、SyntaxError和TypeError。 4 5 其中Global和Math这两个对象又被称为“内置对象”,这两个对象在脚本程序初始化时被创建,不必实例化这两个对象。 6 7 2.宿主对象 8 宿主对象就是执行JS脚本的环境提供的对象。对于嵌入到网页中的JS来说,其宿主对象就是浏览器提供的对象,所以又称为浏览器对象,如IE、Firefox等浏览器提供的对象。不同的浏览器提供的宿主对象可能不同,即使提供的对象相同,其实现方式也大相径庭!这会带来浏览器兼容问题,增加开发难度。 9 10 浏览器对象有很多,如Window和Document等等 11 12 3.自定义对象 13 顾名思义,就是开发人员自己定义的对象。JS允许使用自定义对象,使JS应用及功能得到扩充
object对象:ECMAScript 中的所有对象都由这个对象继承而来;Object 对象中的所有属性和方法都会出现在其他对象中,说两种常用的
ToString() : 返回对象的原始字符串表示。
ValueOf() : 返回最适合该对象的原始值。对于许多对象,该方法返回的值都与 ToString() 的返回值相同。
常用对象
String对象
创建方式:
var str1="hello world";
属性:
var str1="String对象"; var str2=""; alert("str1长度 "+str1.length); //8 alert("str2长度 "+str2.length); //0
方法:
格式编排
1 var x="yuan"; 2 var y="x.italics():"+x.italics(); 3 console.log(y); //结果:x.italics():<i>yuan</i>
大小写转换
var str1="AbcdEfgh"; var str2=str1.toLowerCase(); var str3=str1.toUpperCase(); alert(str2); //结果为"abcdefgh" alert(str3); //结果为"ABCDEFGH"
获取指定字符串
书写格式 x.charAt(index) x.charCodeAt(index) 使用注解 x代表字符串对象 index代表字符位置 index从0开始编号 charAt返回index位置的字符 charCodeAt返回index位置的Unicode编码 ---------------------- var str1="welcome to the world of JS! 苑昊"; var str2=str1.charAt(28); var str3=str1.charCodeAt(28); alert(str2); //结果为"苑" alert(str3); //结果为33489
查询字符串
1 //书写格式 2 // 3 //x.indexOf(findstr,index) 4 //x.lastIndexOf(findstr) 5 //------------------------------------- 6 var str1="welcome to the world of JS!"; 7 8 var str2=str1.indexOf("l"); 9 var str3=str1.lastIndexOf("l"); 10 alert(str2); 11 //结果为2 12 alert(str3); 13 //结果为18 14 15 //-------*********************************************************------- 16 17 //书写格式 18 // 19 //x.match(regexp) 20 // 21 //x.search(regexp) 22 // 23 //使用注解 24 // 25 //x代表字符串对象 26 // 27 //regexp代表正则表达式或字符串 28 // 29 //match返回匹配字符串的数组,如果没有匹配则返回null 30 // 31 //search返回匹配字符串的首字符位置索引 32 //------------------------------------- 33 var str1="welcome to the world of JS!"; 34 35 var str2=str1.match("world"); 36 var str3=str1.search("world"); 37 alert(str2[0]); 38 //结果为"world" 39 alert(str3); 40 //结果为15
截取字符串
1 //截取子字符串 2 // 3 //书写格式 4 // 5 //x.substr(start, length) 6 // 7 //x.substring(start, end) 8 // 9 //使用注解 10 // 11 //x代表字符串对象 12 // 13 //start表示开始位置 14 // 15 //length表示截取长度 16 // 17 //end是结束位置加1 18 // 19 //第一个字符位置为0 20 21 22 var str1="abcdefgh"; 23 var str2=str1.substr(2,4); 24 var str3=str1.substring(2,4); 25 alert(str2); 26 //结果为"cdef" 27 alert(str3); 28 //结果为"cd" 29 30 //-------*********************************************************------- 31 //x.slice(start, end) 32 33 34 var str1="abcdefgh"; 35 var str2=str1.slice(2,4); 36 var str3=str1.slice(4); 37 var str4=str1.slice(2,-1); 38 var str5=str1.slice(-3,-1); 39 alert(str2); 40 //结果为"cd" 41 alert(str3); 42 //结果为"efgh" 43 alert(str4); 44 //结果为"cdefg" 45 alert(str5); 46 //结果为"fg"
替换字符串
1 //x.replace(findstr,tostr) 2 3 var str1="abcdefgh"; 4 var str2=str1.replace("cd","aaa"); 5 alert(str2); 6 //结果为"abaaaefgh"
分割字符串
1 var str1="一,二,三,四,五,六,日"; 2 3 var strArray=str1.split(","); 4 5 alert(strArray[1]); 6 //结果为"二"
连接字符串
1 //y=x.concat(addstr) 2 // 3 //使用注解 4 // 5 //x代表字符串对象 6 //addstr为添加字符串 7 //返回x+addstr字符串 8 9 var str1="abcd"; 10 var str2=str1.concat("efgh"); 11 12 alert(str2); 13 //结果为"abcdefgh"
Array对象
创建一维数组方式:
1 创建方式1: 2 var a=[1,2,3]; 3 4 创建方式2: 5 new Array(); // 这个是不指定元素个数的创建方式,这个创建的是空数组 6 7 创建方式3: 8 new Array(size);// 这个是指定元素个数的创建方式 9 例如: 10 var cnweek=new Array(7); 11 cnweek[0]="星期日"; 12 cnweek[1]="星期一"; 13 ... 14 cnweek[6]="星期六"; 15 16 创建方式4: 17 var test=new Array(100,"a",true);
创建二维数组方式:
1 var cnweek=new Array(7); 2 for (var i=0;i<=6;i++){ 3 cnweek[i]=new Array(2); 4 } 5 cnweek[0][0]="星期日"; 6 cnweek[0][1]="Sunday"; 7 cnweek[1][0]="星期一"; 8 cnweek[1][1]="Monday"; 9 ... 10 cnweek[6][0]="星期六"; 11 cnweek[6][1]="Saturday";
注意:数组内可以放不同类型的内容
arr1=[1,”hello”,[11,2],{“name”:”liming”}];
属性:
arr1=[1,"hello",[11,2],{"name":"liming"}];
alert(arr1.length); //4
方法:
数组连接(join)
1 //书写格式 2 //x.join(bystr) 3 //使用注解 4 // 5 //x代表数组对象 6 //bystr作为连接数组中元素的字符串 7 //返回连接后的字符串 8 //与字符串的split功能刚好相反 9 10 var arr1=[1, 2, 3, 4, 5, 6, 7]; 11 12 var str1=arr1.join("-"); 13 14 alert(str1); 15 //结果为"1-2-3-4-5-6-7"
数组连接(concat)
1 var a = [1,2,3]; 2 var b=a.concat(4,5) ; 3 4 5 alert(a.toString()); 6 //返回结果为1,2,3 7 alert(b.toString()); 8 //返回结果为1,2,3,4,5
数组排序
1 //x.reverse() 2 //x.sort() 3 4 var arr1=[32, 12, 111, 444]; 5 //var arr1=["a","d","f","c"]; 6 7 arr1.reverse(); //颠倒数组元素 8 alert(arr1.toString()); 9 //结果为444,111,12,32 10 11 arr1.sort(); //排序数组元素 12 alert(arr1.toString()); 13 //结果为111,12,32,444 14 15 //------------------------------ 16 arr=[1,5,2,100]; 17 18 //arr.sort(); 19 //alert(arr); 20 //如果就想按着数字比较呢? 21 22 function intSort(a,b){ 23 if (a>b){ 24 return 1;//-1 25 } 26 else if(a<b){ 27 return -1;//1 28 } 29 else { 30 return 0 31 } 32 } 33 34 arr.sort(intSort); 35 36 alert(arr); 37 38 function IntSort(a,b){ 39 return a-b; 40 }
数组切片
1 //x.slice(start, end) 2 // 3 //使用注解 4 // 5 //x代表数组对象 6 //start表示开始位置索引 7 //end是结束位置下一数组元素索引编号 8 //第一个数组元素索引为0 9 //start、end可为负数,-1代表最后一个数组元素 10 //end省略则相当于从start位置截取以后所有数组元素 11 12 var arr1=['a','b','c','d','e','f','g','h']; 13 var arr2=arr1.slice(2,4); 14 var arr3=arr1.slice(4); 15 var arr4=arr1.slice(2,-1); 16 17 alert(arr2.toString()); 18 //结果为"c,d" 19 alert(arr3.toString()); 20 //结果为"e,f,g,h" 21 alert(arr4.toString()); 22 //结果为"c,d,e,f,g"
删除数组元素
1 //x. splice(start, deleteCount, value, ...) 2 // 3 //使用注解 4 // 5 //x代表数组对象 6 //splice的主要用途是对数组指定位置进行删除和插入 7 //start表示开始位置索引 8 //deleteCount删除数组元素的个数 9 //value表示在删除位置插入的数组元素 10 //value参数可以省略 11 12 13 var a = [1,2,3,4,5,6,7,8]; 14 a.splice(1,2); 15 //a变为 [1,4,5,6,7,8] 16 alert(a.toString()); 17 a.splice(1,1); 18 //a变为[1,5,6,7,8] 19 alert(a.toString()); 20 a.splice(1,0,2,3); 21 //a变为[1,2,3,5,6,7,8] 22 alert(a.toString());
数组栈操作1
1 //push pop这两个方法模拟的是一个栈操作 2 3 //x.push(value, ...) 压栈 4 //x.pop() 弹栈 5 //使用注解 6 // 7 //x代表数组对象 8 //value可以为字符串、数字、数组等任何值 9 //push是将value值添加到数组x的结尾 10 //pop是将数组x的最后一个元素删除 11 12 13 var arr1=[1,2,3]; 14 arr1.push(4,5); 15 alert(arr1); 16 //结果为"1,2,3,4,5" 17 arr1.push([6,7]); 18 alert(arr1) 19 //结果为"1,2,3,4,5,6,7" 20 arr1.pop(); //注意最后一次添加的是什么 21 alert(arr1); 22 //结果为"1,2,3,4,5"
数组栈操作2
1 // unshift shift 2 //x.unshift(value,...) 3 //x.shift() 4 //使用注解 5 // 6 //x代表数组对象 7 //value可以为字符串、数字、数组等任何值 8 //unshift是将value值插入到数组x的开始 9 //shift是将数组x的第一个元素删除 10 11 var arr1=[1,2,3]; 12 arr1.unshift(4,5); 13 alert(arr1); 14 //结果为"4,5,1,2,3" 15 arr1. unshift([6,7]); 16 alert(arr1); 17 //结果为"6,7,4,5,1,2,3" 18 arr1.shift(); 19 alert(arr1); 20 //结果为"4,5,1,2,3"
总结:
// js中数组的特性 //java中数组的特性, 规定是什么类型的数组,就只能装什么类型.只有一种类型. //js中的数组特性1: js中的数组可以装任意类型,没有任何限制. //js中的数组特性2: js中的数组,长度是随着下标变化的.用到多长就有多长. var arr5 = ['abc',123,1.14,true,null,undefined,new String('1213'),new Function('a','b','alert(a+b)')]; /* alert(arr5.length);//8 arr5[10] = "hahaha"; alert(arr5.length); //11 alert(arr5[9]);// undefined */
Data对象
创建Data方式:
1 //方法1:不指定参数 2 var nowd1=new Date(); 3 alert(nowd1.toLocaleString( )); 4 //方法2:参数为日期字符串 5 var nowd2=new Date("2004/3/20 11:12"); 6 alert(nowd2.toLocaleString( )); 7 var nowd3=new Date("04/03/20 11:12"); 8 alert(nowd3.toLocaleString( )); 9 //方法3:参数为毫秒数 10 var nowd3=new Date(5000); 11 alert(nowd3.toLocaleString( )); 12 alert(nowd3.toUTCString()); 13 14 //方法4:参数为年月日小时分钟秒毫秒 15 var nowd4=new Date(2004,2,20,11,12,0,300); 16 alert(nowd4.toLocaleString( )); 17 //毫秒并不直接显示
方法:
获取日期和时间
1 获取日期和时间 2 getDate() 获取日 3 getDay () 获取星期 4 getMonth () 获取月(0-11) 5 getFullYear () 获取完整年份 6 getYear () 获取年 7 getHours () 获取小时 8 getMinutes () 获取分钟 9 getSeconds () 获取秒 10 getMilliseconds () 获取毫秒 11 getTime () 返回累计毫秒数(从1970/1/1午夜)
设置日期和时间
1 //设置日期和时间 2 //setDate(day_of_month) 设置日 3 //setMonth (month) 设置月 4 //setFullYear (year) 设置年 5 //setHours (hour) 设置小时 6 //setMinutes (minute) 设置分钟 7 //setSeconds (second) 设置秒 8 //setMillliseconds (ms) 设置毫秒(0-999) 9 //setTime (allms) 设置累计毫秒(从1970/1/1午夜) 10 11 var x=new Date(); 12 x.setFullYear (1997); //设置年1997 13 x.setMonth(7); //设置月7 14 x.setDate(1); //设置日1 15 x.setHours(5); //设置小时5 16 x.setMinutes(12); //设置分钟12 17 x.setSeconds(54); //设置秒54 18 x.setMilliseconds(230); //设置毫秒230 19 document.write(x.toLocaleString( )+"<br>"); 20 //返回1997年8月1日5点12分54秒 21 22 x.setTime(870409430000); //设置累计毫秒数 23 document.write(x.toLocaleString( )+"<br>"); 24 //返回1997年8月1日12点23分50秒
日期和时间的转换
1 日期和时间的转换: 2 3 getTimezoneOffset():8个时区×15度×4分/度=480; 4 返回本地时间与GMT的时间差,以分钟为单位 5 toUTCString() 6 返回国际标准时间字符串 7 toLocalString() 8 返回本地格式时间字符串 9 Date.parse(x) 10 返回累计毫秒数(从1970/1/1午夜到本地时间) 11 Date.UTC(x) 12 返回累计毫秒数(从1970/1/1午夜到国际时间)
例题:
1 function getCurrentDate(){ 2 //1. 创建Date对象 3 var date = new Date(); //没有填入任何参数那么就是当前时间 4 //2. 获得当前年份 5 var year = date.getFullYear(); 6 //3. 获得当前月份 js中月份是从0到11. 7 var month = date.getMonth()+1; 8 //4. 获得当前日 9 var day = date.getDate(); 10 //5. 获得当前小时 11 var hour = date.getHours(); 12 //6. 获得当前分钟 13 var min = date.getMinutes(); 14 //7. 获得当前秒 15 var sec = date.getSeconds(); 16 //8. 获得当前星期 17 var week = date.getDay(); //没有getWeek 18 // 2014年06月18日 15:40:30 星期三 19 return year+"年"+changeNum(month)+"月"+day+"日 "+hour+":"+min+":"+sec+" "+parseWeek(week); 20 } 21 22 alert(getCurrentDate()); 23 24 //解决 自动补齐成两位数字的方法 25 function changeNum(num){ 26 if(num < 10){ 27 return "0"+num; 28 }else{ 29 return num; 30 } 31 32 } 33 //将数字 0~6 转换成 星期日到星期六 34 function parseWeek(week){ 35 var arr = ["星期日","星期一","星期二","星期三","星期四","星期五","星期六"]; 36 // 0 1 2 3 ............. 37 return arr[week]; 38 }
RegExp对象
//RegExp对象 // 在表单验证时使用该对象验证用户填入的字符串是否符合规则. //创建正则对象方式1 参数1 正则表达式 参数2 验证模式 g global / i 忽略大小写. //参数2一般填写g就可以,也有“gi”. // 用户名 首字母必须是英文, 除了第一位其他只能是英文数字和_ . 长度最短不能少于6位 最长不能超过12位 //----------------------------创建方式1 /* var reg1 = new RegExp("^[a-zA-Z][a-zA-Z0-9_]{5,11}$","g"); // //验证字符串 var str = "bc123"; alert(reg1.test(str));// true //----------------------------创建方式2 /填写正则表达式/匹配模式; var reg2 = /^[a-zA-Z][a-zA-Z0-9_]{5,11}$/g; alert(reg2.test(str));// true */ //-------------------------------正则对象的方法------------------- //test方法 ==> 测试一个字符串是否复合 正则规则. 返回值是true 和false. //-------------------------String 中与正则结合的4个方法------------------. // macth search split replace var str = "hello world"; //alert(str.match(/o/g)); //查找字符串中 复合正则的 内容. //alert(str.search(/h/g));// 0 查找字符串中符合正则表达式的内容位置 //alert(str.split(/o/g)); // 按照正则表达式对字符串进行切割. 返回数组; alert(str.replace(/o/g, "s")); // hells wsrld 对字符串按照正则进行替换.
Math对象
//Math对象 //该对象中的属性方法 和数学有关. //Math是内置对象 , 与Global的不同之处是, 在调用时 需要打出 "Math."前缀. //属性学习: //alert(Math.PI); //方法学习: //alert(Math.random()); // 获得随机数 0~1 不包括1. //alert(Math.round(1.5)); // 四舍五入 //练习:获取1-100的随机整数,包括1和100 //var num=Math.random(); //num=num*10; //num=Math.round(num); // alert(num) //============max min========================= /* alert(Math.max(1,2));// 2 alert(Math.min(1,2));// 1 */ //-------------pow-------------------------------- alert(Math.pow(2,4));// pow 计算参数1 的参数2 次方. abs(x) 返回数的绝对值。 exp(x) 返回 e 的指数。 floor(x)对数进行下舍入。 log(x) 返回数的自然对数(底为e)。 max(x,y) 返回 x 和 y 中的最高值。 min(x,y) 返回 x 和 y 中的最低值。 pow(x,y) 返回 x 的 y 次幂。 random() 返回 0 ~ 1 之间的随机数。 round(x) 把数四舍五入为最接近的整数。 sin(x) 返回数的正弦。 sqrt(x) 返回数的平方根。 tan(x) 返回角的正切。
Function对象(重要)
创建function的方式:
方式一: function 函数名 (参数){ 函数体; return 返回值; } 方式二: var 函数名 = new Function("参数1","参数n","function_body");
功能说明:
- 可以使用变量、常量或表达式作为函数调用的参数
- 函数由关键字function定义
- 函数名的定义规则与标识符一致,大小写是敏感的
- 返回值必须使用return
实例:
alert(1); function func1(){ alert('hello yuan!'); return 8 } ret=func1(); alert(ret) ---------------- var func1=new Function("name","alert(\"hello\"+name);") func1("yuan")
注意:js的函数加载执行与python不同,它是整体加载完才会执行,所以执行函数放在函数声明上面或下面都可以:
属性:
length属性
alert(func1.length) //返回这个函数期望的函数参数
方法:
Function 对象也有与所有对象共享的 valueOf() 方法和 toString() 方法。这两个方法返回的都是函数的源代码,在调试时尤其有用。
例如:
function func1(){ alert('hello'); return 8 } alert(func1.valueOf())
函数的调用:
function func1(a,b){ alert(a+b); } func1(1,2); //3 func1(1,2,3); //3 func1(1); //NaN func1(); //NaN
函数的内置函数arguments:
function add(a,b){ console.log(a+b);//3 console.log(arguments.length);//2 console.log(arguments);//[1,2] } add(1,2) ------------------arguments的用处1 ------------------ function nxAdd(){ var result=0; for (var num in arguments){ //for的另一种写法,但是不建议使用,可能会出错 result+=arguments[num] } alert(result) } nxAdd(1,2,3,4,5) // ------------------arguments的用处2 ------------------ function f(a,b,c){ if (arguments.length!=3){ throw new Error("给了我"+arguments.length+" 个数,但是我只需要三个数") } else { alert("success!") } } f(1,2,3,4,5)
匿名函数:
var func = function(arg){ return "tony"; }
注意:它和普通函数是有区别的,是按逐行执行的规则的,如果调用写在前面会报错
自执行函数:
(function(){ alert("tony"); })() (function(arg){ console.log(arg); })('123') //前面的函数是一个正常的函数,只不过没有名字,所以用括号包裹起来,这个时候它需要一个参数,后面给他传一个参数。
作用域:
js的作用域和py相似,if while等控制语句并没有自己作用域;而函数是有自己的作用域的;
例子1:
var city = 'beijing'; function func(){ var city = 'shanghai'; function inner(){ var city = 'shenzhen'; console.log(city); //shenzhen } inner(); } func();
例子2:
var city = 'beijing'; function Bar(){ console.log(city); } function func(){ var city = 'shanghai'; return Bar; } var ret = func(); ret(); //beijing
闭包:
var city = 'beijing'; function func(){ var city = "shanghai"; function inner(){ // var city = "langfang"; console.log(city); } return inner; } var ret = func(); ret(); //shanghai
BOM对象
BOM(浏览器对象模型),可以对浏览器窗口进行访问和操作。使用 BOM,开发者可以移动窗口、改变状态栏中的文本以及执行其他与页面内容不直接相关的动作。
使 JavaScript 有能力与浏览器“对话”。
window对象
方法:
alert() 显示带有一段消息和一个确认按钮的警告框。
confirm() 显示带有一段消息以及确认按钮和取消按钮的对话框。
prompt() 显示可提示用户输入的对话框。
open() 打开一个新的浏览器窗口或查找一个已命名的窗口。
close() 关闭浏览器窗口。
setInterval() 按照指定的周期(以毫秒计)来调用函数或计算表达式。
clearInterval() 取消由 setInterval() 设置的 timeout。
setTimeout() 在指定的毫秒数后调用函数或计算表达式。
clearTimeout() 取消由 setTimeout() 方法设置的 timeout。
scrollTo() 把内容滚动到指定的坐标。
例子:
var result = confirm("您确定要删除吗?"); alert(result); //—————————————————————————————————— //prompt 参数1 : 提示信息. 参数2:输入框的默认值. 返回值是用户输入的内容. var result = prompt("请输入一个数字!","haha"); alert(result); //—————————————————————————————————— //open方法 打开和一个新的窗口 并 进入指定网址.参数1 : 网址. //调用方式1 //open("http://www.baidu.com"); //参数1 什么都不填 就是打开一个新窗口. 参数2.填入新窗口的名字(一般可以不填). 参数3: 新打开窗口的参数. open('','','width=200,resizable=no,height=100'); // 新打开一个宽为200 高为100的窗口 //—————————————————————————————————— //close方法 将当前文档窗口关闭. //close();
其中setInterval() ,clearInterval(),setTimeout(),clearTimeout()涉及到动画,很重要,文章最后的例子中会常用到。
History对象
属性:
History 对象包含用户(在浏览器窗口中)访问过的 URL。
History 对象是 window 对象的一部分,可通过 window.history 属性对其进行访问。
length 返回浏览器历史列表中的 URL 数量。
方法:
back() 加载 history 列表中的前一个 URL。
forward() 加载 history 列表中的下一个 URL。
go() 加载 history 列表中的某个具体页面。
Location对象
方法:
window.location.assign(url) : 加载URL 指定的新的 HTML 文档。就相当于一个链接,跳转到指定的url,当前页面会转为新页面内容,可以点击后退返回上一个页面。
window.location.replace(url) : 通过加载 URL 指定的文档来替换当前文档 ,这个方法是替换当前窗口页面,前后两个页面共用一个窗口,所以是没有后退返回上一页的
location.reload():刷新当前页面
DOM对象
什么是DOM
DOM 是 W3C(万维网联盟)的标准。DOM 定义了访问 HTML 和 XML 文档的标准:
"W3C 文档对象模型(DOM)是中立于平台和语言的接口,它允许程序和脚本动态地访问和更新文档的内容、结构和样式。"
W3C DOM 标准被分为 3 个不同的部分:
- 核心 DOM - 针对任何结构化文档的标准模型
- XML DOM - 针对 XML 文档的标准模型
- HTML DOM - 针对 HTML 文档的标准模型
- 什么是 XML DOM? ---->XML DOM 定义了所有 XML 元素的对象和属性,以及访问它们的方法。
- 什么是 HTML DOM?---->HTML DOM 定义了所有 HTML 元素的对象和属性,以及访问它们的方法。
DOM节点
根据 W3C 的 HTML DOM 标准,HTML 文档中的所有内容都是节点(NODE):
- 整个文档是一个文档节点(document对象)
- 每个 HTML 元素是元素节点(element 对象)
- HTML 元素内的文本是文本节点(text对象)
- 每个 HTML 属性是属性节点(attribute对象)
- 注释是注释节点(comment对象)
节点又包含了节点属性和导航属性
节点(自身)属性:
- attributes - 节点(元素)的属性节点
- nodeType – 节点类型
- nodeValue – 节点值
- nodeName – 节点名称
- innerHTML - 节点(元素)的文本值
导航属性:
- parentNode - 节点(元素)的父节点 (推荐)
- firstChild – 节点下第一个子元素
- lastChild – 节点下最后一个子元素
- childNodes - 节点(元素)的子节点
加粗的是常用的
例子:
JavaScript概述 JavaScript历史 1992年Nombas开发出C-minus-minus(C--)的嵌入式脚本语言(最初绑定在CEnvi软件中).后将其改名ScriptEase.(客户端执行的语言) Netscape(网景)接收Nombas的理念,(Brendan Eich)在其Netscape Navigator 2.0产品中开发出一套livescript的脚本语言.Sun和Netscape共同完成.后改名叫Javascript 微软随后模仿在其IE3.0的产品中搭载了一个JavaScript的克隆版叫Jscript. 为了统一三家,ECMA(欧洲计算机制造协会)定义了ECMA-262规范.国际标准化组织及国际电工委员会(ISO/IEC)也采纳 ECMAScript 作为标准(ISO/IEC-16262)。从此,Web 浏览器就开始努力(虽然有着不同的程度的成功和失败)将 ECMAScript 作为 JavaScript 实现的基础。EcmaScript是规范. JavaScript简介 1、它是一种客户端语言。 2、一个完整的JavaScript实现是由以下三个部分构成的: 核心(ECMAScript),语法规范(包括语法、类型、语句、关键字、运算符等) 文档对象模型(DOM) Document object model (整合js,css,html) 浏览器对象模型(BOM) Broswer object model(整合js和浏览器) 3、javascript在开发中绝大多数情况是基于对象的,也是面对对象的。 JavaScript引入方式 1.嵌入式:一般没有规定放在哪里,但是一般情况下,都放在<html>标签中和<body>标签平级并写在它后面,因为浏览器加载的时候是从上到下的,需要等标签加载完成了才能找到并操作标签。 <script> alert('222222'); </script> 2.引入js的文件,方法和上面基本一样,就是在script标签的属性中,加入src="js文件.js" <script src="./js/out.js"></script> 基本语法 1、每行结束可以不加分号. 没有分号会以换行符作为每行的结束 2、 注释 多行注释:/* */ 单行注释: // 3、使用{}来封装代码块 数据的基本类型 5种基本数据类型:Number 、String、Boolean、Undefined、Null 1种复合类型 object 注: 1、可以用typeof()查看类型 2、基本数据类型:存储在栈中 3、引用数据类型:定义的对象存储在堆中,栈中保存的地址 数字类型(Number) 最基本的数据类型 不区分整型数值和浮点型数值 所有数字都采用64位浮点格式存储,相当于Java和C语言中的double格式 能表示的最大值是±1.7976931348623157 x 10308 能表示的最小值是±5 x 10 -324 整数: 在JavaScript中10进制的整数由数字的序列组成 精确表达的范围是 -9007199254740992 (-253) 到 9007199254740992 (253) 超出范围的整数,精确度将受影响 浮点数: 使用小数点记录数据 例如:3.4,5.6 使用指数记录数据 例如:4.3e23 = 4.3 x 1023 16进制和8进制数的表达: 16进制数据前面加上0x,八进制前面加0 16进制数是由0-9,A-F等16个字符组成 8进制数由0-7等8个数字组成 字符串(String) 是由Unicode字符、数字、标点符号组成的序列 字符串常量首尾由单引号或双引号括起 JavaScript中没有字符类型 常用特殊字符在字符串中的表达 字符串中部分特殊字符必须加上右划线\ 常用的转义字符 \n:换行 \':单引号 \":双引号 \\:右划线 布尔型(Boolean) Boolean类型仅有两个值:true和false,也代表1和0,实际运算中true=1,false=0 布尔值也可以看作on/off、yes/no、1/0对应true/false Boolean值主要用于JavaScript的控制语句,例如 if (x==1){ y=y+1; }else { y=y-1; } Undefined类型 Undefined 类型只有一个值,即 undefined。当声明的变量未初始化时,该变量的默认值是 undefined。 当函数无明确返回值时,返回的也是值 "undefined"; Null类型 另一种只有一个值的类型是 Null,它只有一个专用值 null,即它的字面量。值 undefined 实际上是从值 null 派生来的,因此 ECMAScript 把它们定义为相等的。 尽管这两个值相等,但它们的含义不同。undefined 是声明了变量但未对其初始化时赋予该变量的值,null 则用于表示尚未存在的对象(在讨论 typeof 运算符时,简单地介绍过这一点)。如果函数或方法要返回的是对象,那么找不到该对象时,返回的通常是 null。 复合类型 var oObj = { name:"隔壁老王", age:88, } var type = typeof(oObj); alert(type); //Ojbect alert(oObj.name); //隔壁老王 数据类型转换 基本数据类型转换 JavaScript属于松散类型的程序语言 变量在声明的时候并不需要指定数据类型 变量只有在赋值的时候才会确定数据类型 表达式中包含不同类型数据则在计算过程中会强制进行类别转换 数字 + 字符串:数字转换为字符串 数字 + 布尔值:true转换为1,false转换为0 字符串 + 布尔值:布尔值转换为字符串true或false 强制数据类型转换 函数parseInt: 强制转换成整数,不四舍五入。 例如parseInt("6.12")=6 ; parseInt(“12a")=12 ; parseInt(“a12")=NaN ;parseInt(“1a2")=1 NaN是not a number,属于number的一种 函数parseFloat: 强制转换成浮点数 parseFloat("6.12")=6.12 函数eval: 将字符串强制转换为表达式并返回结果 eval("1+1")=2 ; eval("1<2")=true 类型查询函数(typeof) 当你不知道数据转换到是什么类型的时候可以使用这个函数 ECMAScript 提供了 typeof 运算符来判断一个值是否在某种类型的范围内。可以用这种运算符判断一个值是否表示一种原始类型:如果它是原始类型,还可以判断它表示哪种原始类型。 函数typeof :查询数值当前类型 (string / number / boolean / object ) 例如typeof("test"+3) "string" 例如typeof(null) "object " 注意null属于object 例如typeof(undefined) "undefined" 例如typeof(true+1) "number" 例如typeof(true-false) "number" 变量 变量的定义 在js中,定义一个变量很简单,只需要var一个变量名就可以了,它会根据你的赋的值自动判断,比如: var iNumber = 100; var sString = "hello"; var bBoolean = true; 一行可以声明多个变量并且可以是不同类型 var iOne = 10,iTwo = 20, iThre = 30; 变量命名规范 1.区分大小写 2.第一个字符必须是字母/下划线(_)/美元符号($) 3.其他字符可以是字母,下划线,美元符号,数字 4.最好做到见名知意 匈牙利命名法 标记法命名的变量前附加一个小写字母(或小写字母序列),说明该变量的类型。例如,i 表示整数,s 表示字符串,如下所示“ 对象o Object 比如:oDiv 数组a Array 比如:aItems 字符串s String 比如:sUserName 整数i Integer 比如:iItemCount 布尔值b Boolean 比如:bIsComplete 浮点数f Float 比如:fPrice 函数fn Function 比如:fnHandler 正则表达式re RegExp 比如:reEmailCheck 常量和标识符 常量 :直接在程序中出现的数据值 标识符: 由不以数字开头的字母、数字、下划线(_)、美元符号($)组成 常用于表示函数、变量等的名称 例如:_abc,$abc,abc,abc123是标识符,而1abc不是 JavaScript语言中代表特定含义的词称为保留字,不允许程序再定义为标识符 运算符 算数运算符 基本运算符 加(+)、 减(-)、 乘(*) 、除(/) 、余数(% ) 加、减、乘、除、余数和数学中的运算方法一样 例如:9/2=4.5,4*5=20,9%2=1 -除了可以表示减号还可以表示负号 例如:x=-y +除了可以表示加法运算还可以用于字符串的连接 例如:"abc"+"def"="abcdef" 递增(++) 、递减(--) 假如x=2,那么x++表达式执行后的值为3,x--表达式执行后的值为1 i++相当于i=i+1,i--相当于i=i-1 递增和递减运算符可以放在变量前也可以放在变量后:--i var i=1; console.log(i++); 这个是先显示再加一 console.log(++i); 这个是先加一再显示 console.log(i--); 这个是先显示再减一 console.log(--i); 这个是先减一再显示 一元加减法 var c="10"; console.log(typeof (c)); //string c=+c; //类型转换 console.log(typeof (c)); //number //--------------------------------------- var a=1; var b=1; a=-a; console.log(a) //--------------------------------------- var iNumber = NaN; console.log(iNumber>3); //false console.log(iNumber>3); //false console.log(iNumber==3); //false console.log(iNumber==NaN); //false console.log(iNumber!=1); //true 逻辑运算符 与 (&&) 、或(||) 、非(!) 1 && 1 = 1 1 && 0 = 0 0 && 0 = 0 1 || 1 = 1 1 || 0 = 1 0 || 0 = 0 !0=1 !1=0 注意: 1、如果某个运算数不是原始的 Boolean 型值,与和或并不一定返回 Boolean 值: 如果某个运算数是 null,返回 null。 如果某个运算数是 NaN,返回 NaN。 如果某个运算数是 undefined,返回undefined。 2、单个的&和|是位运算 3、AND下 如果一个运算数是对象,另一个是boolean值,返回该对象 如果两个运算数都是对象,返回第二个对象 4、OR下 如果一个运算数是对象,并且该对象左边的运算数值均为false,则返回该对象 如果两个运算数都是对象,返回第一个对象 赋值运算符 JavaScript中=代表赋值,两个等号==表示判断是否相等 例如,x=1表示给x赋值为1 if (x==1){...}程序表示当x与1相等时 if(x==“on”){…}程序表示当x与“on”相等时 配合其他运算符形成的简化表达式 例如i+=1相当于i=i+1,i*=1相当于i=i*1, 关系运算符 等于 ( == ) 、不等于( != ) 、 大于( > ) 、 小于( < ) 大于等于(>=) 、小于等于(<=) 特殊的例子: 1、 var bResult = "Blue" < "alpha"; alert(bResult); //输出 true,字符串 "Blue" 小于 "alpha",因为字母 B 的字符代码是 66,字母 a 的字符代码是 97。 2、 var bResult = "25" < "3"; alert(bResult); //输出 "true",字符串 "25" 和 "3"。两个运算数都是字符串,所以比较的是它们的字符代码("2" 的字符代码是 50,"3" 的字符代码是 51)。 3、 var bResult = "25" < 3; alert(bResult); //输出 "false",字符串 "25" 将被转换成数字 25,然后与数字 3 进行比较 总结: 比较运算符两侧如果一个是数字类型,一个是其他类型,会将其类型转换成数字类型. 比较运算符两侧如果都是字符串类型,比较的是最高位的asc码,如果最高位相等,继续取第二位比较. 控制语句 if语句 if-else基本格式 if (表达式){ 语句1; ...... }else{ 语句2; ..... } 功能说明: 如果表达式的值为true则执行语句1,否则执行语句2 if语句嵌套格式 if (表达式1) { 语句1; }else if (表达式2){ 语句2; }else if (表达式3){ 语句3; } else{ 语句4; } 运行流程如图所示: switch语句 switch基本格式 switch (表达式) { case 值1:语句1;break; //当满足case,执行语句1,然后break退出switch,执行switch的下一条语句 case 值2:语句2;break; case 值3:语句3;break; default:语句4; //所以条件都不满足会执行语句四 } 例子: var x=3 switch(x){ case 1:y="星期一"; break; case 2:y="星期二"; break; case 3:y="星期三"; break; case 4:y="星期四"; break; case 5:y="星期五"; break; case 6:y="星期六"; break; case 7:y="星期日"; break; default: y="未定义"; } console.log(y); //结果为星期三 switch(x){ case 1:y="星期一"; break; case 2:y="星期二"; break; case 3:y="星期三"; case 4:y="星期四"; case 5:y="星期五"; break; case 6:y="星期六"; break; case 7:y="星期日"; break; default: y="未定义"; } console.log(y); //结果是星期五,在switch中,跳出switch一共有两种方式,一个是break跳出来,一个是switch顺序执行完。这个例子结果是星期五的原因是,它满足等于3的条件,然后赋值为星期三,但是这个条件后面没有break来跳出switch,所以它会继续顺次执行,而且不管满不满足条件,直接执行语句,当遇到等于五并且给y赋值为了星期五之后,就跳出了循环。 补充: View Code for语句 for循环基本格式 for (初始化;条件;增量){ 语句1; ... } 功能说明 实现条件循环,当条件成立时,执行语句1,否则跳出循环体 详细解释:当执行的for的一开始,先执行初始化的操作。然后判断条件是否满足,满足则继续执行循环体内语句,不满足则直接退出执行for循环体之后的语句。满足时,执行完循环体内语句后,执行增量的语句。增量语句执行完毕之后,再进行判断,如果满足则继续执行,执行方式和第一次时一致。 var iSum=0; for(var iNum=1;iNum<=10;iNum++){ iSum+=iNum; } console.log(iSum); while语句 while基本格式 while (条件){ 语句1; ... } 功能说明 运行功能和for类似,当条件成立循环执行语句花括号{}内的语句,否则跳出循环 例子: var i=1; while (i<=7) { document.write("<H"+i+">hello</H "+i+"> "); document.write("<br>"); i++; } //循环输出H1到H7的字体大小 异常处理语句 try { //这段代码从上往下运行,其中任何一个语句抛出异常该代码块就结束运行 } catch (e) { // 如果try代码块中抛出了异常,catch代码块中的代码就会被执行。 //e是一个局部变量,用来指向Error对象或者其他抛出的对象 } finally { //无论try中代码是否有异常抛出(甚至是try代码块中有return语句),finally代码块中始终会被执行。 } 注:主动抛出异常 throw Error('xxxx') ECMA对象 从传统意义上来说,ECMAScript 并不真正具有类。事实上,除了说明不存在类,在 ECMA-262 中根本没有出现“类”这个词。ECMAScript 定义了“对象定义”,逻辑上等价于其他程序设计语言中的类。 var o = new Object(); 这种语法与 Java 语言的相似,不过当有不止一个参数时,ECMAScript 要求使用括号。如果没有参数,如以下代码所示,括号可以省略: var o = new Object; 注意:尽管括号不是必需的,但是为了避免混乱,最好使用括号。 在 ECMAScript 中,所有对象并非同等创建的。 一般来说,可以创建并使用的对象有三种:本地对象、内置对象和宿主对象。 宿主环境:一般宿主环境由外壳程序创建与维护,只要能提供js引擎执行的环境都可称之为外壳程序。如:web浏览器,一些桌面应用系统等。即由web浏览器或是这些桌面应用系统早就的环境即宿主环境。 1、本地对象 ECMA-262 把本地对象(native object)定义为“独立于宿主环境的 ECMAScript 实现提供的对象”。 再来看一下,“本地对象”包含哪些内容: Object、Function、Array、String、Boolean、Number、Date、RegExp、Error、EvalError、RangeError、ReferenceError、SyntaxError、TypeError、URIError 由此可以看出,简单来说,本地对象就是 ECMA-262 定义的类(引用类型)。 2、内置对象 ECMA-262 把内置对象(built-in object)定义为“由 ECMAScript 实现提供的、独立于宿主环境的所有对象,在 ECMAScript 程序开始执行时出现”。这意味着开发者不必明确实例化内置对象,它已被实例化了。 同样是“独立于宿主环境”。根据定义我们似乎很难分清“内置对象”与“本地对象”的区别。而ECMA-262 只定义了两个内置对象,即 Global 和 Math (它们也是本地对象,根据定义,每个内置对象都是本地对象)。 如此就可以理解了。内置对象是本地对象的一种。而其包含的两种对象中,Math对象我们经常用到,可这个Global对象是啥东西呢? Global对象是ECMAScript中最特别的对象,因为实际上它根本不存在,但大家要清楚,在ECMAScript中,不存在独立的函数,所有函数都必须是某个对象的方法。类似于isNaN()、parseInt()和parseFloat()方法等,看起来都是函数,而实际上,它们都是Global对象的方法。而且Global对象的方法还不止这些。有关Global对象的具体方法和属性,感兴趣的同学可以看一下这里:JavaScript 全局对象参考手册 3.宿主对象 由ECMAScript实现的宿主环境提供的对象,可以理解为:浏览器提供的对象。所有的BOM和DOM都是宿主对象。 4.自定义对象 这个可能让人有些发懵,简单总结一下: 总结 object对象:ECMAScript 中的所有对象都由这个对象继承而来;Object 对象中的所有属性和方法都会出现在其他对象中,说两种常用的 ToString() : 返回对象的原始字符串表示。 ValueOf() : 返回最适合该对象的原始值。对于许多对象,该方法返回的值都与 ToString() 的返回值相同。 常用对象 String对象 创建方式: var str1="hello world"; 属性: var str1="String对象"; var str2=""; alert("str1长度 "+str1.length); //8 alert("str2长度 "+str2.length); //0 方法: 格式编排 View Code 大小写转换 View Code 获取指定字符串 View Code 查询字符串 View Code 截取字符串 View Code 替换字符串 View Code 分割字符串 View Code 连接字符串 View Code Array对象 创建一维数组方式: View Code 创建二维数组方式: View Code 注意:数组内可以放不同类型的内容 arr1=[1,”hello”,[11,2],{“name”:”liming”}]; 属性: arr1=[1,"hello",[11,2],{"name":"liming"}]; alert(arr1.length); //4 方法: 数组连接(join) View Code 数组连接(concat) View Code 数组排序 View Code 数组切片 View Code 删除数组元素 View Code 数组栈操作1 View Code 数组栈操作2 View Code 总结: // js中数组的特性 //java中数组的特性, 规定是什么类型的数组,就只能装什么类型.只有一种类型. //js中的数组特性1: js中的数组可以装任意类型,没有任何限制. //js中的数组特性2: js中的数组,长度是随着下标变化的.用到多长就有多长. var arr5 = ['abc',123,1.14,true,null,undefined,new String('1213'),new Function('a','b','alert(a+b)')]; /* alert(arr5.length);//8 arr5[10] = "hahaha"; alert(arr5.length); //11 alert(arr5[9]);// undefined */ Data对象 创建Data方式: View Code 方法: 获取日期和时间 View Code 设置日期和时间 View Code 日期和时间的转换 View Code 例题: View Code RegExp对象 View Code Math对象 View Code Function对象(重要) 创建function的方式: View Code 功能说明: 可以使用变量、常量或表达式作为函数调用的参数 函数由关键字function定义 函数名的定义规则与标识符一致,大小写是敏感的 返回值必须使用return 实例: View Code 注意:js的函数加载执行与python不同,它是整体加载完才会执行,所以执行函数放在函数声明上面或下面都可以: 属性: length属性 alert(func1.length) //返回这个函数期望的函数参数 方法: Function 对象也有与所有对象共享的 valueOf() 方法和 toString() 方法。这两个方法返回的都是函数的源代码,在调试时尤其有用。 例如: View Code 函数的调用: View Code 函数的内置函数arguments: View Code 匿名函数: var func = function(arg){ return "tony"; } 注意:它和普通函数是有区别的,是按逐行执行的规则的,如果调用写在前面会报错 自执行函数: (function(){ alert("tony"); })() (function(arg){ console.log(arg); })('123') //前面的函数是一个正常的函数,只不过没有名字,所以用括号包裹起来,这个时候它需要一个参数,后面给他传一个参数。 作用域: js的作用域和py相似,if while等控制语句并没有自己作用域;而函数是有自己的作用域的; 例子1: View Code 例子2: View Code 闭包: View Code BOM对象 BOM(浏览器对象模型),可以对浏览器窗口进行访问和操作。使用 BOM,开发者可以移动窗口、改变状态栏中的文本以及执行其他与页面内容不直接相关的动作。 使 JavaScript 有能力与浏览器“对话”。 window对象 方法: View Code 例子: View Code History对象 属性: History 对象包含用户(在浏览器窗口中)访问过的 URL。 History 对象是 window 对象的一部分,可通过 window.history 属性对其进行访问。 length 返回浏览器历史列表中的 URL 数量。 方法: back() 加载 history 列表中的前一个 URL。 forward() 加载 history 列表中的下一个 URL。 go() 加载 history 列表中的某个具体页面。 Location对象 方法: window.location.assign(url) : 加载URL 指定的新的 HTML 文档。就相当于一个链接,跳转到指定的url,当前页面会转为新页面内容,可以点击后退返回上一个页面。 window.location.replace(url) : 通过加载 URL 指定的文档来替换当前文档 ,这个方法是替换当前窗口页面,前后两个页面共用一个窗口,所以是没有后退返回上一页的 location.reload():刷新当前页面 DOM对象 什么是DOM DOM 是 W3C(万维网联盟)的标准。DOM 定义了访问 HTML 和 XML 文档的标准: "W3C 文档对象模型(DOM)是中立于平台和语言的接口,它允许程序和脚本动态地访问和更新文档的内容、结构和样式。" W3C DOM 标准被分为 3 个不同的部分: 核心 DOM - 针对任何结构化文档的标准模型 XML DOM - 针对 XML 文档的标准模型 HTML DOM - 针对 HTML 文档的标准模型 什么是 XML DOM? ---->XML DOM 定义了所有 XML 元素的对象和属性,以及访问它们的方法。 什么是 HTML DOM?---->HTML DOM 定义了所有 HTML 元素的对象和属性,以及访问它们的方法。 DOM节点 根据 W3C 的 HTML DOM 标准,HTML 文档中的所有内容都是节点(NODE): 整个文档是一个文档节点(document对象) 每个 HTML 元素是元素节点(element 对象) HTML 元素内的文本是文本节点(text对象) 每个 HTML 属性是属性节点(attribute对象) 注释是注释节点(comment对象) 节点又包含了节点属性和导航属性 节点(自身)属性: attributes - 节点(元素)的属性节点 nodeType – 节点类型 nodeValue – 节点值 nodeName – 节点名称 innerHTML - 节点(元素)的文本值 导航属性: parentNode - 节点(元素)的父节点 (推荐) firstChild – 节点下第一个子元素 lastChild – 节点下最后一个子元素 childNodes - 节点(元素)的子节点 加粗的是常用的 例子: <div id="div1"> <div id="div2"></div> <p>hello yuan</p> </div> <script> var div=document.getElementById("div2"); console.log(div.nextSibling.nodeName); //思考:为什么不是P? </script> //其实在div后面还有一个文本节点#text,就是换行和p标签前面的那些空白的地方。而我们需要的往往是标签,所以要找Element对象
常用的导航属性:
parentElement // 父节点标签元素 children // 所有子标签 firstElementChild // 第一个子标签元素 lastElementChild // 最后一个子标签元素 nextElementtSibling // 下一个兄弟标签元素 previousElementSibling // 上一个兄弟标签元素
要注意节点间的层级关系。
父(parent)、子(child)、同胞(sibling)
父节点拥有子节点。同级的子节点被称为同胞(兄弟或姐妹)。
- 在节点树中,顶端节点被称为根(root)
- 每个节点都有父节点、除了根(它没有父节点)
- 一个节点可拥有任意数量的子
- 同胞是拥有相同父节点的节点
基于页面(document)的HTML元素查找:
- 通过使用 getElementById() 方法 //通过id属性
- 通过使用 getElementsByTagName() 方法 //通过标签名
- 通过使用 getElementsByClassName() 方法 //通过类名
- 通过使用 getElementsByName() 方法 //通过name属性
比如:document.getElementById("id1"):的意思是找到这个document文档中的id是id1的标签
局部查找:
<div id="div1">
<div class="div2">i am div2</div>
<div name="yuan">i am div2</div>
<div id="div3">i am div2</div>
<p>hello p</p>
</div>
<script>
var div1=document.getElementById("div1");
////支持;
// var ele= div1.getElementsByTagName("p");
// alert(ele.length);
////支持
// var ele2=div1.getElementsByClassName("div2");
// alert(ele2.length);
////不支持
// var ele3=div1.getElementById("div3");
// alert(ele3.length);
////不支持
// var ele4=div1.getElementsByName("yuan");
// alert(ele4.length)
</script>
DOM Event(事件)
HTML 4.0 的新特性之一是有能力使 HTML 事件触发浏览器中的动作(action),比如当用户点击某个 HTML 元素时启动一段 JavaScript。下面是一个属性列表,这些属性可插入 HTML 标签来定义事件动作。
事件:
onclick 当用户点击某个对象时调用的事件句柄。 ondblclick 当用户双击某个对象时调用的事件句柄。 onfocus 元素获得焦点。 //练习:输入框 onblur 元素失去焦点。 应用场景:用于表单验证,用户离开某个输入框时,代表已经输入完了,我们可以对它进行验证. onchange 域的内容被改变。 应用场景:通常用于表单元素,当元素内容被改变时触发.(三级联动) onkeydown 某个键盘按键被按下。 应用场景: 当用户在最后一个输入框按下回车按键时,表单提交. onkeypress 某个键盘按键被按下并松开。 onkeyup 某个键盘按键被松开。 onload 一张页面或一幅图像完成加载。 onmousedown 鼠标按钮被按下。 onmousemove 鼠标被移动。 onmouseout 鼠标从某元素移开。 onmouseover 鼠标移到某元素之上。 onmouseleave 鼠标从元素离开 onselect 文本被选中。 onsubmit 确认按钮被点击。
添加事件的方式:
<div onclick="alert(123)">点我呀</div>
<p id="abc">试一试!</p>
<script>
var ele=document.getElementById("abc");
ele.onclick=function(){
alert("hi");
};
</script>
例子:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div class="v1">
<div class="v2">dddd</div>
<div class="v2">dddd</div>
<div class="v2">dddd</div>
<div class="v2">dddd</div>
<div class="v2">dddd</div>
<p id="p1" onclick="func(this)">pppppp</p>
</div>
<script>
var ele2=document.getElementsByClassName("v2");
for(var i=0;i<ele2.length;i++){
ele2[i].onclick=function () {
alert(555)
}
}
</script>
</body>
</html>
this:
<div id="abc" onclick="func1(this)">事件绑定方式1</div>
<div id="id123">事件绑定方式2</div>
<script>
function func1(self){
console.log(self.id)
}
//jquery下是$(self), 这种方式this参数必须填写;
//------------------------------------------
var ele=document.getElementById("id123").onclick=function(){
console.log(this.id);
//jquery下是$(this), 这种方式不需要this参数;
}
</script>
onload:
onload 属性开发中 只给 body元素加.
这个属性的触发 标志着 页面内容被加载完成.
应用场景: 当有些事情我们希望页面加载完立刻执行,那么可以使用该事件属性。有时候script写在前面就会出现找不到标签,这时候就会用到onload方法。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script>
// window.onload=function(){
// var ele=document.getElementById("ppp");
// ele.onclick=function(){
// alert(123)
// };
// };
function fun1() {
var ele=document.getElementById("ppp");
ele.onclick=function(){
alert(123)
};
}
//注释内容和没注释的内容分别试一下
</script>
</head>
<body onload="fun1()">
<p id="ppp">hello p</p>
</body>
</html>
onsubmit:
是当表单在提交时触发. 该属性也只能给form元素使用.应用场景: 在表单提交前验证用户输入是否正确.如果验证失败.在该方法中我们应该阻止表单的提交.
例子:
<form id="form">
<input type="text"/>
<input type="submit" value="点我!" />
</form>
<script type="text/javascript">
//阻止表单提交方式1().
//onsubmit 命名的事件函数,可以接受返回值. 其中返回false表示拦截表单提交.其他为放行.
var ele=document.getElementById("form");
ele.onsubmit=function(event) {
// alert("验证失败 表单不会提交!");
// return false;
// 阻止表单提交方式2 event.preventDefault(); ==>通知浏览器不要执行与事件关联的默认动作。
alert("验证失败 表单不会提交!");
event.preventDefault();
}
Event对象:
Event 对象代表事件的状态,比如事件在其中发生的元素、键盘按键的状态、鼠标的位置、鼠标按钮的状态。
事件通常与函数结合使用,函数不会在事件发生前被执行!event对象在事件发生时系统已经创建好了,并且会在事件函数被调用时传给事件函数.我们获得仅仅需要接收一下即可.
事件传播:
事件传播过程中,如果父元素有同类型事件监听,被同时激活
<div id="abc_1" style="border:1px solid red;width:300px;height:300px;">
<div id="abc_2" style="border:1px solid red;width:200px;height:200px;">
</div>
</div>
<script type="text/javascript">
document.getElementById("abc_1").onclick=function(){
alert('111');
}
document.getElementById("abc_2").onclick=function(event){
alert('222');
event.stopPropagation(); //阻止事件向外层div传播.
}
</script>
例子中如果不阻止事件传播,会触发父标签的单击事件
节点的增删改查
增:
createElement(name)创建元素
appendChild();将元素添加
删:
获得要删除的元素
获得它的父元素
使用removeChild()方法删除
改:
第一种方式:
使用上面增和删结合完成修改
第二中方式:
使用setAttribute();方法修改属性
使用innerHTML属性修改元素的内容
查: 使用之前介绍的方法.
详细内容:
<script type="text/javascript"> //在第一个div中动态增加一个a标签. 该a标签点击之后跳转到百度首页. function addNode(){ //1.获得 第一个div var div = document.getElementById("div_1"); //2.创建a标签 createElement==>创建一个a标签 <a></a> var eleA = document.createElement("a"); //3.为a标签添加属性 <a href="http://www.baidu.com"></a> eleA.setAttribute("href", "http://www.baidu.com"); //4.为a标签添加内容 <a href="http://www.baidu.com">百度</a> eleA.innerHTML = "百度"; //5.将a标签添加到div中 div.appendChild(eleA); } //点击后 删除div区域2 function deleteNode(){ //1 获得要删除的div区域 var div = document.getElementById("div_2"); //2.获得父亲 var parent = div.parentNode; //3 由父亲操刀 parent.removeChild(div); } //点击后 替换div区域3 为一个美女 function updateNode(){ //1 获得要替换的div区域3 var div = document.getElementById("div_3"); //2创建img标签对象 <img /> var img = document.createElement("img"); //3添加属性 <img src="001.jpg" /> img.setAttribute("src", "001.JPG"); //4.获得父节点 var parent = div.parentNode; //5.替换 parent.replaceChild(img, div); } //点击后 将div区域4 克隆一份 添加到页面底部 function copyNode(){ //1.获取要克隆的div var div = document.getElementById("div_4"); //2.克隆 参数为true 那么克隆时克隆所有子元素. false 只克隆自己 var div_copy = div.cloneNode(true); //3.获得父亲 var parent = div.parentNode; //4.添加 parent.appendChild(div_copy); } </script>
修改HTML元素
修改标签内容
innerHTML和innerText
View Code上面的例子可以不断的测试一下,innerHTML可以取出这个标签内的内容和标签,innerText只能取出内容,
而且修改的时候innerHTML可以加标签,这样内容也会被渲染出来,innerText内容加标签的话之后被当成文本内容加入进去,不会被渲染。
改变css样式
<p id="p2">Hello world!</p>
document.getElementById("p2").style.color="blue";
document.getElementById("p2").style.fontSize=40px;
//在css中改变字体是font-size,而在js中没有"-"而是从第二个单词开始首字母大写
改变 HTML 属性
var img=document.createElement("img");
img.src="meinv.jpg";
严谨的DOM写法:
var img=document.createElement("img");
img.setAttribute("src","meinv.jpg");
创建新的 HTML 元素
createElement(name)
删除已有的 HTML 元素
elementNode.removeChild(node)
关于class的操作
elementNode.className
elementNode.classList.add
elementNode.classList.remove
例子:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div class="div1 div2">div1</div>
<script>
var ele=document.getElementsByTagName("div")[0];
console.log(ele.className); //div1 div2
console.log(ele.classList[0]); //div1
console.log(ele.classList[1]); //div2
ele.classList.add("hide") //这个很重要,可以给HTML元素添加功能,后面例子中有对应内容
console.log(ele.className); //div1 di2 hide
</script>
</body>
</html>
例子
模态对话框
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
.back{
background-color: rebeccapurple;
height: 2000px;
}
.shade{ /*遮罩层*/
position: fixed;
top: 0; /*四个位置设置就相当于让这个遮罩层覆盖整个屏幕*/
bottom: 0;
left:0;
right: 0;
background-color: coral;
opacity: 0.4; /*透明度*/
}
.hide{
display: none; /*设置为不可见*/
}
.models{
position: fixed;
top: 50%; /*两个设置将左上角的点放在了中间*/
left: 50%;
margin-left: -100px; /*将盒子调整到中间*/
margin-top: -100px;
height: 200px;
width: 200px;
background-color: gold;
}
</style>
</head>
<body>
<div class="back">
<input id="ID1" type="button" value="click" onclick="action('show')">
</div>
<div class="shade hide"></div>
<div class="models hide">
<input id="ID2" type="button" value="cancel" onclick="action('hide')">
</div>
<script>
function action(act){
var ele=document.getElementsByClassName("shade")[0];
var ele2=document.getElementsByClassName("models")[0];
if(act=="show"){
ele.classList.remove("hide");
ele2.classList.remove("hide");
}else {
ele.classList.add("hide");
ele2.classList.add("hide");
}
}
</script>
</body>
</html>
全选反选取消
<button onclick="select('all');">全选</button>
<button onclick="select('cancel');">取消</button>
<button onclick="select('reverse');">反选</button>
<table border="1" id="Table">
<tr>
<td><input type="checkbox"></td>
<td>111</td>
</tr>
<tr>
<td><input type="checkbox"></td>
<td>222</td>
</tr>
<tr>
<td><input type="checkbox"></td>
<td>333</td>
</tr>
<tr>
<td><input type="checkbox"></td>
<td>444</td>
</tr>
</table>
<script>
function select(choice){
var ele=document.getElementById("Table");
var inputs=ele.getElementsByTagName("input");
for (var i=0;i<inputs.length;i=i+1){
var ele2=inputs[i];
if (choice=="all"){
ele2.checked=true;
}else if(choice=="cancel"){
ele2.checked=false;
}
else {
if (ele2.checked){
ele2.checked=false;
}else {
ele2.checked=true;
}
}
}
}
</script>
二级联动
<select id="province">
<option>请选择省:</option>
</select>
<select id="city">
<option>请选择市:</option>
</select>
<script>
data={"河北省":["廊坊","邯郸"],"北京":["朝阳区","海淀区"]};
var p=document.getElementById("province");
var c=document.getElementById("city");
for(var i in data){
var option_pro=document.createElement("option");
option_pro.innerHTML=i;
p.appendChild(option_pro);
}
p.onchange=function(){
pro=(this.options[this.selectedIndex]).innerHTML;
citys=data[pro];
c.options.length=0;
for (var i in citys){
var option_city=document.createElement("option");
option_city.innerHTML=citys[i];
c.appendChild(option_city);
}
}
</script>
网页换肤
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>网页换肤</title>
<style>
#red{
background: red;
}
#green{
background: green;
}
.blue{
color: gold;
}
.purple{
color: palevioletred;
}
</style>
<script>
window.onload = function () {
// 监听 两个按钮的 点击事件 修改body的backgroundColor
// 1.获取标签
var oRedBtn = document.getElementById('red');
var oGreenBtn = document.getElementById('green');
var oBody = document.getElementById('bodys');
// 2.监听点击
oRedBtn.onclick = function () {
// 3.修改body的backgroundColor
// 错误
// body.style.backgroundColor = "red";
oBody.style.backgroundColor = "red";
}
oGreenBtn.onclick = function () {
// 3.修改body的backgroundColor
// 错误
// body.style.backgroundColor = "red";
oBody.style.backgroundColor = "green";
}
// 类名字的属性设置
oRedBtn.className = "purple";
}
</script>
</head>
<body id="bodys">
<input type="button" value="红色的背景" id="red">
<input type="button" value="绿色的背景" id="green">
</body>
</html>
定时器小动画
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>10-定时器的小动画</title>
<style>
body{
margin:0;
}
.box{
width: 200px;
height: 300px;
background: red;
margin-top: 200px;
margin-left: 0;
}
</style>
<script>
window.onload = function () {
//1.获取标签
var oDiv = document.getElementById('div1');
// 2.修改 margin-left
// 速度
var iSpeed = 0;
// 方向
var iDirection = 5;
function fnAnimation() {
// 累加
iSpeed += iDirection;
// 判断范围 300px;
// if(oDiv.style.marginLeft >300){
// 注意返回的 left 带单位的 305px > 300
// }
if( iSpeed > 300){
// 往左跑
iDirection = -5;
}
if (iSpeed < 0) {
// 往右边
iDirection = 5;
}
// 修改 margin-left 千万注意:单位
oDiv.style.marginLeft = iSpeed + 'px';
console.log('定时器在活动')
}
// 3.开启 反复执行的 定时器
setInterval(fnAnimation,30);
var sStr = "310px";
var sResult = parseInt(sStr);
console.log(sResult)
}
</script>
</head>
<body>
<div class="box" id="div1">
</div>
</body>
</html>
轮播图
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>图片轮播器的功能实现</title>
<style>
/*初始化*/
ul,li{
margin: 0;
padding: 0;
}
/*1.设置图片的外边框*/
.picbox{
width: 1000px;
height: 200px;
border: 1px solid black;
margin: 10px auto 0;
background-color: lightgray;
overflow: hidden;
position:relative;
}
/*2.设置列表的属性*/
.list{
list-style: none;
width: 2000px;/*暂时写1000px,修改为2000是为了轮播做准备*/
height: 200px;
position: absolute;
left: 0;
top:0;
}
/*3.设置li标签的属性*/
.list li{
width: 180px;
height: 180px;
margin: 10px;
float: left;
}
/*4.设置按钮边框的属性*/
.btn{
width: 1000px;
height: 50px;
background: pink;
margin: 50px auto 0;
position: relative;
}
/*5.设置左右两个按钮的大小位置等*/
.left,.right{
width: 30px;
height: 30px;
background-color: gold;
line-height: 30px;
text-align: center;
font-family: "Arial";
font-size: 30px;
/*裁剪圆角*/
border-radius: 15px;
/* //鼠标的样式 */
cursor: pointer;
/* //透明度 */
opacity: 0.5;
/*定位*/
position: absolute;
left:-40px;
top:124px;
}
/*6.单独设置右边按钮的位置*/
.right{
left:1010px;
top:124px;
}
</style>
<script>
window.onload = function (){
// 1.获取标签
var oList = document.getElementById('list'),
// 左右按钮
oLeftBtn = document.getElementById('left'),
oRightBtn = document.getElementById('right'),
// 轮播图的框
oBox = document.getElementById('pic');
// 将滚动的图片 复制成两份
// oList.innerHTML * 2 "字符安" * 2
// oList.innerHTML = oList.innerHTML + oList.innerHTML;
oList.innerHTML += oList.innerHTML;
// 2.修改left
// 累加量的白能量
var iSpeed = 0;
// 方向
var iDirection = -5;
function fnAnimation() {
iSpeed += iDirection;
// 判断 首尾相接的条件,成立 改的位置
if ( iSpeed < -1000) {
iSpeed = 0;
}
// 右边 ,大于0 ;
if (iSpeed > 0) {
iSpeed = -1000;
}
// 修改left
oList.style.left = iSpeed + 'px';
console.log("定时器一直在执行....")
}
// 3.反复执行的定时器
var timer = setInterval(fnAnimation,30);
// 4.监听左右按钮的点击事件 改变的方向
oLeftBtn.onclick = function () {
// 左边
iDirection = -2;
}
oRightBtn.onclick = function () {
// 右边
iDirection = 2;
}
// 5.监听鼠标的事件 onmouse
oBox.onmouseover = function () {
// 关闭定时器
clearInterval(timer);
}
oBox.onmouseout = function () {
// 开启定时器
timer = setInterval(fnAnimation,30);
}
// 记录动画停止 之前 的 速度和方向
// var upIdirection = 0;
// oBox.onmouseover = function () {
// // 记录
// upIdirection = iDirection;
// // 鼠标放上去动画 停止
// iDirection = 0;
// }
// oBox.onmouseout = function () {
// // 鼠标移开 动画 开启
// iDirection = upIdirection;
// }
}
</script>
</head>
<body>
<div class="btn">
<div class="left" id="left"><</div>
<div class="right" id="right">></div>
</div>
<div class="picbox" id="pic">
<ul class="list" id="list">
<li><a href=""></a><img src="images/goods001.jpg" alt="商品图片"></li>
<li><a href=""></a><img src="images/goods002.jpg" alt="商品图片"></li>
<li><a href=""></a><img src="images/goods003.jpg" alt="商品图片"></li>
<li><a href=""></a><img src="images/goods004.jpg" alt="商品图片"></li>
<li><a href=""></a><img src="images/goods005.jpg" alt="商品图片"></li>
</ul>
</div>
</body>
</html>
轮播图的素材是180px*180px的图片
1 首先要看一个问题,if 语句适用范围比较广,只要是 boolean 表达式都可以用 if 判断;而 switch 只能对基本类型进行数值比较。两者的可比性就仅限在两个基本类型比较的范围内。 2 说到基本类型的数值比较,那当然要有两个数。然后重点来了—— 3 if 语句每一句都是独立的,看下面的语句: 4 if (a == 1) ... 5 else if (a == 2) ... 6 这样 a 要被读入寄存器两次,1 和 2 分别被读入寄存器一次。于是你是否发现其实 a 读两次是有点多余的,在你全部比较完之前只需要一次读入寄存器就行了,其余都是额外开销。但是 if 语句必须每次都把里面的两个数从内存拿出来读到寄存器,它不知道你其实比较的是同一个 a。 7 于是 switch case 就出来了,把上面的改成 switch case 版本: 8 switch (a) { 9 case 0: 10 break; 11 case 1: 12 } 13 14 总结: 15 16 1.switch用来根据一个整型值进行多路分支,并且编译器可以对多路分支进行优化 17 2.switch-case只将表达式计算一次,然后将表达式的值与每个case的值比较,进而选 18 择执行哪一个case的语句块 19 3.if..else 的判断条件范围较广,每条语句基本上独立的,每次判断时都要条件加载 20 一次。 21 所以在多路分支时用switch比if..else if .. else


浙公网安备 33010602011771号