目录
一、JS语法
1、了解JS
什么是JS、JS的组成、html中使用JS、JS的注释与分号。
1.1 什么是 JS
JS 是一种解释性脚本语言。是一种基于对象和事件驱动的客户端脚本语言,最初的设计是为了检验 HTML 表单输入的正确性。主要用来向 HTML 页面添加交互行为。
1.2 JS 的组成
完整的 JS 是由 ECMAScript(核心)、DOM(文档对象模型)、BOM(浏览器对象模型)。
1.3 在 html 中使用 JS
可以在 head 或 body 中使用 <script> 标签嵌入 JS 脚本。defer 延迟脚本,async 异步脚本。
1.4 JS 注释与分号
// 单行注释 /**/多行注释。
语句结束使用分号,如果省略,则由解析器确定语句的结尾。
2、JS语法规则
什么是标识符、标识符的命名规则;什么是变量、变量的声明与赋值、变量注意3点。
ECMAScript 中的一切(变量、函数名、操作符)都区别大小写。
2.1 JS 的标识符
2.1.1 什么是标识符
指的是变量、函数、属性的名字、或者函数的参数。
2.1.2 标识符命名规则
1)由字母、数字、下划线_、美元符号$组成;
2)不能以数字开头;
3)不能使用关键字、保留字等作为标识符。
2.2 JS 变量
2.2.1 什么是变量
ECMAScript 中的变量是松散类型,可以用来保存任何类型的数据;换句话说,每个变量仅仅是一个用于保存值的占位符而已。
2.2.2 变量的声明与赋值
1)变量声明:使用 var(旧)、let(新)、const(常量) 操作符,语法:var/let/const 变量名。
2)变量赋值:声明的时候同时赋值( var 变量名 = 值; )、先声明后赋值( var 变量名; 变量名 = 值; )。
3)注意:省略 var 声明的变量是全局变量,不推荐省略 var 的操作符来定义全局变量。
使用 var 申明的变量是局部变量,它的范围被限制在该变量被申明的函数体内,同名变量在不同的函数体内互不冲突。
一次声明多个变量,用逗号隔开。
var name_01="marry", age=18, email="marry@sohu.com", address, num=null;
3、JS数据类型
6种简单数据类型、1种复杂数据类型;typeof、console.log()、console.table();undefined、null、boolean 隐士类型转换;
number ==> NaN、isNaN(n)、parseInt()、parseFloat()、number函数类型转换;
string ==> 多行字符串、模版字符串、操作字符串、string函数类型转换 。
6种简单数据类型(基本数据类型):number 、boolean、string、undefined、null、symbol。1种复杂数据类型:Object。
3.1 typeof
1)语法:typeof 变量 / typeof (变量)。
2)功能:检测变量的数据类型。
3)返回值:string 类型,typeof 运算符把类型信息当作字符串返回。typeof 返回值有7种可能 number、boolean、string、undefined、symbol、function、object。array、null 等特殊对象使用 typeof 一律返回 object,这正是 typeof 的局限性。
4)在控制台中打印:console.log()、console.table() 数据以表格的形式显示,后面跟的必须是一个数组或是一个对象。table 第一列是 index,数组对应的是索引,对象对应的是属性名。
3.2 undefined 类型
undefined 未定义的, undefined 类型只有一个值,即特殊的 undefined。一般而言,不存在需要显式地把一个变量设置为 undefined 值的情况。
3.3 null 类型
null 空对象指针。如果定义的变量准备在将来用于保存对象,那么最好将改变量初始化为 null 而不是其他值。
undefined 派生自 null ,所以 undefined == null 返回结果为 true,全等返回 false。
null == undefined //true
null === undefined //false
null === null //true
undefined === undefined //true
3.4 Number 类型
number 表示整数和浮点数。
3.4.1 NaN
NaN 非数值(Not a Number)是一个特殊的数值。
任何涉及 NaN 的操作(例如NaN/10)都会返回 NaN,NaN 与任何值都不想等,包括 NaN 本身,NaN 的数据类型为 Number。
3.4.2 isNaN(n)
1)功能:检测 n 是否是“非数值”。
2)返回值:boolean,只有 false 和 true,true 非数值,false 数值。参数 n 可以是任何类型;
3)说明:isNaN(n) 在接收到一个值之后,会尝试将这个值转换为数值。某些不是数值的值会直接转换为数值。
3.4.3 数值转换
有 3 个函数可以把非数值转换为数值:Number()、parseInt() 和 parseFloat()。Number() 可用于任何数据类型,parseInt() 和 parseFloat() 专门用于把字符串转换成数值。
1)parseInt()
parseInt():提取整数,提取的内容必须以数字开头,如果以非数字开头得到的结果都是 NaN。parseInt() 会忽略字符串前面的空格,直到找到第一个非空格字符。
parseInt('') 转换空字符串返回 NaN。parseInt() 提供第二个参数,转换时使用的基数,即多少进制。
2)parseFloat()
parseFloat():提取浮点数,从第一个字符开始解析每个字符,直至遇见一个无效的浮点数字符为止。parseFloat() 只提取到第一个小数点,parseFloat() 与 parseInt() 的第二个区别在于始终都会忽略前导的零。
3)Number()
可用于任何数据类型,也可直接做四则运算。
2 / 0; // Infinity 0不能当分母
0 / 0; // NaN
var str='abc123';
var num=parseInt(str);
if (num==NaN) {
alert(NaN);
}else if(num==123){
alert(123);
}else if (typeof num == 'number') {
alert('num')
}else{
alert('str');
}
3.4.4 类型转换
显示类型转换:手动执行(原始类型转换、对象类型转换):Number( )、String( )、Boolean( );
隐士类型转换:程序自动执行,四则运算、if 语句、Native 语句。
1)Number 函数 原始类型转换
1、数值:转换后还是原来的值。
2、字符串:如果可以被解析为数值,则转换为相应的数值,否则得到 NaN,空字符串转为 Number 为 0。
3、布尔值:true 转成1,false 转成0。
4、undefined:转成 NaN。
5、null:转成 0。
// 数值转换
Number(1); // 1
// 字符串转换
Number('1'); // 1
Number('num'); // NaN
// 布尔型转换
Number(true); // 1
Number(false); // 0
// undefined 转换
Number(undefined); // NaN
// null 转换
Number(null) // 0
2)Number()函数对象类型转换(对象转换成 Number() 函数)
1、先调用对象自身的 valueOf() 方法,如果该方法返回原始类型的值(数值、字符串、布尔值),则直接对该值使用 Number() 方法,再进行后续步骤。
2、如果 valueOf() 方法返回复合类型的值,再调用对象自身的 toString() 方法,如果 toString() 方法返回原始类型的值,则对该值使用 Number() 方法,不再进行后续步骤。
3、如果 toString() 方法返回的是复合类型的值,则报错。
Number() 函数对象类型转换规律,a是一个对象:
a.valueOf( ) ==》返回的是原始类型的值 ==》Number( )
a.valueOf( ) ==》返回的是复合类型 ==》a.toString( ) ==》返回的是原始类型 ==》Number( )
a.valueOf( ) ==》返回的是复合类型 ==》a.toString( ) ==》返回的是复合类型 ==》报错
var a = {a: 1};
console.log(Number(a)) //NaN
/*
a.valueOf()
{a: 1}
a.toString()
"[object Object]"
Number("[object Object]")
NaN
*/
3.5 String 类型
字符串由单引号 ' ' 、双引号 “ ” 表示,' ' 或 " " 只是一种表示方式,不是字符串的一部分。
1、语法:str.toString()、String(变量)。
2、功能:将 str 转换为字符串。
3、返回值: str 的一个副本。参数 str 是要转换的内容,可以是数值、布尔值、对象和字符串。
4、说明:不知道要转换的值是否是 null 和 undefined 的情况下,可以使用 Srting() 函数,它能够将任何类型的值转换为字符串。
3.5.1 多行字符串
\n 换行
,ES6标准新增了一种多行字符串的表示方法,用反引号 `...` 表示。
3.5.2 模版字符串
把多个字符串连接起来,可以用 + 号连接符。如果有很多变量需要连接,用 +
号比较麻烦。ES6新增了模板字符串,表示方法和多行字符串一样,但是模版字符串会自动替换字符串中的变量。
//+号连接
var name = '小明';
var age = 20;
var message = '你好, ' + name + ', 你今年' + age + '岁了!';
alert(message);
//模版字符串
var name = '小明';
var age = 20;
var message = `你好, ${name}, 你今年${age}岁了!`;
alert(message);
3.5.3 操作字符串
字符串是不可变的,如果对字符串的某个索引赋值,不会错误,也没有任何效果。
var s = 'Test';
s[0] = 'X';
console.log(s); // s仍然为'Test'
3.5.4 String()函数原始类型转换
1、数值:转为相应的字符串。
2、字符串:转换后还是原来的值。
3、布尔值:true 转为 ”true”,false 转为 ”false”。
4、undefined:转为 ”undefined”。
5、null:转为”null”。
3.5.5 String()函数对象类型转换
1、先调用 toString() 方法,如果 toString() 方法返回的是原始类型的值,则直接对该值使用 String() 方法,下再进行后续步骤。
2、如果 toString() 方法返回的复合类型的值,再调用 valueOf() 方法,如果 valueOf() 方法返回的是原始类型的值,则对该值使用 String() 方法,不再进行后续步骤。
3、如果 valueOf() 方法是复合类型的值,则报错。
String()函数对象类型转换规律,a是一个对象:
a.toString( ) ==》返回的是原始类型 ==》String( )
a.toString( ) ==》返回的是复合类型 ==》a.valueOf( ) ==》返回的是原始类型 ==》String( )
a.toString() ==》返回的是复合类型 ==》a.valueOf( ) ==》返回的是符合类型 ==》报错
3.6 Boolean
Boolean 用于表示真假的类型,true 表示真、真为1,false 表示假、假为0。
3.6.1 隐式类型转换
null、NaN、undefined、0、''(空字符串) 转Boolean值为 false,其它一律为 true。
4、JS操作符
什么是表达式、算数操作符、赋值操作符、比较操作符、三元操作符、逻辑操作符。
4.1 什么是表达式
将同类型的数据(如常量、变量、函数等),用运算符号按一定的规则连接起来,有意义的式子称为表达式。 先计算右侧的表达式,得到结果,再赋值给变量。
var x = 10;
x = x+1; // 11
4.2 算数操作符
+ 加、- 减、* 乘、/ 除、% 取余。
1)递增:++a 和 a++ 都是对 a 进行递增的操作。
2)区别:++a 先返回递增之后 a 的值;a++ 先返回 a 的原值,再返回递增之后 a 的值。
3)递减同理。
4)只要有一个字符串,+ 就起连接符的作用( 5 + “5” = 55 )。
var num1 = 10, num2 = 5, num3 = num1++ - num2;
console.log(num3); // 5
var x1 = 20, x2 =30, x3 = --x1 + x2--;
console.log(x3); // 49
4.3 赋值操作符
简单赋值: =;
复合赋值: +=、-=、*=、/=、%=。复合赋值是算术操作符的缩写形式。
var a = 10;
var b = 20;
a+=5; // a = a+5; 15
b%=4; // b = b%4; 0
console.log(a);
console.log(b);
4.4 比较操作符
1)>、<、>=、<=、==、===、!=、!==。
== 相等(两个等号),会自动转换数据类型再比较,只比较值是否相等;
=== 全等(三个等号),直接比较不会自动转换数据类型,比较值的同时比较数据类型是否相等;
!= 不相等,比较值是否不相等;
!== 不相等,比较值的同时比较数据类型是否不相等;
2)返回值:boolean 型;
3)由于 JS 设计缺陷,不要使用 ==
比较,始终坚持使用 ===
比较。
false == 0; // true
false === 0; // false
4)浮点数的相等比较 :浮点数在运算过程中会产生误差,计算机无法精确表示无限循环小数。要比较两个浮点数是否相等,只能计算它们之差的绝对值,是否小于某个阈值。
1 / 3 === (1 - 2 / 3); // false
Math.abs(1 / 3 - (1 - 2 / 3)) < 0.0000001; // true
4.5 三元操作符
1)语法:条件 ? 执行代码1 : 执行代码2。
2)说明:三元操作符可代替简单的 if 语句,如果条件成立,执行代码1,否则执行代码2。
var score = prompt('请输入你的成绩?');
var result = score > 60 ? '及格':'不及格';
alert(result);
4.6 逻辑操作符
4.6.1 逻辑与
1)&& 与,只要有一个条件不成立,返回为 false。
2)有一个操作数不是布尔值的情况,逻辑与操作就不一定返回值,此时它遵循下列规则:
1、如果第一个操作数隐式类型转换后为 true,则返回第二个操作数;
2、如果第一个操作数隐式类型转换后为 false,则返回第一个操作数;
3、如果有一个操作数是 null、NaN、undefined,则返回 null、NaN、undefined;
4.6.2 逻辑或
1)|| 或,只要有一个条件成立,返回为 true。
2)有一个操作数不是布尔值的情况,逻辑或操作就不一定返回值,此时它遵循下列规则:
1、如果第一个操作数隐式类型转换后为 true,则返回第一个操作数;
2、如果第一个操作数隐式类型转换后为 false,则返回第二个操作数;
3、如果有两个操作数是 null、NaN、undefined,则返回 null、NaN、undefined;
4.6.3 逻辑非
1)!非、!!非。
2)无论操作数是什么数据类型,逻辑非都会返回一个布尔值。
3)说明:!! 同时使用两个逻辑非操作符,第1个逻辑非无论基于什么操作都会返回一个布尔值,第2个逻辑非则对该布尔值求反。
注:逻辑与、逻辑或、逻辑非返回的都是布尔值。
二、JS流程控制语句
1、JS分支语句:
if语句、switch多条件判断语句、prompt、alert、string.length。
1.1 if 语句
//语句一
if(条件){ //执行代码块 一行代码的情况下,大括号可以省略但是不建议这样写 }
//语句二
if(条件){
//执行代码块1
}else{
//执行代码块2
}
//语句三
if(条件){
//执行代码块1
}else if(条件){
//执行代码块2
}else{
//执行代码块3
}
案例:判断用户输入的密码是否是 6 位的纯数字,如果不是 6 位的纯数字,提示用户输入错误。
var password = prompt('请输入密码');
// 最佳方案
if(isNaN(password) || password.length != 6){
alert('密码长度必须是6位的纯数字')
}else{
alert('密码输入正确');
}
// 方法一
if (password.length != 6) { // 判断密码的长度
alert('密码长度必须是6位数字');
}else{
if (isNaN(password)) {
alert('密码必须是数字');
} else {
alert('密码输入正确');
}
}
// 方法二
if(isNaN(password)){
alert('密码必须是数字');
}else if(password.length != 6){
alert('密码必须是6位数字');
}else{
alert('密码输入正确');
}
案例:判断用户输入的密码是否是 6-12 位纯数字。
var password=prompt('请输入密码');
//方法一
if(isNaN(password) || password.length < 6 || password.length > 12){
alert('密码长度必须是6-12位的纯数字');
}else{
alert('密码输入正确');
}
//方法二
if (password.length < 6 || password.length > 12) {
alert('密码长度必须是6-12位数字');
}else{
if (isNaN(password)) {
alert('密码必须是数字');
} else {
alert('密码输入正确');
}
}
1.2 switch 多条件判断语句
switch(表达式){
case value:
statement;
break;
……
default:
statement;
}
文本框中输入的数字或文字都为字符串类型。Number() 可以把字符串转为数字型。
1.2.1 获取星期
1)语法:new Date().getDay()。
2)返回值: number,0 - 6 的数字。0 表示星期天。
案例:输出星期。
var week = new Date().getDay(),
weekstr = "";
switch(week){
case 0:
weekstr = '日';
break;
case 1:
weekstr = '一';
break;
case 2:
weekstr = '二';
break;
case 3:
weekstr = '三';
break;
case 4:
weekstr = '四';
break;
case 5:
weekstr = '五';
break;
default:
weekstr = '六';
}
document.write('今天是星期' + weekstr);
案例:判断学生输入的成绩 0-100 之间纯数字,成绩小于 0 或者大于 100 表示成绩输入错误,成绩小于 60 不及格、60-70 及格、70-80 良好、80 以上优秀。
var score = prompt('输入你的成绩');
if(isNaN(score)){
alert('输入的成绩必须是数字');
}else{
if(score < 0 || score > 100){
alert('输入的成绩有误');
}else {
switch(parseInt(score/10)){
case 0:
case 1:
case 2:
case 3:
case 4:
case 5:
document.write('不及格');
break;
case 6:
document.write('及格');
break;
case 7:
document.write('良好');
break;
default:
document.write('优秀');
}
}
}
1.3 弹出框和字符串的长度
1)prompt() 可以让用户在页面弹出的输入框中输入内容。弹出输入框,点击确定,返回输入内容;点击取消,返回 null。
2)alert:弹出警告框。
3)length:string.length,获取 string 字符串的长度,返回值 number。
2、JS循环语句
for循环、for循环规则、while循环、do...while循环、for和while区别、break退出当前循环、continue跳过本次循环。
2.1 for 循环
for(语句1;语句2;语句3){
//被执行的代码块;
}
- 语句1:循环代码块开始前执行;
- 语句2:定义运行循环代码块的条件;
- 语句3:循环代码块已被执行之后执行。
2.1.1 当循环与循环发生嵌套时遵循下列规则:
外层为假时内层不执行;先执行外层再执行内层,直至内层的条件为假时再返回外层去执行;
案例:九九乘法表。
//九九乘法表
for(var i=1; i<=9; i++){
for(var j=1; j<=i; j++){
document.write(j + '*' + i + '=' + j*i + ' ');
}
document.write('<br>');
}
案例:水仙花每个位数上数字的 n 次幂之和等于它本身,例:1*1*1+5*5*5+3*3*3=153;在页面中输出 1000 以内的水仙花数。
//水仙花153 370 371 407
for(var bai=1; bai<=9; bai++){
for (var shi=0; shi<=9; shi++) {
for (var ge=0; ge<=9; ge++) {
var result1=bai*bai*bai + shi*shi*shi + ge*ge*ge;
var result2=bai*100 + shi*10 + ge*1;
if (result1===result2) {
document.write(result1 + '<br>');
}
}
}
}
2.2 while 循环:
while(条件){
//执行代码;
//变量变化语句;
}
注: 变量变化语句一定要写,不然会造成死循环,页面会崩溃;
2.3 do-while 循环:
do{
//需要执行的代码;
//变量变化语句;
} while(条件)
do-while 循环在检查条件是否为真时,至少先执行一次代码块;如果为真继续循环,如果为假,不再循环。
2.4 for 与 while 的区别:
for 适合已知循环次数的循环体,while 适合未知循环次数的循环体。
案例:输出 1-10 的偶数、输出 1-100 的和。
// 输出1-10的偶数
for(var i=1; i<=10; i++){
if(i%2 == 0) {
document.write(i + '<br/>');
}
}
// 输出1-100的和 5050
for(var i=1, sum=0; i<=100; i++){
sum += i;
}
document.write(sum);
2.5 break 语句
立即退出循环。
案例:完成一个验证密码的代码,默认密码是123456,要求如下。
1)打开页面时,弹出第一个输入框,当用户输入的密码是默认密码时,弹出下一个输入框”请再次输入密码“;
2)如果用户输入的密码不是默认密码,那么重新弹出第一个输入框,直到密码输入正确,那么才弹出第二个输入框;
//方法一
var defaultpwd = '123456',
pwdAgain;
do{
var pwd=prompt('请输入密码');
if(pwd == defaultpwd){
break;
}
}while(pwd != defaultpwd)
pwdAgain=prompt('请再次输入密码');
//方法二
var pwd = prompt('请输入密码'),
defaultpwd = '123456',
pwdAgain;
while (pwd != defaultpwd) {
pwd = prompt('请输入密码');
if(pwd == defaultpwd) {
break;
}
}
pwdAgain = prompt('请再次输入密码')
2.6 continue 语句
结束本次循环,继续开始下一次。
案例:打印所有 0-100 之间除了 22,44,66 以及 88 之外 2 的倍数,并求他们的和。
//方法一
var sum = 0;
for(var i=0; i<=100; i++){
if (i%2 == 0) {
if (i==22 || i==44 || i==66 || i==88) {
continue;
}
sum = sum + i;
}
}
document.write(sum);
//方法二
var sum = 0;
for (var i = 0; i <= 100; i++) {
if(i%2 == 0){
switch (i) {
case 22:
case 44:
case 66:
case 88:
continue;
}
sum = sum + i;
}
}
document.write(sum);
三、JS函数
函数的作用、函数的定义、函数的语法、函数的调用、函数的返回值、return语句说明、arguments函数的参数对象。
1.1 函数的作用
函数可以封装任意多条语句,可以在任何地方、任何时候调用执行。
1.2 函数的定义
函数使用 function 声明,后跟一组参数一级函数体。
1.3 函数的语法
function functionName([arg0,arg1…argn]){
//执行脚本;
}
- functionName 要定义的函数名,属于标识符;
- [ ] 中的 arg0,arg1…argn 为函数的参数,不是必须的;
- [ ] 只说明里面的内容不是必须的,它不是语法。
1.4 函数的调用
直接写函数名 functionName([arg0,arg1…argn])。
1.5 函数的返回值
任何函数在任何时候都可以通过 return 语句后跟要返回的值来实现返回值。
1.6 return 语句说明
1)函数会在执行完 return 语句之后停止并立即退出;
2)return 语句可以不带有任何返回值,一般用于需要提前停止函数执行而又不需要返回值的情况;
3)如果希望函数值能返回调用它的地方,我们可以使用 return 后面加上返回值;
4)return 后面如果有返回值,那么函数读到它时,会停止执行,并返回制定的值;
5)return 后面如果没有返回值,那么函数会在执行 return 语句后停止并立即退出。
案例:利用函数对用户输入的密码长度进行判断,密码长度 6-12 位。
var password=prompt('请输入密码');
// 方法一
var password = prompt('请输入密码');
function num(password){
var length = password.length;
if(length < 6 || length > 12){
return '密码必须是6-12位'
}
return '密码输入正确';
}
// 方法二
function num(password){
if (password.length >= 6 && password.length <= 12) {
return '密码输入正确';
}else {
return '密码必须是6-12位';
}
}
// 方法三
function num(password){
if (password.length<6) {
return '密码长度不能小于6位数';
}else if (password.length>12) {
return '密码长度不能大于12位数';
}else {
return '密码输入正确';
}
}
var result=num(password);
document.write(result);
1.7 arguments
在 ECMAScript 中的参数内部用一个数组来表示,在函数体内通过 ECMAScript 对象来访问这个数组参数。
arguments 对象只是与数组类似,并不是 Array 的实例。[ ] 访问它的每一个元素。length 属性确定传递参数的个数。arguments.length 获取函数参数长度。arguments[1] 访问函数参数元素。
function inner(){
console.log(arguments.length); //2
console.log(arguments[1]); //5
}
inner(10,5);
function add(num1, num2){
arguments[0]=99;
console.log(num1); //99
}
add(55,88)
案例:用 arguments 对象获取到函数参数任意一组数的平均值,且这个平均值是一个整数。
function num(){
var sum = 0, len = arguments.length;
for(var i=0; i<len; i++){
sum += arguments[i]
}
return parseInt(sum/len);
}
var result = num(2,4,6,1);
document.write(result);
案例:函数参数对象 arguments,使用函数的 arguments 来做下用户密码和验证码的验证。用户输入的密码不是数字时,提示“密码错误”。用户输入的验证码小于 4 位数时,提示“验证码不得小于 4 位数”。
var pwd = prompt('请输入密码'), code;
function login(pwd,code) {
if(isNaN(arguments[0])){
return '密码必须是数字';
}else{
code=prompt('请输入验证码');
if(arguments[1].length<4){
return '验证码长度不能小于4位数';
}
}
return '密码输入正确';
}
var result = login(pwd, code);
document.write(result);
四、内置对象
1、JS中的数组
创建数组的2种方式、数组元素的读写、数组的长度;
数组栈方法: push()、pop()、unshift()、shift();
数组转换方法:join() 数组转换成字符串、reverse() 数组取返;
数组重新排序:sort();
数组的操作方法concat()、slice(start, end)可以实现数组的拷贝、splice()删除插入替换数组项;
数组实例添加的两个位置方法indexOf(searchValue, startIndex)、lastIndexOf(searchValue, startIndex)搜索某个值在数组中出现的位置,没有找到的情况下返回-1。
1.1 数组
1.1.1 创建数组 2 种方式
1)使用 Array 构造函数:new Array()。
小括号 () 说明:预先知道数组要保存的项目数量,向 Array 构造函数中传递数组应包含的项。
var colors = new Array(3); //数组项目数量
colors[0] = "#f00";
colors[1] = "#0f0";
colors[2] = "#00f";
console.log(colors);
var num = new Array(1,2,3,4); //数组应包含的项
console.log(num);
2)使用数组字面量表示法:由一对包含数组项的中括号 [ ] 表示,多个数组项之间用逗号隔开。
var info = [6,'marry',true];
console.log(info[5]); //索引超出了范围,返回 undefined
console.log(info.length); //3
1.1.2 数组元素的读写
读取和设置值时,使用中括号 [ ] 并提供相应的索引。索引是从 0 开始的正整数。
1.1.3 数组长度
array.length,返回值 number。通过设置 length 可以从数组的末尾移除项或向数组中添加新项;当把一个值放在超出当前数组大小的位置上时,长度值等于最后一项索引加1。
var arr = ['a','b','c','d'];
console.log(arr.length);
arr.length = 2;
console.log(arr);
arr[99]='e';
console.log(arr.length);
数组遍历语法:
for(var i=0; i<arr.length; i++){
console.log(arr[i]);
}
案例:编写一个统计员工工资的代码,要求不停接收用户输入的员工工资,直到用户输入“退出”便不再弹出“输入工资”窗口。把用户输入的数据存在一个数组中,数组中不包含“退出”。
var arr = [],
i = 0,
money;
while(money != '退出') {
money = prompt('请输入工资');
arr[i] = money;
i++;
}
arr.length -= 1;
console.log(arr);
1.2 数组栈方法
1.2.1 push()
1)语法:arrayObject.push(newele1,newele2,…,neweleX)。
2)功能:把它的参数顺序添加到数组对象的尾部。
3)返回值:指定的值添加到数组后的新长度。
var arr = [1,2,3,4,5];
var push = arr.push(8);
console.log(push); // 6
console.log(arr); // [1,2,3,4,5,8]
案例:函数来封装一个数组,数组中所有大于 3 的值都取出来存到一个新数组中。
var arr = [1,2,5,8,10,9,3,6],
newArr = [];
function nums(arr){
for(var i=0; i<arr.length; i++){
if(arr[i] > 3) {
newArr.push(arr[i])
}
}
return newArr;
}
var result = nums(arr);
console.log(result);
1.2.2 pop()
1)语法:arrayObject.pop()。
2)功能:删除数组对象最后一个元素。
3)返回值:被删除的那个元素。
var arr = [1,2,3,4,5];
var pop = arr.pop();
console.log(pop); //5
1.2.3 unshift()
1)语法:arrayObject.unshift(newele1,newele2,…,neweleX)
2)功能:把它的参数顺序添加到数组对象的开头。
3)返回值:指定的值添加到数组后的新长度。
var arr = [1,2,3,4,5]
var unshift = arr.unshift(0);
console.log(unshift); // 6
1.2.4 shift() :
1)语法:arrayObject.shift()
2)功能:删除数组对象第一个元素。
3)返回值:被删除的那个元素。
var arr = [1,2,3,4,5];
var shift = arr.shift();
console.log(shift); //1
案例:封装一个函数,实现不用 reverse( ) 也能实现数组反转的功能。
var arr = [1,2,3];
console.log(arr.reverse());
//方法一
function reverseArr(arr){
var newArr = [];
for(var i=0; i<arr.length; i++) {
newArr.unshift(arr[i]);
}
return newArr;
}
var newArr1 = reverseArr([1,2,3,4]);
console.log(newArr1);
//方法二
function reverseArr(arr){
var newArr = [];
for(var i=arr.length-1; i>=0; i--) {
newArr.push(arr[i]);
}
return newArr;
}
var newArr1 = reverseArr([1,2,3,4]);
console.log(newArr1);
案例:写一个函数,返回某个值在这个数组中出现了多少次。
var nums = [8,2,5,6,8,6,7,9],
times = 0;
function getTimes(arr,num){
for(var i=0; i<arr.length; i++){
if(arr[i] === num) {
times += 1;
}
}
return times;
}
var result = getTimes(nums,8)
console.log(result);
1.3 数组转换方法
1.3.1 join()
1)语法:arrayObject.join(separator) separator 分隔符。
2)说明:join 没有参数时,默认“,”分隔;如果不想值与值之间用任何东西隔开写个空的引号(“ ”)。
3)功能:把数组中的所有元素都转换成字符串。
4)返回值:字符串。
//join
var num = [2,4,5];
var str = num.join();
console.log(str);
var words = ['border','left','color'];
var wordStr = words.join('-');
console.log(wordStr);
1.3.2 reverse()
1)语法:arrayObject.reverse()
2)功能:颠倒数组中元素的顺序。
3)返回值:数组。
//reverse
var num = [2,4,5];
num.reverse();
console.log(num);
var str = ['a','b','c','d'];
var newStr = str.reverse().join('');
console.log(newStr);
1.4 数组重新排序
1.4.1 sort() :
1)语法:arrayObject.sort(sortby)
2)功能:对数组中的元素进行排序。
3)返回值:数组。
4)说明:即使数组中的每一项都是数值,sort() 方法比较的也是字符串。sort() 方法可以接收一个比较函数作为参数。
// sort
var arr = [9,23,15,-99,88,12,-2];
arr.sort(
function(a,b){
return a<b; //降序
}
)
console.log(arr);
arr.sort(
function(a,b){
return a>b; //升序
}
)
console.log(arr);
案例:对用户输入的数据进行降序排序。要求用户输入的结束符 “-1” 不进行排序。
var i=0,
num,
arr=[];
while(num != '-1'){
num = prompt('请输入数据');
arr[i] = num;
i++;
}
arr.length -= 1;
var result = arr.sort(function(a,b){
return a<b;
})
console.log(result);
1.5 数组的操作方法
1.5.1 concat()
1)语法:arrayObject.concat(arrayX,arrayX,…,arrayX)
2)功能:连接两个或多个数组。
3)返回值:数组。
var arr1 = ['a','b','c'],
arr2 = ['d','e',1,3],
arr3;
arr3 = arr1.concat(arr2,[4,5,6]);
console.log(arr3);
1.5.2 slice() :
1)语法:arrayObject.slice(start,end)。
2)功能:从已有的数组中返回选定的元素。
3)参数:start 必需,规定从何处开始选取。end 可选,规定从何处结束选取,start\end 数组下标。
如果没有指定 end,切分的数组包含从 start 到数组结束的所有元素。
如果 slice() 方法的参数中有一个负数,则用数组长度加上该数组确定相应的位置。 slice()
的起止参数包括开始索引,不包括结束索引。如果不给 slice()
传递任何参数,它就会从头到尾截取所有元素。利用这一点,可以复制一个 Array。
数组中的slice()对应字符串中
的substring()
。
5)返回值:数组。
var colors = ['red','green','blue','yellow','orange'];
var newColors1 = colors.slice(1,4); //green,blue,yellow
var newColors2 = colors.slice(-4,3); //green,blue
console.log(newColors1);
console.log(newColors2);
案例:完成以下代码段,实现 b 数组对 a 数组的拷贝,方法越多越好。
var a = [1,'yes',3],
b = [];
// 方法一:for循环 push
for(var i=0; i<a.length; i++){
b.push(a[i]);
}
// 方法二:concat()
b = [].concat(a) //空数组 告诉它空数组和a的数组联系到一起
// 方法三:slice()
b = a.slice(0);
// 方法四:splice()
b = a.splice(0);
console.log(b);
1.5.3 splice() 方法删除数组项:
1)语法:arrayObject.splice(index,count)
2)功能:删除从 index 处开始的零个或多个元素。
3)返回值:含有被删除的元素的数组。
4)说明:count 是要删除的项目数量,如果设置为0,则不会删除项目。如果不设置,则删除从 index 开始的所有值。
//splice删除数组项
var arr = ['a','b','c','d','e','f'];
var delArr = arr.splice(2,3);
console.log(delArr); // ["c", "d", "e"]
console.log(arr); // ["a", "b", "f"]
1.5.4 splice() 方法插入数组项:
1)语法:arrayObject.splice(index,0,item1,….,itemX)
2)功能:在指定位置插入值。
3)参数:index 起始位置、0 要删除的项数、item1,….,itemX 要插入的项。
4)返回值:数组(返回的是空数组)。
//插入数组项
var arr = ['a','b','c','d','e','f'];
var insertArr = arr.splice(1,0,'m','n',9);
console.log(insertArr); // []
console.log(arr); // ["a", "m", "n", 9, "b", "c", "d", "e", "f"]
1.5.3 splice() 方法替换数组项:
1)语法:arrayObject.splice(index,count,item1,….,itemX)
2)功能:在指定位置插入值,且同时删除任意数量的项。
3)参数:index 起始位置、0 要删除的项数、item1,….,itemX 要插入的项。
4)返回值:从原始数组中删除的项(如果没有删除任何项,则返回空数组)。
//替换数组项
var arr = ['a','b','c','d','e','f'];
var replaceArr = arr.splice(1,2,'x','y','z');
console.log(replaceArr); // ["b", "c"]
console.log(arr) // ["a", "x", "y", "z", "d", "e", "f"]
案例:输入任意你喜欢的字符,使用数组的操作方法写出代码。
1)循环弹出输入框,用户输入的任意字符的前两个被替换为 “hello”,后面的字符不受影响。
2)当输入 “-1” 时,输入框停止弹出。数组中不包含结束字符 -1。
var text,
arr=[],
i=0;
while(text != '-1'){
text=prompt('输入你喜欢的字符');
arr[i]=text;
i++;
}
arr.length-=1;
var newArr=arr.splice(0,2,'hello')
console.log(arr);
console.log(newArr);
1.6 数组实例添加的两个位置方法:
1.6.1 indexOf()
1)语法:arrayObject.indexOf(searchvalue,startIndex)
2)功能:从数组的开头(位置0)开始向后查找。
3)参数:searchvalue 必需,要查找的项;startIndex 可选,起点位置的索引。
4)返回值:number,查找的项在数组中的位置,没有找到的情况下返回 -1。
1.6.2 lastIndexOf()
1)语法:arrayObject.lastIndexOf(searchvalue,startIndex)
2)功能:从数组的末尾开始向前查找。
3)参数:searchvalue 必需,要查找的项;startIndex 可选,起点位置的索引。
4)返回值:number,查找的项在数组中的位置,没有找到的情况下返回 -1。
5)说明:在比较第一个参数与数组中的每一项时,会使用全等操作符,即要求查找的项必须严格相等。数组的位置方法是 ECMAScript5 为数组实例新增的,支持的浏览器只有:IE9、Firefox2+、Safari3+、Opera9.5 和 Chrome。
案例:数组的 indexOf() 方法有兼容性问题,考虑到低版本浏览器兼容性,需要自己写一个函数封装这个方法。
1)写出函数,定义两个参数,一个是要被检测的数组,另一个是要判断的值。
2)函数里面要对被检测的数组进行循环,判断如果数组里的项等于要判断的值,那么返回这个数组项的索引。
var nums = [1,7,5,7,8,1,6,9];
function arrIndexOf(arr,value){
for(var i=0; i<arr.length; i++){
if (arr[i] === value) {
return i;
}
}
return -1;
}
var pos = arrIndexOf(nums,7);
console.log(pos);
2、JS中的String
常用字符串 charAt(index) index是索引值、charCodeAt(index)、indexOf()、lastIndexOf();截取字符串方法 slice(start, end)、substring(start, end)、substr(start,len);字符串对象方法 split()、replace();字符串其它方法 toUpperCase()、toLowerCase()。
2.1 常用字符串
2.1.1 charAt()
1)语法:stringObject.charAt(index) 。
2)功能:返回 stringObject 中 index(索引)位置的字符。
2.1.2 charCodeAt()
1)语法:stringObject.charCodeAt(index) 。
2)功能:返回 stringObject 中 index(索引)位置字符的字符编码。
var str = 'hello world';
var a = str.charAt(1); //e
var b = str.charCodeAt(1); //101 字符对应的字符编码
2.1.3 indexOf()
1)语法:stringObject.indexOf("o") 。
2)功能:从一个字符串中搜索给定的子字符串,返回子字符串的位置。
3)返回值:数值。
4)说明:如果没有找到该子字符串,则返回 -1。
2.1.4 lastIndexOf()
1)语法:stringObject.lastindexOf("o")
2)功能:从一个字符串尾部搜索给定的子字符串,返回子字符串的位置。
3)返回值:数值
4)说明:如果没有找到该子字符串,则返回 -1。
var str = 'hello world';
var c = str.indexOf('o'); //4
var d = str.lastIndexOf('o'); //7
2.2 截取字符串方法
2.2.1 slice()
1)语法:stringValue.slice(start,end)
2)功能:截取子字符串
3)参数说明:start 必需,指定子字符串的开始位置。
end 可选,表示子字符串到哪里结束,end 本身不在截取范围之内,省略时截取至字符串的末尾。
当参数为负数时,会将传入的负值与字符串的长度相加。
2.2.2 substring()
1)说明:语法及功能同 slice() 完全一样。
2)区别在于:当参数为负数时,自动将参数转换为 0;
substring() 会将较小的数作为开始位置,将较大的数作为结束位置。
var str = 'hello world';
var a = str.substring(-7,5); //0,5
var b = str.substring(2,-5); //0,2
2.2.3 substr()
1)语法:stringValue.substr(start,len)
2)功能:截取子字符串。
3)参数说明:start 必需,指定子字符串的开始位置。
len:可选,表示截取的字符总数,省略时截取至字符串的末尾。
当 start 为负数时,会将传入的负值与字符串的长度相加。
当 len 为负数时,返回空字符串。
var str = 'hello world';
var a = str.slice(0,2); // he
var b = str.substring(0, 4); // hell
var c = str.substr(1,-1); //
2.3 字符串对象方法
2.3.1 split()
1)语法:stringObject.split(separator)
2)功能:把一个字符串分割成字符串数组。
3)返回值:Array。
4)说明:separator 必需,分隔符。如果把空字符串 (' ') 用作 separator,那么 stringObject 中的每个字符之间都会被分割。
var str = 'border-left-color';
var a = str.split('-'); //["border", "left", "color"];
var b = str.split('');
2.3.2 replace()
1)语法:stringObject.replace(regexp/substr,replacement) (替换谁,被替换成谁)
2)功能:在字符串中用一些字符替换另一些字符,或替换一个与正则表达式匹配的字串。
3)返回值:String
4)参数:regexp 必需。规定子字符串或要替换的模式的 RegExp 对象。
replacement 必需,一个字符串值。
//字符串对象方法
var str = 'hello world';
var a = str.split('');
var b = str.replace('e','cc');
2.4 字符串其它方法
2.4.1 toUpperCase()
1)语法:stringValue.toUpperCase()
2)功能:把字符串转换为大写。
2.4.2 toLowerCase()
1)语法:stringValue.toLowerCase()
2)功能:把字符串转换为小写。
案例:用函数封装,将字符串 border-left-color 转换成 borderLeftColor。
function text(str){
var arr = str.split('-'), newStr = arr[0]; //["border", "left", "color"]
for(var i=1; i<arr.length; i++){
var word = arr[i];
newStr += word.charAt(0).toUpperCase() + word.substr(1);
}
return newStr;
}
var newText = text('border-left-color');
console.log(newText);
3、JS中的Math
Math.max()、Math.ceil()、Math.floor()、Math.round()、Math.abs()、Math.random()、随机整数封装在函数中公式。
3.1 Math.max()
1)语法:Math.max(num1,num1…numN);
2)功能:求一组数中的最大值;
3)返回值:Number。
3.2 Math.ceil()
1)语法:Math.ceil(num);
2)功能:向上取整,即返回大于 num 的最小整数;
3)返回值:Number。
3.3 Math.floor()
1)语法:Math.floor(num);
2)功能:向下取整,返回 num 的整数部分;
3)返回值:Number。
3.4 Math.round()
1)语法:Math.round(num);
2)功能:将数值四舍五入为最接近的整数;
3)返回值:Number。
3.5 Math.abs()
1)语法:Math.abs(num);
2)功能:返回 num 的绝对值;
3)返回值:Number。
3.6 Math.random()
1)语法:Math.random();
2)功能:返回大于等于 0 小于 1 的一个随机数;
3)返回值:Number。
4)说明:封装一个求 n 到 m 之间的随机整数的函数,求 n 和 m 之间的随机整数的公式,random = Math.floor(Math.random()*(m-n+1)+n),m-n+1 是随机整数的个数。
var min = Math.min(1,2,-3,4); //-3
var max = Math.max(1,2,-3,4); //4
//生成一个n到m之间的随机整数
function getRandom(n,m){
var choise = m-n+1; //随机整数的个数
console.log(choise);
return Math.floor(Math.random() * choise + n);
}
var random1 = getRandom(2,6);
console.log(random1);
案例:随机产生 10 个整数,放入数组中,对这个数组进行降序排序,并获取到这个数组的最大值和最小值。(利用循环,获取10 个整数)
var arr = [];
function getRandom(n,m){
var choise = m-n+1;
return Math.floor(Math.random() * choise + n);
}
for(var i=0; i<10; i++){
//生成一个随机数
var random = getRandom(0,100);
//将生成的随机数放入数组内
arr.push(random);
}
var newArr = arr.sort(function(a,b){ return a<b;});
console.log(newArr);
var str = newArr.join();
var max = Math.floor(parseInt(str))
console.log(max);
4、JS中的Date对象
创建一个日期对象 new Date()、new Date().getDate()、new Date().getDay()。
4.1 创建一个日期对象
1)语法:new Date();
2)功能:创建一个日期时间对象;
3)返回值:不参与的情况下,返回当前的日期时间对象;
4)说明:如果想根据特定的日期和时间创建日期对象,必需传入表示该日期的毫秒数或者是一组用逗号隔开的表示年月日时分秒的参数。
4.2 获取年月时分秒及星期的方法
1、getFullYear():返回 4 位数的年份;
2、getMonth():返回日期中的月份,返回值为 0-11(0表示1月);
3、getDate():返回月份中的天数;
4、getDay():返回星期,返回值为 0-6;
5、getHours():返回小时;
6、getMinutes():返回分钟;
7、getSeconds():返回秒;
8、getTime():返回表示日期的毫秒数。
4.3 设置年月时分秒及星期的方法
1、setFullYear(year):设置 4 位数的年份
2、setMonth(mon):设置日期中的月份,从 0 开始,0 表示 1 月份
3、setDate():设置日期
4、setDay():设置星期,从 0 开始,0 表示星期日
5、setHours():设置小时
6、setMinutes():设置分
7、setSeconds():设置秒
8、setTime():以毫秒数设置日期,会改变整个日期
案例:50 天之后是星期几。
var day = (50+1)%7;
var week = ['日','一','二','三','四','五','六'];
console.log('50天后是星期'+week[day]);
五、DOM基础
DOM查找方法document.getElementById()、document.getElementsByTagName()、document.getElementsByName()、document.getElementsByClassName();设置元素样式ele.style.styleName=styleValue、替换元素内容ele.innerHTML、重新设置元素的类 ele.className=“cls”;
DOM属性获取 ele.getAttribute()、设置ele.setAttribute()、删除ele.removeAttribute()。
1、DOM查找方法
1.1 document.getElementById()
1)语法:document.getElementById(“id”);
2)功能:返回对拥有指定 ID 第一个对象的引用;
3)返回值:DOM 对象;
4)说明:id 为 DOM 元素上 id 属性的值。
1.2 document.getElementsByTagName()
1)语法:document.getElementsByTagName(“tag”);
2)功能:返回一个对所有 tag 标签引用的集合;
3)返回值:数组;
4)说明:tag 为要获取的标签名称;
5)document.getElementsByName() 返回指定 name 属性值的所有子元素的集合,返回的是一个类数组对象;
6)document.getElementsByClassName() 返回指定 class 名称的元素(不管元素上有没有类,className 属性设置的类会重写元素上的类)。
<div class="box" id="box">盒子</div>
<ul id="list1">
<li>函数</li>
<li>数组</li>
</ul>
<ol>
<li>js</li>
<li>vue</li>
</ol>
<script>
var box = document.getElementById('box');
console.log(box);
var list = document.getElementsByTagName('li');
console.log(list.length); // 4
var list1 = document.getElementById('list1').getElementsByTagName('li');
console.log(list1.length); // 2
</script>
1.3 设置元素样式
1)语法:ele.style.styleName = styleValue;
2)功能:设置 ele 元素的 CSS 样式;
3)说明:ele 为要设置样式的 DOM 对象,styleName 为要设置的样式名称必须使用驼峰形式,styleValue 为要设置的样式值。
<div class="box" id="box">DOM基础</div>
<ul id="list">
<li>函数</li>
<li>数组</li>
<li>对象</li>
</ul>
<script>
var list = document.getElementById('list').getElementsByTagName('li');
for(var i=0; i<list.length; i++){
if(i==0){
list[i].style.color = "#f00";
}else if(i==1){
list[i].style.color = "#f0f";
}else{
list[i].style.color = '#00f'};
}
</script>
1.4 标签之间内容替换 innerHTML
1)语法:ele.innerHTML;
2)功能:返回 ele 元素开始和结束标签之间的内容;
3)语法:ele.innerHTML = “html”;
4)功能:设置 ele 元素开始和结束标签之间的 HTML 内容为 html;
5)说明:innerHTML 获取和设置标签之间的文本和 html 内容。
<style>
.current{color:#f00;}
</style>
<div class="box" id="box">DOM基础</div>
<ul id="list">
<li>函数</li>
<li>数组</li>
<li>对象</li>
</ul>
<script>
var list = document.getElementById('list').getElementsByTagName('li');
for(var i=0; i< list.length; i++){
console.log(list[i]);
list[i].innerHTML = list[i].innerHTML + '是JS的一部分';
list[1].className = "current";
}
</script>
1.5 重新设置类 className
1)语法:ele.className;
2)功能:返回 ele 元素的 class 属性;
3)语法:ele.className = “cls”;
4)功能:设置 ele 元素的 class 属性为 cls;
5)说明:动态添加 class 替换元素本身的 class,ele.className 是重新设置类,替换元素本身的 class。如果元素有 2 个以上的class 属性值,那么获取这个元素的 className 属性时,会将它的 class 属性值都打印出来。
<style>
.box{ background: #f6f6f6; }
.box1{ padding: 10px; }
</style>
<div class="box" id="box">盒子</div>
<ul id="list1">
<li>函数</li>
<li>数组</li>
</ul>
<ol>
<li>js</li>
<li>vue</li>
</ol>
<script>
var box = document.getElementById('box');
box.style.color = '#f00';
box.innerHTML = '模型';
box.className = 'box1';
</script>
2、DOM属性设置与获取
2.1 获取属性
1)语法:ele.getAttribute(“attribute”)
2)功能:获取 ele 元素的 attribute
3)说明:ele 是要操作的 dom 对象,attribute 是要获取的 html 属性。
2.2 设置属性
1)语法:ele.setAttribute(“attribute”, value)
2)功能:在 ele 元素上设置属性
3)说明:ele 是要操作的 dom 对象,attribute 设置的属性名,value 的attribute属性值。
2.3 删除属性
1)语法:ele.removeAttribute(“attribute”)
2)功能:删除 ele 上的 attribute 属性
3)说明:ele 是要操作的 dom 对象,attribute 是要删除的属性名。
<p id="text" class="text" align="center" data-type="title">文本</p>
<input type="text" name="user" value="user" id="user" validate="true">
<script>
var p = document.getElementById('text');
var user = document.getElementById('user');
console.log(p.getAttribute('class'));
console.log(user.getAttribute('validate'));
p.setAttribute('data-color','red');
p.removeAttribute('align');
</script>
六、DOM事件
什么是事件、HTML事件、DOM0级事件执行脚本可以是匿名函数也可以是函数的调用、鼠标事件、键盘事件与keyCode属性、关于this指向、手机号判断value用户获取表单中的值j、皮肤颜色改变、判断浏览器窗口和滚动条发生变化、按钮的交互变化、多行文本框输入字符计算。
1、什么是事件
事件是文档或浏览器窗口中发生的一些特定的交互瞬间。
2、HTML 事件
1)语法:<tag 事件=“执行脚本”></tag>;
2)功能:在 HTML 元素上绑定事件;
3)说明:执行脚本可以是一个函数的调用;
4)不建议使用 HTML 事件原因:多元素绑定相同事件时,效率低;不建议在 HTML 元素中写 JavaScript 代码。
3、DOM0 级事件:
1)通过 DOM 获取 HTML 元素;
2)语法:ele.事件 = 执行脚本;
3)功能:在 DOM 对象上绑定事件;
4)说明:执行脚本可以是一个匿名函数,也可以是一个函数的调用。
4、鼠标事件:
onload:页面加载时触发;
onclick:鼠标点击时触发;
onmouseover:鼠标滑过时触发;
onmouseout:鼠标离开时触发;
onfocus:获得焦点时触发(onfocus 事件用于 input 标签 type 为 text、password、textarea 标签);
onblur:失去焦点时触发;
案例:手机号判断。
<style>
.tip{display:none;font-size:14px; vertical-align: middle; padding-top: 3px}
</style>
<script>
window.οnlοad=function(){
var phone=document.getElementById("phone"),
tip=document.getElementById("tip");
phone.οnfοcus=function(){
tip.style.display='inline-block';
}
phone.οnblur=function(){
// 获取文本框的值,value用于获取表单元素的值
var phoneVal=this.value;
// 判断手机号码是否是11位的纯数字
if(phoneVal.length==11 && isNaN(phoneVal)==false){
tip.innerHTML='<img src="img/right.png">';
}else{
tip.innerHTML='<img src="img/error.png">';
}
}
}
</script>
<div class="box">
<input type="text" id="phone" placeholder="请输入手机号码">
<span class="tip" id="tip">请输入有效的手机号码</span>
</div>
onchange:域的内容改变时发生(一般作用于 select 或 checkbox 复选框或 radio 单选按钮);
案例:皮肤背景色改变。
<script>
window.οnlοad=init;
function init(){
var menu=document.getElementById('menu');
menu.οnchange=function(){
//selectedIndex 属性可设置或返回下拉列表中被选选项的索引号。
//语法 selectObject.selectedIndex=number
var bgcolor=menu.options[menu.selectedIndex].value;
if(bgcolor==""){
document.body.style.background="#fff";
}else{
document.body.style.background=bgcolor;
}
}
}
</script>
<div class="box">
请选择你喜欢的背景色
<select id="menu">
<option value="">请选择</option>
<option value="#f00">红色</option>
<option value="#ff0">黄色</option>
<option value="#f0f">紫色</option>
</select>
</div>
onsubmit:表单中的确认按钮被点击时发生(绑定在 form 标签上);
onmousedown:鼠标按钮在元素上按下时触发;
onmousemove:在鼠标指针移动时发生;
onmouseup:在元素上松开鼠标按钮时触发;
案例:多行文本框输入字符计算。
<style>
.text span{font-weight:bold;color:#f00;}
em{font-style:normal;}
b{color:#666;font-weight: normal;}
</style>
<div class="text">
<b id="showcount">你还可以输入</b>
<span id="totalbox"><em id="count">10</em>/10</span>
</div>
<textarea name="" id="text" cols="70" rows="4"></textarea>
<script>
var showcount=document.getElementById('showcount'),
totalbox=document.getElementById('totalbox'),
count=document.getElementById('count'),
text=document.getElementById('text'),
total=10;
//绑定键盘时间
document.οnkeyup=function(){
var len=text.value.length;
var allow=total-len;
var overflow=len-total;
if(allow<0){
showcount.innerHTML='你已超出'+overflow;
totalbox.innerHTML='';
}else{
showcount.innerHTML='你还可以输入';
totalbox.innerHTML='<em id="count">'+allow+'</em>/10';
}
}
</script>
onresize:当调整浏览器窗口的大小时触发;
onscroll:拖动滚动条滚动时触发。
案例:判断浏览器窗口和滚动发生变化。
<style>
.box{width:200px;height:200px;background:#f00;overflow:auto;}
</style>
<div class="box" id="box">
<p>拖动</p>
<p>拖动</p>
<p>拖动</p>
<p>拖动</p>
<p>拖动</p>
</div>
<script>
// 浏览器窗口尺寸发生改变时
window.οnresize=function(){
console.log("我的尺寸被改变了");
}
// 拖动滚动条
window.οnscrοll=function(){
console.log("我被拖动了");
}
box.οnscrοll=function(){
console.log("我是DIV的滚动条");
}
</script>
案例:按钮的交互变化。
<style>
#btn{padding: 5px 30px; display: inline-block; color:#fff; border-radius: 5px;}
.lock{background: #f0f;}
.unlock{background: #f00;}
</style>
<div class="lock" id="btn">锁定</div>
<script>
// 获取按钮
var btn=document.getElementById("btn");
function clickBtn(){
alert("我是按钮");
}
// 点击按钮调用clickBtn这个函数
btn.οnclick=clickBtn;
// 给按钮绑定事件,this是对该DOM元素的引用
btn.οnclick=function(){
// 判断如果按钮是锁定,则显示为解锁,变为灰色,否则显示为锁定,变为蓝色
// 方法一 用类去判断
if(this.className=="lock"){
this.className="unlock";
this.innerHTML="解锁";
}else{
this.className="lock";
this.innerHTML="锁定";
}
// 方法二 用innerHTML中的的内容去判断
/*
if(this.innerHTML=="锁定"){
this.className="unlock";
this.innerHTML="解锁";
}else{
this.className="lock";
this.innerHTML="锁定";
}
*/
}
</script>
5、键盘事件与 keyCode 属性
onkeydown:在用户按下一个键盘按键时发生(按下键盘事件);
onkeypress:在键盘按键被按下并释放一个键时发生;
onkeyup:在键盘按键被松开时发生;
keyCode:返回 onkeydown、onkeypress 或 onkeyup 事件触发的键的值的字符代码,或者的键的代码。
说明:event 代表事件的状态,如触发 event 对象的元素、鼠标的位置及状态等。
6、关于 this 指向
在事件触发的函数中,this 是对该 DOM 对象的引用。
window.onload 页面加载完成后触发的事件。
<script>
window.οnlοad=function(){
var box=document.getElementById('btn');
var clicked=function(){
alert('window是一个全局对象');
}
btn.οnclick=clicked;
}
</script>
<button id='btn'>我是一个按钮</button>
七、BOM基础
window对象、全局对象、window对象的方法 window.alert()、window.confirm()、window.prompt()、window.open()、window.close()。
1、window对象
window 是浏览器的一个实例,在浏览器中,window 对象有双重角色,它既是通过 JavaScript 访问浏览器窗口的一个接口,又是 ECMAScript 规定的 Global 对象。
1.1 全局对象
全局变量——脚本的任何一个地方都能调用的变量。
全局方法——脚本的任何一个地方都能调用的方法。
全局函数——window 声明 window.函数名 = function(){ } 。
所有的全局变量和全局方法都被归在 window 上。
1.2 window 对象的方法
1.2.1 window.alert(“content”)
1)功能:警告框,带有一段消息和一个确认按钮
2)返回值:点击确定按钮,alert() 返回 undefined
1.2.2 window.confirm(“message”)
1)功能:提示框,显示一个带有指定消息、取消按钮和确定按钮的提示框
2)返回值:如果用户点击确定按钮,confirm() 返回 true;
如果用户点击取消按钮,confirm() 返回 false。
<div id="box">
<span>iphone6s</span>
<input type="button" value="删除" id="btn" />
</div>
<script>
// 获取按钮,绑定事件
var btn = document.getElementById("btn"),
box = document.getElementById("box");
btn.onclick = function(){
// 弹出确认对话框
var result = window.confirm("您确定要删除吗?删除之后该信息\n将不可恢复!");
if(result){
box.style.display="none";
}
}
var age = 15;
function sayAge(){
alert('我' + age);
}
// 全局变量
window.username = "marry"; // var username="marry";
// 全局方法
window.sayName = function(){
alert("我是" + this.username);
}
// sayAge();
// window.sayName();
// 弹出输入框
var message = prompt("请输入您的星座","天蝎座");
console.log(message);
</script>
1.2.3 window.prompt(“text,defaultText”)
1)语法:window.prompt(“text,defaultText”)
2)参数说明:
text:在对话框中显示的纯文本(而不是HTML格式的文本)
defaultText:默认输入文本
3)返回值:如果用户点击提示框的取消按钮,则返回null;
如果用户点击确认按钮,则返回输入字段当前显示的文本。
注:\n 在 javascript 中实现文字换行。
1.2.4 window.open(pageURL,name,parameters)
1)语法:window.open(pageURL,name,parameters)
2)功能:打开一个新的浏览器窗口或查找一个已命名的窗口
3)参数说明:pageURL 子窗口路径,name 子窗口句柄( name 声明了新窗口的名称,方便后期通过 name 对子窗口进行引用),parameters 窗口参数(各参数用逗号分隔)
1.2.5 window.close( )
1)语法:window.close( )
2)功能:关闭浏览器窗口
<input type="button" value="退 出" id="quit" />
<script>
window.onload = function(){
// 打开子窗口,显示newwindow.html
window.open("newwindow.html","newwindow","width=400,height=200,left=0,top=0,toolbar=no,menubar=no,scrollbars=no,location=no,status=no");
var quit = document.getElementById("quit");
// 点击关闭当前窗口
quit.onclick = function(){
window.close("newwindow.html");
}
}
</script>
总结 window 对象的方法:
1、alert 警告框,点击确认返回 undefined;
2、confirm 提示框,点击确认返回 true,点击取消返回 false;
3、prompt 对话框,点击确认返回 文本框中输入的内容,点击取消返回 null;
4、window.open()、window.close()。
5、\n 在 JavaScript 中实现文字换行。
2、定时器
setTimeout() 延时器、clearTimeout() 清除延时器、setInterval() 间歇性调用
2.1 setTimeout 延时器
1)语法:setTimeout(code,millisec)
2)功能:在指定的毫秒数后调用函数或计算表达式
3)参数说明:code 调用的函数或要执行的 JavaScript 代码串,millisec 在执行代码前需等待的毫秒数。
4)说明:setTimeout() 只执行 code 一次。如果要多次调用,使用 setInterval() 或者让 code 自身再次调用 setTimeout()。
setTimeout() 返回一个 ID 值通过它取消超时调用。
2.2 clearTimeout 清除延时器
1)语法:clearTimeout(id_of_settimeout)
2)功能:取消 setTimeout() 方法设置的 timeout
3)参数说明:id_of_settimeout 由setTimeout() 返回的 ID 值,该值标识要取消的延迟执行代码块。
//setTimeout("alert('hello')",4000);
var fnCall = function(){
alert("world");
}
var timeout = setTimeout(function(){
alert("hello");
}, 1000)
// clearTimeout(timeout1);
//setTimeout(fnCall,5000);
2.3 setInterval 间歇调用
1)语法:setInterval(code,millisec)
2)功能:每隔指定的时间执行一次代码
3)参数说明:code 要调用的函数或要执行的代码串,millisec 周期性执行或调用 code 之间的时间间隔,以毫秒计。
注:JavaScript 是单线程语言,单线程所执行的代码必须按照顺序。
var intervalId = setInterval(function(){
alert("您好");
}, 1000)
// 10秒之后停止弹出对话框
setTimeout(function(){
clearInterval(intervalId);
}, 2000);
var num = 1, max = 10, timer = null;
// 每隔 1 秒针 num 递增一次,直到 num 的值大于等于 max 清除
timer = setInterval(function(){
console.log(num);
num++;
if(num >= max){
clearInterval(timer);
}
}, 1000);
// 使用超时调用实现
function inCreamentNum(){
console.log(num); // 1 2 3 10
num++;
if(num <= max){
setTimeout(inCreamentNum, 1000);
} else {
clearTimeout(timer);
}
}
timer = setTimeout(inCreamentNum, 1000);
3、location对象
location 对象提供了与当前窗口中加载文档有关的信息,还提供了一些导航的功能,它既是 window 对象的属性,也是 document 对象的属性。
3.1 location 对象的常用属性
3.1.1 location.href
1)语法:location.href
2)功能:返回当前加载页面的完整 URL
3)说明:location.href 与 location.location 等价
<div class="box">
请输入搜索关键字:
<input type="text" placeholder="请输入搜索关键字" id="key">
<input type="button" value="搜索" id="search">
</div>
<a href="#" id="go">跳转</a>
<script>
// 给按钮绑定事件
var search = document.getElementById("search");
search.οnclick=function(){
// 获取搜索关键字并对它进行编码
var key = encodeURIComponent(document.getElementById("key").value);
// 跳转到指定页面
location.href = 'index9.html?search_key=' + key;
}
var sea = "搜索"
document.getElementById("go").href='index.html?key=' + encodeURI(sea);
</script>
3.1.2 location.hash
1)语法:location.hash(瞄点链接)
2)功能:返回 URL 中的 hash( #号后跟零或多个字符 ),如果不包含则返回空字符串。
<style>
.box1{height:400px;background:#ccc;}
.box2{height:600px;background:#666;}
</style>
<div class="box1" id="top"></div>
<div class="box2"></div>
<input type="button" id="btn" value="返回顶部">
<script>
// console.log(location.href);
// console.log(location.hash);
var btn=document.getElementById("btn");
btn.οnclick=function(){
location.hash="#top";
}
console.log(location.pathname);
</script>
3.1.3 location.host
1)语法:location.host
2)功能:返回服务器名称和端口号(如果有)
3.1.4 location.hostname
1)语法:location.hostname
2)功能:返回不带端口号的服务器名称
3.1.5 location.pathname
5)语法:location.pathname
6)功能:返回 URL 中的目录或文件名
3.1.6 location.port
1)语法:location.port
2)功能:返回 URL 中指定的端口号,如果没有,返回空字符串
3.1.7 location.protocol
3)语法:location.protocol
4)功能:返回页面使用的协议
3.1.8 location.search
5)语法:location.search
6)功能:返回 URL 的查询字符串。这个字符串以问号开头。
<a href="index10.html">index10.html</a>
<p> 这是index9.html</p>
<script>
// 解析地址栏中的参数(查询字符串)
function getParam(){
// 获取参数信息
var url=location.search;
if(!url)return null;
// 将?号却掉
url=url.substr(1);
// 以&号为分隔符分割url地址
var params,param={},arr;
params=url.split("&");
// ["city_id=28","city_name=北京"]
//console.log(params);
// 遍历params这个数组
for(var i=0,len=params.length;i<len;i++){
arr=params[i].split("=");
// 将arr[0]作为param这个对象的属性,
// 将arr[1]作为param这个对象的属性值
param[arr[0]]=decodeURIComponent(arr[1]);
}
return param;
}
var params=getParam();
console.log(params);
</script>
3.2 location对象方法
改变浏览器位置的方法:location.href属性,location对象其他属性也可改变URL,location.hash,location.search.
3.2.1 location.replace()
1)语法:location.replace(url)
2)功能:重新定向 URL
3)说明:使用 location.replace 不会在历史记录中生成新纪录。
3.2.2 location.reload()
1)语法:location.reload()
2)功能:重新加载当前显示的页面。
3)说明:location.reload() 有可能从缓存中加载,location.reload(true) 从服务器重新加载。
<input type="button" value="刷新" id="reload">
<script>
/*
setTimeout(function(){
//location.href='index6.html';
//window.location='index6.html';
location.replace("index6.html");
},1000)
*/
document.getElementById("reload").οnclick=function(){
location.reload(true);
}
</script>
4、history对象
history 对象保存了用户在浏览器中访问页面的历史记录。
4.1 history.forward()
1)语法:history.forward()
2)功能:回到历史记录的下一步
3)说明:相当于使用了 history.go(1)
4.2 history.back()
1)语法:history.back()
2)功能:回到历史记录的上一步
3)说明:相当于使用了history.go(-1)
4.3 history.go(-n)
1)语法:history.go(-n)
2)功能:回到历史记录的前 n 步
3)语法:history.go(n)
4)功能:回到历史记录的后 n 步
<p> 这是index11.html</p>
<div><a href="index12.html">这是index12.html</a></div>
<p><input type="button" value="后退" id="btn"></p>
<p><input type="button" value="前进" id="btn2"></p>
<p><input type="button" value="前进2" id="btn3"></p>
<script>
var btn = document.getElementById("btn");
var btn2 = document.getElementById("btn2");
var btn3 = document.getElementById("btn3");
// 点击btn按钮时回到历史记录的上一步
btn.onclick = function() {
// history.back();
history.go(-2);
}
// 点击btn2按钮时回到历史记录的上一步
btn2.onclick = function() {
// history.forward();
history.go(1);
}
btn3.onclick = function() {
// history.forward();
history.go(2);
}
</script>
5、Screen 对象及其常用属性
5.1 Screen 对象
Screen 对象包含有关客户端显示屏幕的信息。
5.2 Screen 对象属性
1)screen.availWidth 返回可用的屏幕宽度(获取),screen.availHeight 返回可用的屏幕高度
2)window.innerWidth,window.innerHeight 获取窗口文档显示区的宽和高。
console.log("页面宽:"+screen.availWidth);
console.log("页面高:"+screen.availHeight);
console.log("pageWidth:"+window.innerWidth);
console.log("pageHeight:"+window.innerHeight);
6、Navigator 对象
UserAgent:用来识别浏览器名称、版本、引起以及操作系统等信息的内容。
//console.log(navigator.userAgent);
// 判断浏览器
function getBrowser(){
var explorer = navigator.userAgent,browser;
if(explorer.indexOf("MSIE")>-1){
browser = "IE";
} else if (explorer.indexOf("Chrome")>-1){
browser = "Chrome";
} else if (explorer.indexOf("Opera")>-1){
browser = "Opera";
} else if (explorer.indexOf("Safari")>-1){
browser = "Safari";
}
return browser;
}
var browser = getBrowser();
console.log("您当前使用的浏览器是:"+browser);
// 判断终端
function isPc(){
var userAgentInfo = navigator.userAgent,
Agents = ["Andriod","iPhone","symbianOS","windows phone","iPad","iPod"],
flag = true, i;
console.log(userAgentInfo);
for(i=0;i<Agents.length;i++){
if(userAgentInfo.indexOf(Agents[i])>-1){
flag = false;
break;
}
}
return flag;
}
var isPcs = isPc();
console.log(isPcs);
案例:验证码发送
<script>
window.οnlοad=function(){
var btn=document.getElementById("btn"),
times=10,
timer=null;
btn.οnclick=function(){
if(this.getAttribute("clicked")){
return false;
}
var _this = this;
timer = setInterval(function(){
times--;
if(times <= 0){
clearInterval(timer);
_this.value="发送验证码";
//_this.disabled=false;
_this.removeAttribute("clicked",false);
times=10;
} else {
_this.value=times+'秒后重试';
//_this.disabled=true;
_this.setAttribute("clicked",true);
}
}, 1000)
}
}
</script>