当前位置: 首页 > 编程日记 > 正文

我与前端之间不得不说的三天两夜之javaScript

前端基础之JavaScript

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是规范.

ECMAScript

尽管 ECMAScript 是一个重要的标准,但它并不是 JavaScript 唯一的部分,当然,也不是唯一被标准化的部分。实际上,一个完整的 JavaScript 实现是由以下 3 个不同部分组成的:

  • 核心(ECMAScript)
  • 文档对象模型(DOM) Document object model (整合js,css,html)
  • 浏览器对象模型(BOM) Broswer object model(整合js和浏览器)
  • Javascript 在开发中绝大多数情况是基于对象的.也是面向对象的.

简单地说,ECMAScript 描述了以下内容:

  • 语法
  • 类型
  • 语句
  • 关键字
  • 保留字
  • 运算符
  • 对象 (封装 继承 多态) 基于对象的语言.使用对象.

二 JavaScript的基础

2.1 JS的引入方式

1 直接编写<script>alert('hello yuan')</script>
2 导入文件<script src="hello.js"></script>

2.2 JS的变量、常量和标识符

2.2.1 JS的变量

x=5
y=6
z=x+y

在代数中,我们使用字母(比如 x)来保存值(比如 5)。通过上面的表达式 z=x+y,我们能够计算出 z 的值为 11。在 JavaScript 中,这些字母被称为变量。

那么如何在JS中定义使用变量呢?

1、声明变量时不用声明变量类型. 全都使用var关键字;

var a;
a=3;

2、一行可以声明多个变量.并且可以是不同类型

var name="yuan", age=20, job="lecturer";

3、声明变量时 可以不用var. 如果不用var 那么它是全局变量

4、变量命名,首字符只能是字母,下划线,$美元符 三选一,余下的字符可以是下划线、美元符号或任何字母或数字字符且区分大小写,x与X是两个变量

命名规范
Camel 标记法
首字母是小写的,接下来的字母都以大写字符开头。例如:
var myTestValue = 0, mySecondValue = "hi";
Pascal 标记法
首字母是大写的,接下来的字母都以大写字符开头。例如:
Var MyTestValue = 0, MySecondValue = "hi";
匈牙利类型标记法
在以 Pascal 标记法命名的变量前附加一个小写字母(或小写字母序列),说明该变量的类型。例如,i 表示整数,s 表示字符串,如下所示“
Var iMyTestValue = 0, sMySecondValue = "hi";

2.2.2 常量和标识符

常量直接在程序中出现的数据值

标识符:

  1. 由不以数字开头的字母、数字、下划线(_)、美元符号($)组成
  2. 常用于表示函数、变量等的名称
  3. 例如:_abc,$abc,abc,abc123是标识符,而1abc不是
  4. JavaScript语言中代表特定含义的词称为保留字,不允许程序再定义为标识符

2.3 JS的数据类型

 /*       number     -----  数值boolean    -----  布尔值string     -----  字符串undefined  -----  undefinednull       -----   null  *

2.3.1 数字类型(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个数字组成

16进制和8进制与2进制的换算:

2进制: 1111 0011 1101 0100   <-----> 16进制:0xF3D4 <-----> 10进制:62420
2进制: 1 111 001 111 010 100 <-----> 8进制:0171724

2.3.2 字符串类型(string)

是由Unicode字符、数字、标点符号组成的序列;字符串常量首尾由单引号或双引号括起;JavaScript中没有字符类型;常用特殊字符在字符串中的表达;
字符串中部分特殊字符必须加上右划线\;常用的转义字符 \n:换行 \':单引号 \":双引号 \\:右划线

2.3.3 布尔类型(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;}

2.3.4 Null & Undefined类型

Undefined类型

Undefined 类型只有一个值,即 undefined。当声明的变量未初始化时,该变量的默认值是 undefined。

当函数无明确返回值时,返回的也是值 "undefined";

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title><script>var abc;   // 1 只声明未赋值,得到undefined   2 函数没有return值
        alert(abc);alert(typeof abc)</script>
</head>
<body></body>
</html>

输出结果:

 

Null类型

另一种只有一个值的类型是 Null,它只有一个专用值 null,即它的字面量。值 undefined 实际上是从值 null 派生来的,因此 ECMAScript 把它们定义为相等的。

尽管这两个值相等,但它们的含义不同。undefined 是声明了变量但未对其初始化时赋予该变量的值,null 则用于表示尚未存在的对象(在讨论 typeof 运算符时,简单地介绍过这一点)。如果函数或方法要返回的是对象,那么找不到该对象时,返回的通常是 null。

2.4 运算符

算术运算符:+   -    *    /     %       ++        -- 比较运算符:>   >=   <    <=    !=    ==    ===   !==逻辑运算符:&&   ||   !赋值运算符:=  +=   -=  *=   /=字符串运算符:+  连接,两边操作数有一个或两个是字符串就做连接运算

2.4.1 算术运算符

注意1: 自加自减

假如x=2,那么x++表达式执行后的值为3,x--表达式执行后的值为1;i++相当于i=i+1,i--相当于i=i-1;
递增和递减运算符可以放在变量前也可以放在变量后:--i

var i=10;
console.log(i++);
console.log(i);
console.log(++i);
console.log(i);
console.log(i--);
console.log(--i);

注意2: 单元运算符

1
2
3
- 除了可以表示减号还可以表示负号 例如:x=-y
+ 除了可以表示加法运算还可以用于字符串的连接 例如:"abc"+"def"="abcdef"

js不同于python,是一门弱类型语言

静态类型语言
一种在编译期间就确定数据类型的语言。大多数静态类型语言是通过要求在使用任一变量之前声明其数据类型来保证这一点的。Java 和 C 是静态类型语言。 
动态类型语言
一种在运行期间才去确定数据类型的语言,与静态类型相反。VBScript 和 Python 是动态类型的,因为它们确定一个变量的类型是在您第一次给它赋值的时候。 
强类型语言
一种总是强制类型定义的语言。Java 和 Python 是强制类型定义的。您有一个整数,如果不明确地进行转换 ,不能将把它当成一个字符串去应用。 
弱类型语言
一种类型可以被忽略的语言,与强类型相反。JS 是弱类型的。在JS中,可以将字符串 '12' 和整数 3 进行连接得到字符串'123',然后可以把它看成整数 123 ,所有这些都不需要任何的显示转换。 
所以说 Python 既是动态类型语言 (因为它不使用显示数据类型声明),又是强类型语言 (因为只要一个变量获得了一个数据类型,它实际上就一直是这个类型了)。
注意3: NaN
 
  var d="yuan";d=+d;alert(d);//NaN:属于Number类型的一个特殊值,当遇到将字符串转成数字无效时,就会得到一个NaN数据alert(typeof(d));//Number//NaN特点:var n=NaN;alert(n>3);alert(n<3);alert(n==3);alert(n==NaN);alert(n!=NaN);//NaN参与的所有的运算都是false,除了!=

2.4.2 比较运算符

>   >=   <    <=    !=    ==    ===   !==
用于控制语句时:
       if (2>1){       //  3  0  false null undefined []console.log("条件成立!")}
等号和非等号的同类运算符是全等号和非全等号。这两个运算符所做的与等号和非等号相同,只是它们在检查相等性前,不执行类型转换。
console.log(2==2);
console.log(2=="2");
console.log(2==="2");
console.log(2!=="2");
注意1:
var bResult = "Blue" < "alpha";
alert(bResult); //输出 true  
在上面的例子中,字符串 "Blue" 小于 "alpha",因为字母 B 的字符代码是 66,字母 a 的字符代码是 97。比较数字和字符串另一种棘手的状况发生在比较两个字符串形式的数字时,比如:var bResult = "25" < "3";
alert(bResult); //输出 "true"
上面这段代码比较的是字符串 "25" 和 "3"。两个运算数都是字符串,所以比较的是它们的字符代码("2" 的字符代码是 50,"3" 的字符代码是 51)。不过,如果把某个运算数该为数字,那么结果就有趣了:var bResult = "25" < 3;
alert(bResult); //输出 "false"这里,字符串 "25" 将被转换成数字 25,然后与数字 3 进行比较,结果不出所料。总结:比较运算符两侧如果一个是数字类型,一个是其他类型,会将其类型转换成数字类型.
比较运算符两侧如果都是字符串类型,比较的是最高位的asc码,如果最高位相等,继续取第二位比较.
注意2:
等性运算符:执行类型转换的规则如下:如果一个运算数是 Boolean 值,在检查相等性之前,把它转换成数字值。false 转换成 0,true 为 1。 
如果一个运算数是字符串,另一个是数字,在检查相等性之前,要尝试把字符串转换成数字。 
如果一个运算数是对象,另一个是字符串,在检查相等性之前,要尝试把对象转换成字符串。 
如果一个运算数是对象,另一个是数字,在检查相等性之前,要尝试把对象转换成数字。 
在比较时,该运算符还遵守下列规则:值 null 和 undefined 相等。 
在检查相等性时,不能把 null 和 undefined 转换成其他值。 
如果某个运算数是 NaN,等号将返回 false,非等号将返回 true。 
如果两个运算数都是对象,那么比较的是它们的引用值。如果两个运算数指向同一对象,那么等号返回 true,否则两个运算数不等。 

2.4.3 逻辑运算符

if (2>1 && [1,2]){console.log("条件与")
}// 思考返回内容?
console.log(1 && 3);
console.log(0 && 3);
console.log(0 || 3);
console.log(2 || 3);

2.5 流程控制

  • 顺序结构(从上向下顺序执行)
  • 分支结构
  • 循环结构

2.5.1 顺序结构

    <script>console.log(“星期一”);console.log(“星期二”);console.log(“星期三”);</script>

2.5.1 分支结构

if-else结构:
 
if (表达式){语句1;......} else{语句2;.....}

功能说明:如果表达式的值为true则执行语句1,否则执行语句2

示例:

var x= (new Date()).getDay();//获取今天的星期值,0为星期天var y;if ( (x==6) || (x==0) ) {y="周末";}else{y="工作日";}console.log(y);/*等价于y="工作日";if ( (x==6) || (x==0) ) {y="周末";}console.log(y);  */
if-elif-else结构:
if (表达式1) {语句1;
}else if (表达式2){语句2;
}else if (表达式3){语句3;
} else{语句4;
}
示例:
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title><script>var score=window.prompt("您的分数:");if (score>90){ret="优秀";}else if (score>80){ret="良好";}else if (score>60){ret="及格";}else {ret="不及格";}alert(ret);</script>
</head>
<body></body>
</html>

输出结果:
switch-case结构
switch基本格式
switch (表达式) {case 值1:语句1;break;case 值2:语句2;break;case 值3:语句3;break;default:语句4;
}

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="未定义";
示例:
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title><script>var score=2;                               #定义一个变量赋值switch (score){                            #把这个变量当条件传过去case 1:alert("星期一"); break;         #如果是1就打印星期一,注意一定要在哪里结束一定要加上breakcase 2:alert("星期二"); break;         #否则程序会一直向下执行,直到breakcase 3:alert("星期三"); break;case 4:alert("星期四"); break;case 5:alert("星期五"); break;case 6:alert("星期六"); break;case 7:alert("星期七"); break;default: alert("未定义")               #default 如果没有出现以上条件则输出default里面的内容     }</script>
</head>
<body>
</body>
</html>

输出结果:
switch比else if结构更加简洁清晰,使程序可读性更强,效率更高。

2.5.2 循环结构


                      循环语句流程图
 
for循环:
语法规则:for(初始表达式;条件表达式;自增或自减){执行语句……}

功能说明:实现条件循环,当条件成立时,执行语句1,否则跳出循环体

for循环的另一种形式:

for( 变量 in 数组或对象){执行语句……}
示例:
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title><script>for (var i=0;i<100;i++){                     #跟c++里的循环类似console.log(i)}</script>
</head>
<body>
</body>
</html>
输出结果:打印从0到99
也可以做到像python一样的遍历循环
示例:
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title><script>var arr=[11,44,"hello",true];          #定义一个数组for(var i=0;i<arr.length;i++){        #通过for循环来取得数组的索引号console.log(arr[i])               #然后再通过索引号来得到具体的值}</script>
</head>
<body>
</body>
</html>
输出结果:
在来一个示例:可以清楚的看到for循环去数组的值是先取索引号再取值
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title><script>var arr=[11,44,"hello",true];for(var i in arr){console.log(i);                 #先打印索引号console.log(arr[i])             #在打印索引号对应的值}</script>
</head>
<body>
</body>
</html>
输出结果:
while循环:
语法规则:while (条件){语句1;...
}
功能说明:运行功能和for类似,当条件成立循环执行语句花括号{}内的语句,否则跳出循环;同样支持continue与break语句。
示例:
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title><script>var count=0;                       #定义一个变量赋值为0while (count<100){                 #while条件console.log(count);            #打印count的值count++;                       #count自加1}</script>
</head>
<body>
</body>
</html>
输出结果:
 

2.5.3 异常处理

try {//这段代码从上往下运行,其中任何一个语句抛出异常该代码块就结束运行
}
catch (e) {// 如果try代码块中抛出了异常,catch代码块中的代码就会被执行。//e是一个局部变量,用来指向Error对象或者其他抛出的对象
}
finally {//无论try中代码是否有异常抛出(甚至是try代码块中有return语句),finally代码块中始终会被执行。
}
注:主动抛出异常 throw Error('xxxx')

三 JavaScript的对象

简介:

在JavaScript中除了null和undefined以外其他的数据类型都被定义成了对象,也可以用创建对象的方法定义变量,String、Math、Array、Date、RegExp都是JavaScript中重要的内置对象,在JavaScript程序大多数功能都是基于对象实现的。

<script language="javascript">
var aa=Number.MAX_VALUE; 
//利用数字对象获取可表示最大数
var bb=new String("hello JavaScript"); 
//创建字符串对象
var cc=new Date();
//创建日期对象
var dd=new Array("星期一","星期二","星期三","星期四"); 
//数组对象
</script>

3.1 String对象

字符串对象创建

字符串创建(两种方式)
① 变量 = “字符串”
② 字串对象名称 = new String (字符串)
var str1="hello world";
var str1= new String("hello word");
 

字符串对象的属性和函数

       x.length         ----获取字符串的长度x.toLowerCase()        ----转为小写x.toUpperCase()        ----转为大写x.trim()               ----去除字符串两边空格       ----字符串查询方法x.charAt(index)         ----str1.charAt(index);----获取指定位置字符,其中index为要获取的字符索引x.indexOf(findstr,index)----查询字符串位置
x.lastIndexOf(findstr)  x.match(regexp)         ----match返回匹配字符串的数组,如果没有匹配则返回null
x.search(regexp)        ----search返回匹配字符串的首字符位置索引示例:var str1="welcome to the world of JS!";var str2=str1.match("world");var str3=str1.search("world");alert(str2[0]);  // 结果为"world"alert(str3);     // 结果为15----子字符串处理方法x.substr(start, length) ----start表示开始位置,length表示截取长度
x.substring(start, end) ----end是结束位置x.slice(start, end)     ----切片操作字符串示例:var str1="abcdefgh";var str2=str1.slice(2,4);var str3=str1.slice(4);var str4=str1.slice(2,-1);var str5=str1.slice(-3,-1);alert(str2); //结果为"cd"alert(str3); //结果为"efgh"alert(str4); //结果为"cdefg"alert(str5); //结果为"fg"x.replace(findstr,tostr) ----    字符串替换x.split();                 ----分割字符串var str1="一,二,三,四,五,六,日"; var strArray=str1.split(",");alert(strArray[1]);//结果为"二"x.concat(addstr)         ----    拼接字符串

3.2 Array对象

3.2.1 数组创建

创建数组的三种方式:
创建方式1:
var arrname = [元素0,元素1,….];          // var arr=[1,2,3];创建方式2:
var arrname = new Array(元素0,元素1,….); // var test=new Array(100,"a",true);创建方式3:
var arrname = new Array(长度); //  初始化数组对象:var cnweek=new Array(7);cnweek[0]="星期日";cnweek[1]="星期一";...cnweek[6]="星期六";
创建二维数组:
var cnweek=new Array(7);
for (var i=0;i<=6;i++){cnweek[i]=new Array(2);
}
cnweek[0][0]="星期日";
cnweek[0][1]="Sunday";
cnweek[1][0]="星期一";
cnweek[1][1]="Monday";
...
cnweek[6][0]="星期六";
cnweek[6][1]="Saturday";

3.2.2 数组对象的属性和方法

join方法:
x.join(bystr)       ----将数组元素拼接成字符串var arr1=[1, 2, 3, 4, 5, 6, 7];var str1=arr1.join("-");alert(str1);  //结果为"1-2-3-4-5-6-7" 
concat方法:
x.concat(value,...)    ---- var a = [1,2,3];var b=a.concat(4,5) ;alert(a.toString());  //返回结果为1,2,3            alert(b.toString());  //返回结果为1,2,3,4,5
数组排序-reverse sort:
//x.reverse()
//x.sort()var arr1=[32, 12, 111, 444];
//var arr1=["a","d","f","c"];arr1.reverse(); //颠倒数组元素
alert(arr1.toString());
//结果为444,111,12,32arr1.sort();    //排序数组元素
alert(arr1.toString());
//结果为111,12,32,444//------------------------------
arr=[1,5,2,100];//arr.sort();
//alert(arr);
//如果就想按着数字比较呢?function intSort(a,b){if (a>b){return 1;//-1}else if(a<b){return -1;//1}else {return 0}
}arr.sort(intSort);alert(arr);function IntSort(a,b){return a-b;
}
数组切片操作:
//x.slice(start, end)
//
//使用注解
//
//x代表数组对象
//start表示开始位置索引
//end是结束位置下一数组元素索引编号
//第一个数组元素索引为0
//start、end可为负数,-1代表最后一个数组元素
//end省略则相当于从start位置截取以后所有数组元素var arr1=['a','b','c','d','e','f','g','h'];
var arr2=arr1.slice(2,4);
var arr3=arr1.slice(4);
var arr4=arr1.slice(2,-1);alert(arr2.toString());
//结果为"c,d" 
alert(arr3.toString());
//结果为"e,f,g,h"
alert(arr4.toString());
//结果为"c,d,e,f,g"
删除子数组:
//x. splice(start, deleteCount, value, ...)//使用注解//x代表数组对象
//splice的主要用途是对数组指定位置进行删除和插入
//start表示开始位置索引
//deleteCount删除数组元素的个数
//value表示在删除位置插入的数组元素
//value参数可以省略       var a = [1,2,3,4,5,6,7,8];
a.splice(1,2);alert(a.toString());//a变为 [1,4,5,6,7,8]a.splice(1,1);alert(a.toString());//a变为[1,5,6,7,8]a.splice(1,0,2,3);alert(a.toString());//a变为[1,2,3,5,6,7,8]
数组的push和pop:
//push pop这两个方法模拟的是一个栈操作//x.push(value, ...)  压栈
//x.pop()             弹栈      
//使用注解
//
//x代表数组对象
//value可以为字符串、数字、数组等任何值
//push是将value值添加到数组x的结尾
//pop是将数组x的最后一个元素删除var arr1=[1,2,3];
arr1.push(4,5);
alert(arr1);
//结果为"1,2,3,4,5"
arr1.push([6,7]);
alert(arr1)
//结果为"1,2,3,4,5,6,7"
arr1.pop();
alert(arr1);
//结果为"1,2,3,4,5"
数组的shift和unshift:
//x.unshift(value,...)
//x.shift()
//使用注解//x代表数组对象
//value可以为字符串、数字、数组等任何值
//unshift是将value值插入到数组x的开始
//shift是将数组x的第一个元素删除var arr1=[1,2,3];
arr1.unshift(4,5);
alert(arr1);  //结果为"4,5,1,2,3"arr1. unshift([6,7]);
alert(arr1);  //结果为"6,7,4,5,1,2,3"arr1.shift();
alert(arr1);  //结果为"4,5,1,2,3"
总结js的数组特性:
//  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);//8arr5[10] = "hahaha";alert(arr5.length); //11alert(arr5[9]);// undefined */

3.3 Date对象

3.3.1 创建Date对象

//方法1:不指定参数
var nowd1=new Date();
alert(nowd1.toLocaleString( ));
//方法2:参数为日期字符串
var nowd2=new Date("2004/3/20 11:12");
alert(nowd2.toLocaleString( ));
var nowd3=new Date("04/03/20 11:12");
alert(nowd3.toLocaleString( ));
//方法3:参数为毫秒数
var nowd3=new Date(5000);
alert(nowd3.toLocaleString( ));
alert(nowd3.toUTCString());//方法4:参数为年月日小时分钟秒毫秒
var nowd4=new Date(2004,2,20,11,12,0,300);
alert(nowd4.toLocaleString( ));//毫秒并不直接显示

Date对象的方法—获取日期和时间

获取日期和时间
getDate()                 获取日
getDay ()                 获取星期
getMonth ()               获取月(0-11)
getFullYear ()            获取完整年份
getYear ()                获取年
getHours ()               获取小时
getMinutes ()             获取分钟
getSeconds ()             获取秒
getMilliseconds ()        获取毫秒
getTime ()                返回累计毫秒数(从1970/1/1午夜)
实例练习:
function getCurrentDate(){//1. 创建Date对象var date = new Date(); //没有填入任何参数那么就是当前时间//2. 获得当前年份var year = date.getFullYear();//3. 获得当前月份 js中月份是从0到11.var month = date.getMonth()+1;//4. 获得当前日var day = date.getDate();//5. 获得当前小时var hour = date.getHours();//6. 获得当前分钟var min = date.getMinutes();//7. 获得当前秒var sec = date.getSeconds();//8. 获得当前星期var week = date.getDay(); //没有getWeek// 2014年06月18日 15:40:30 星期三return year+"年"+changeNum(month)+"月"+day+"日 "+hour+":"+min+":"+sec+" "+parseWeek(week);}alert(getCurrentDate());//解决 自动补齐成两位数字的方法function changeNum(num){if(num < 10){return "0"+num;}else{return num;}}
//将数字 0~6 转换成 星期日到星期六function parseWeek(week){var arr = ["星期日","星期一","星期二","星期三","星期四","星期五","星期六"];//             0      1      2      3 .............return arr[week];
}

Date对象的方法—设置日期和时间

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title><script>var date=new Date();console.log(date.toLocaleString());           #将日期对象转换为本地日期格式console.log(typeof date.toLocaleString());     #打印这个本地日期的格式是字符串格式var date_detail=new Date();                console.log(date_detail);                          console.log(date_detail.getDate());              #日期console.log(date_detail.getDay());              #console.log(date_detail.getFullYear());         #年console.log(date_detail.getMonth());            #月份  注意这里月份是从0开始计数console.log(date_detail.getTime());             #时间console.log(date_detail.getHours());            #小时console.log(date_detail.getSeconds());          #秒</script>
</head>
<body></body>
</html>
输出结果:
获取时间的例子:
示例:
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title><script>function CurrentTime() {var date=new Date();var year=date.getFullYear();var month=date.getMonth();var day=date.getDate();var hours=date.getHours();var minutes=date.getMinutes();var week=date.getDay();  // 1var arr=["星期日","星期一","星期二","星期三","星期四","星期五","星期六"];s=year+"-"+(month+1)+"-"+day+" "+hours+":"+minutes+" "+arr[week];return s}//        function changemonth(num) {                 #如果想更标准一点就需要在月份上加上0可以加个函数来实现把这个函数的名字
//            if (num<10){
//                return "0"+num
//
//            }
//            else {
//                return num
//            }
//        }console.log(CurrentTime())</script>
</head>
<body></body>
</html>

Date对象的方法—日期和时间的转换

日期和时间的转换:getTimezoneOffset():8个时区×15度×4分/度=480;
返回本地时间与GMT的时间差,以分钟为单位
toUTCString()
返回国际标准时间字符串
toLocalString()
返回本地格式时间字符串
Date.parse(x)
返回累计毫秒数(从1970/1/1午夜到本地时间)
Date.UTC(x)
返回累计毫秒数(从1970/1/1午夜到国际时间)

3.4 Math对象

//该对象中的属性方法 和数学有关.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)    返回角的正切。//方法练习://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));// 2alert(Math.min(1,2));// 1 *///-------------pow--------------------------------alert(Math.pow(2,4));// pow 计算参数1 的参数2 次方.

3.5Function 对象(重点)

3.5.1 函数的定义

function 函数名 (参数){
<br>    函数体;return 返回值;
}

功能说明:

可以使用变量、常量或表达式作为函数调用的参数
函数由关键字function定义
函数名的定义规则与标识符一致,大小写是敏感的
返回值必须使用return
Function 类可以表示开发者定义的任何函数。

用 Function 类直接创建函数的语法如下:

var 函数名 = new Function("参数1","参数n","function_body");

虽然由于字符串的关系,第二种形式写起来有些困难,但有助于理解函数只不过是一种引用类型,它们的行为与用 Function 类明确创建的函数行为是相同的。

示例:

function func1(name){alert('hello'+name);return 8
}ret=func1("yuan");alert(ret);var func2=new Function("name","alert(\"hello\"+name);")
func2("egon")
注意:js的函数加载执行与python不同,它是整体加载完才会执行,所以执行函数放在函数声明上面或下面都可以:
示例:
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title><script>var ret=foo();function foo() {console.log("OK")}</script>
</head>
<body></body>
</html>
输出结果:

3.5.2 Function 对象的属性

如前所述,函数属于引用类型,所以它们也有属性和方法。
比如,ECMAScript 定义的属性 length 声明了函数期望的参数个数。
alert(func1.length)

3.5.3 Function 的调用

function func1(a,b){alert(a+b);
}func1(1,2);  //3func1(1,2,3);//3func1(1);    //NaNfunc1();     //NaN//只要函数名写对即可,参数怎么填都不报错.-------------------面试题-----------
#考对变量的赋值function a(a,b){          alert(a+b);
}var a=1;                 #a已经赋值上1 了var b=2;a(a,b)                  #这里就会报错了

3.5.4 函数的内置对象arguments

        function add() {var sum = 0;for (var i = 0; i < arguments.length; i++) {                     #arguments可以用来接收动态参数不管有多少值都可以接收console.log(arguments[i]);sum += arguments[i];}return sum}var ret=add(2,5,7,8,9);console.log(ret);
输出结果:

3.5.4 匿名函数

示例:
不用定义一个函数名直接可以使用,匿名函数使用完之后可以在内存空间中删除,不占空间
//         匿名函数(function (x) {alert("OK")})(3);

BOM对象

window对象

所有浏览器都支持 window 对象。
概念上讲.一个html文档对应一个window对象.
功能上讲: 控制浏览器窗口的.
使用上讲: window对象不需要创建对象,直接使用即可.

Window 对象方法

alert()            显示带有一段消息和一个确认按钮的警告框。
confirm()          显示带有一段消息以及确认按钮和取消按钮的对话框。
prompt()           显示可提示用户输入的对话框。open()             打开一个新的浏览器窗口或查找一个已命名的窗口。
close()            关闭浏览器窗口。setInterval()      按照指定的周期(以毫秒计)来调用函数或计算表达式。
clearInterval()    取消由 setInterval() 设置的 timeout。
setTimeout()       在指定的毫秒数后调用函数或计算表达式。
clearTimeout()     取消由 setTimeout() 方法设置的 timeout。
scrollTo()         把内容滚动到指定的坐标。

方法使用

   //----------alert confirm prompt----------------------------//alert('aaa');/* 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();

定时器

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title><script>//  定时器function foo() {console.log(123)}var ID=setInterval(foo,1000);                #setInterval来添加一个定时器</script>
</head>
<body>
</body>
</html>
输出输出结果:可以看到有个计数的标识

定时器实例
// 跟date时间相结合的实例<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title><script>//  定时器实例function CurrentTime() {var date=new Date();var year=date.getFullYear();var month=date.getMonth();var day=date.getDate();var hours=date.getHours();var minutes=date.getMinutes();var week=date.getDay();  // 1var arr=["星期日","星期一","星期二","星期三","星期四","星期五","星期六"]s=year+"-"+changemonth(month+1)+"-"+day+" "+hours+":"+minutes+" "+arr[week]return s}function changemonth(num) {if (num<10){return "0"+num}else {return num}}// 上面先获取时间function foo() {var date=new Date();var date=date.toLocaleString();          // 可以获取本地时间// console.log(date)var ele=document.getElementById("timer");            // document指整个html的文件通过getElenmentByI来找到下面<body>标签里面内容的一个idele.value=date;                                     然后把值放到id内容的value里面}var ID;function begin() {if (ID==undefined){foo();ID=setInterval(foo,1000);var ele=document.getElementById("show");          // document指整个html的文件通过getElenmentByI来找到下面<body>标签里面内容的一个idele.disabled="disabled"}}function end() {clearInterval(ID);                                    //关闭定时器ID=0;                                                }</script>
</head>
<body><input type="text" id="timer">                             // input输入框
<button onclick="begin()" id="show">show</button>           // button标签是没有任何事件的标签 onclick 自定义事件
<button onclick="end()" >end</button>                      </body>
</html>
setTimeout() 和clearTimeout()
示例:
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title><script>function foo() {console.log(123)}var ID=setTimeout(foo,1000);           #在指定的毫秒数后调用函数或计算表达式//        clearTimeout(ID)                    #取消由 setTimeout() 方法设置的 timeout。</script>
</head>
<body>
输出结果:过一秒在出现并且不会再进行计时了

DOM对象

什么是HTML DOM

  • HTML Document Object Model(文档对象模型)
  • HTML DOM 定义了访问和操作HTML文档的标准方法
  • HTML DOM 把 HTML 文档呈现为带有元素、属性和文本的树结构(节点树)

DOM

画dom树是为了展示文档中各个对象之间的关系,用于对象的导航。

DOM节点

节点类型

HTML 文档中的每个成分都是一个节点。

DOM 是这样规定的:
整个文档是一个文档节点
每个 HTML 标签是一个元素节点
包含在 HTML 元素中的文本是文本节点
每一个 HTML 属性是一个属性节点

其中,document与element节点是重点。

节点关系

节点树中的节点彼此拥有层级关系。
父(parent),子(child)和同胞(sibling)等术语用于描述这些关系。父节点拥有子节点。同级的子节点被称为同胞(兄弟或姐妹)。

  • 在节点树中,顶端节点被称为根(root)
  • 每个节点都有父节点、除了根(它没有父节点)
  • 一个节点可拥有任意数量的子
  • 同胞是拥有相同父节点的节点

下面的图片展示了节点树的一部分,以及节点之间的关系:


访问 HTML 元素(节点),访问 HTML 元素等同于访问节点,我们能够以不同的方式来访问 HTML 元素。

节点查找

直接查找节点
document.getElementById(“idname”)
document.getElementsByTagName(“tagname”)
document.getElementsByName(“name”)
document.getElementsByClassName(“name”)
示例:
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<p id="d1">p</p>
<script>// 直接定位var ele=document.getElementById("d1");  // 标签对象</script>
</body>
</html>   
输出结果:输入ele变量直接可以看到id为d1的标签对象
示例:
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<div class="c1">div</div>
<p id="d1">p</p>
<div class="c2"><div class="c3"><p class="p1">P1</p></div><p class="p2">P2</p><p class="p2">P2</p><p class="p2">P2</p><p class="p2">P2</p><p class="p2">P2</p>
</div>
<script>// 直接定位
//        var ele=document.getElementById("d1");  // 标签对象var ele_class=document.getElementsByClassName("c1"); //  数组对象 [ele,ele,....]var ele_p=document.getElementsByTagName("p");
//
//        // 导航查找(通过某个标签定位某些标签)
//var ele_c3=document.getElementsByClassName("c3")[0];</script>
</body>
</html>'''
输出结果:
ele_class                    // 可以看到是一个数组
[div.c1]                
ele_p                       // 直接定位p标签 #d1显示为id为d1 也是一个数组
(7) [p#d1, p.p1, p.p2, p.p2, p.p2, p.p2, p.p2, d1: p#d1]
ele_c3                      //取了数组的第一个就是class为c3及下面的子标签
<div class=​"c3">​…​</div>​<p class=​"p1">​P1​</p>​</div>​    '''

注意:设计到寻找元素,注意<script>标签的位置!

导航节点属性

'''parentElement           // 父节点标签元素children                // 所有子标签firstElementChild       // 第一个子标签元素lastElementChild        // 最后一个子标签元素nextElementtSibling     // 下一个兄弟标签元素previousElementSibling  // 上一个兄弟标签元素'''
注意,js中没有办法找到所有的兄弟标签!

节点操作

创建节点:
createElement(标签名) :创建一个指定名称的元素。
例:var tag=document.createElement(“input")
tag.setAttribute('type','text');
添加节点:
追加一个子节点(作为最后的子节点)
somenode.appendChild(newnode)把增加的节点放到某个节点的前边
somenode.insertBefore(newnode,某个节点);
删除节点:
removeChild():获得要删除的元素,通过父元素调用删除
替换节点:
somenode.replaceChild(newnode, 某个节点);
节点属性操作:

1、获取文本节点的值:innerText innerHTML

2、attribute操作

    elementNode.setAttribute(name,value)    elementNode.getAttribute(属性名)        <-------------->elementNode.属性名(DHTML)elementNode.removeAttribute(“属性名”);
其实我们一般用的是简化的操作接下来我用attribute来做一个对比
示例:
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title><style>.hide{display: none;}</style>
</head>
<body><div class="c1" id="d1">DIV</div><script>// 文本属性:var ele=document.getElementsByClassName("c1")[0];// ele.id="d2";// 取属性值console.log(ele.getAttribute("id"));            //上面是完整的操作console.log(ele.id);                            //下面是简化的操作
</script>
</body>
</html>
输出结果:可以看到效果是一样的
赋值操作
    ele.setAttribute("id","d2")              // 上面是完成的操作ele.id="d2";                            //下面是简化操作
输出结果:可以看到id值改变了为id为d2
3、value获取当前选中的value值
1.input
2.select (selectedIndex)
3.textarea
4、innerHTML 给节点添加html代码:
该方法不是w3c的标准,但是主流浏览器支持
tag.innerHTML = “<p>要显示内容</p>”;
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><div class="c1">DIV</div><script>// 文本属性:var ele=document.getElementsByClassName("c1")[0];// innerText 取值操作console.log(ele.innerText); // DIV// innerText 赋值操作ele.innerText="Egon";//用innerText接收一段代码是一段纯文本的文件浏览器不会做渲染// ele.innerText="<a href=''>click</a>";     </script>
</body>
</html>
输出结果:
 显示就是一个代码
innerHTML
示例:
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<div class="c1">DIV</div>
<script>// 文本属性:var ele=document.getElementsByClassName("c1")[0];
//============================================================// innerHTML 取值操作console.log(ele.innerHTML);              //也可以接收文本信息// innerHTML 赋值操作ele.innerHTML="<a href=''>click</a>";        //可以接收标签代码
</script>
</body>
</html>
输出结果:
总结:
    console.log(ele.innerText);console.log(ele.innerHTML);
当时文本信息时,用innerText和innerHTML都可以接收
当更改是标签信息的一段代码则可以用innerText
输出结果:
5、关于class的操作:
elementNode.className
elementNode.classList.add
elementNode.classList.remove
6、改变css样式:
<p id="p2">Hello world!</p>
document.getElementById("p2").style.color="blue";.style.fontSize=48px

DOM Event(事件)

事件类型

onclick        当用户点击某个对象时调用的事件句柄。
ondblclick     当用户双击某个对象时调用的事件句柄。onfocus        元素获得焦点。               练习:输入框
onblur         元素失去焦点。               应用场景:用于表单验证,用户离开某个输入框时,代表已经输入完了,我们可以对它进行验证.
onchange       域的内容被改变。             应用场景:通常用于表单元素,当元素内容被改变时触发.(三级联动)onkeydown      某个键盘按键被按下。          应用场景: 当用户在最后一个输入框按下回车按键时,表单提交.
onkeypress     某个键盘按键被按下并松开。
onkeyup        某个键盘按键被松开。onload         一张页面或一幅图像完成加载。onmousedown    鼠标按钮被按下。
onmousemove    鼠标被移动。
onmouseout     鼠标从某元素移开。
onmouseover    鼠标移到某元素之上。
onmouseleave   鼠标从元素离开onselect       文本被选中。
onsubmit       确认按钮被点击。

绑定事件方式

方式1:
示例:
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head><body><!--事件绑定方式1-->
<div><a onclick="foo(this)">DIV</a></div><div class="c1">DIV2</div><ul><li>111</li><li>222</li><li>333</li><li>444</li>
</ul><script>/*** Created by Administrator on 2017/9/26.*/function foo(self) {console.log(self);var ele=document.getElementsByTagName("div")[0];self.style.color="red";}
</script>
</body>
</html>
输出结果:当鼠标点击一下DIV就会触发一次事件
方式2:
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head><body><!--事件绑定方式1-->
<div><a onclick="foo(this)">DIV</a></div><div class="c1">DIV2</div><ul><li>111</li><li>222</li><li>333</li><li>444</li>
</ul><script>// 事件绑定方式2:   标签对象.on事件=function(){}
//var ele=document.getElementsByClassName("c1")[0];ele.onclick=function () {console.log(this); // this 代指: 当前触发时间的标签对象;this.style.fontSize="30px"};
</script>
</body>
</html>
ui li 事件
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head><body><!--事件绑定方式1-->
<div><a onclick="foo(this)">DIV</a></div><div class="c1">DIV2</div><ul><li>111</li><li>222</li><li>333</li><li>444</li>
</ul><script>//  ul  li 事件var eles_li=document.getElementsByTagName("li");var eles_li0=document.getElementsByTagName("li")[0];var eles_li1=document.getElementsByTagName("li")[1];var eles_li2=document.getElementsByTagName("li")[2];var eles_li3=document.getElementsByTagName("li")[3];eles_li0.onclick=function () {console.log(this)   //    this:<li>111</li>};eles_li1.onclick=function () {console.log(this)   //    this:<li>111</li>};eles_li2.onclick=function () {console.log(this)   //    this:<li>111</li>};eles_li3.onclick=function () {console.log(this)   //    this:<li>111</li>};
</script>
</body>
</html>
输出结果:当点击li标签时会触发事件,点击一次打印一次
改为for循环
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head><body><!--事件绑定方式1-->
<div><a onclick="foo(this)">DIV</a></div><div class="c1">DIV2</div><ul><li>111</li><li>222</li><li>333</li><li>444</li>
</ul><script>var eles_li=document.getElementsByTagName("li");
// 改为for 循环:for (var i=0;i<eles_li.length;i++){eles_li[i].onclick=function () {console.log(i); // i 为什么是4?console.log(this.innerText);
//             console.log(eles_li[i].innerText);}}
</script>
</body>
</html>
输出结果:4表示长度为4

事件介绍

1、onload:

onload 属性开发中 只给 body元素加.这个属性的触发 标志着 页面内容被加载完成.应用场景: 当有些事情我们希望页面加载完立刻执行,那么可以使用该事件属性.

<!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 fun() {var ele=document.getElementById("ppp");ele.onclick=function(){alert(123)};}</script>
</head>
<body onload="fun()"><p id="ppp">hello p</p></body>
</html>
2、onsubmit:
当表单在提交时触发. 该属性也只能给form元素使用.应用场景: 在表单提交前验证用户输入是否正确.如果验证失败.在该方法中我们应该阻止表单的提交.
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><form action="" id="submit"><p>姓名<input type="text" name="user" id="user"></p><p>年龄<input type="text" name="age" id="age"></p><input type="submit" >
</form>
<input type="text" id="test"><script>var ele_form=document.getElementById("submit");var ele_user=document.getElementById("user");var ele_age=document.getElementById("age");ele_form.onsubmit=function (event) {var username=ele_user.value;var age=ele_age.value;alert(username);alert(age);}
</script></body>
</html>
输出结果:用户输入的内容不管有用没用就都打包发过去了

解决这种现象的两种方法:
方式一:return false
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><form action="" id="submit"><p>姓名<input type="text" name="user" id="user"></p><p>年龄<input type="text" name="age" id="age"></p><input type="submit" >
</form>
<input type="text" id="test"><script>var ele_form=document.getElementById("submit");var ele_user=document.getElementById("user");var ele_age=document.getElementById("age");ele_form.onsubmit=function (event) {var username=ele_user.value;var age=ele_age.value;alert(username);alert(age);// 两种阻止默认事件发生的方式// 方式1return false                            //通过return false来阻止发送</script>
</body>
</html>    
方式二:
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<form action="" id="submit"><p>姓名<input type="text" name="user" id="user"></p><p>年龄<input type="text" name="age" id="age"></p><input type="submit" >
</form>
<input type="text" id="test"><script>var ele_form=document.getElementById("submit");var ele_user=document.getElementById("user");var ele_age=document.getElementById("age");ele_form.onsubmit=function (event) {         //形参接收var username=ele_user.value;var age=ele_age.value;alert(username);alert(age);// 方式2event.preventDefault()        //通过实参的方式}
</script>
</body>
</html>
输出结果:
 
还有一种事件:
可以在平常的生活中打开网页会出现回车就能提交内容,这也是通过操作系统捕捉到这一事件来进行操作的。
示例:
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><form action="" id="submit"><p>姓名<input type="text" name="user" id="user"></p><p>年龄<input type="text" name="age" id="age"></p><input type="submit" >
</form>
<input type="text" id="test">
<script>var ele=document.getElementById("test")ele.onkeydown=function (e) {console.log(e.keyCode);                     //通过keyCode来捕捉到用户按键的数字if (e.keyCode==13){                  //然后根据返回的数字来进行判断alert(666)}}
</script>
</body>
</html>    
输出结果:我回车一下,回车键是数字13这样就可以通过用户有没有按回车键来进行判断了

3、焦点
焦点就是光标,当光标出现需要做什么事情,当光标消息又需要做的事情。
示例:
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><input type="text" value="username" id="search">      //创建一个input表单,里面给它一个默认值,username<script>var ele=document.getElementById("search")         //拿到这个节点
//当光标出现在这个节点上里面,将里面的username赋上空ele.onfocus=function () {                       //焦点聚焦,函数this.value=""                               //this鼠标点击这个标签的值赋上空};
//光标离开,只留下输入的值,如果没输入值则又将username设置的默认值加上ele.onblur=function () {                      //离开焦点if(this.value.trim()==""){                //判断值是否为空 .trim去除空格不然会出现用户只输入空格,没输入值的现象this.value="username"                //在通过.value把username加上}}
</script>
</body>
</html>
输出结果:

4、事件传播:
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title><style>.c1{width: 200px;height: 200px;background-color: wheat;}.c2{width: 100px;height: 100px;background-color: royalblue;}</style>
</head>
<body>
<div class="c1"><div class="c2"></div>
</div><script>var ele1=document.getElementsByClassName("c1")[0];var ele2=document.getElementsByClassName("c2")[0];ele1.onclick=function () {alert(123)};ele2.onclick=function (event) {alert(456);}
</script>
</body>
</html>
输出结果:
解决办法:
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title><style>.c1{width: 200px;height: 200px;background-color: wheat;}.c2{width: 100px;height: 100px;background-color: royalblue;}</style>
</head>
<body>
<div class="c1"><div class="c2"></div>
</div><script>var ele1=document.getElementsByClassName("c1")[0];var ele2=document.getElementsByClassName("c2")[0];ele1.onclick=function () {alert(123)                         //给父标签添加事件};ele2.onclick=function (event) {alert(456);                        //给子标签添加事件event.stopPropagation() // 阻止事件传播阻止事件向外层div传播.}
</script>
</body>
</html>
输出结果:
5、模态对话框:
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title><style>.back{width: 100%;height: 2000px;border: 1px solid red;}.shade{position: fixed;left: 0;right: 0;top: 0;bottom: 0;background-color: darkgray;opacity: 0.5;}.model{position: fixed;top: 100px;left:40%;width: 300px;height: 200px;background-color: white;}.hide{display: none;}</style></head>
<body><div class="back"><button id="add">add</button></div>
<div class="shade hide"></div>
<div class="model hide"><form action=""><p>姓名<input type="text"></p><p>年龄<input type="text"></p><input type="button" id="btn" value="提交"><button id="del">del</button></form>
</div><script>var ele_add=document.getElementById("add");        var ele_del=document.getElementById("del");var ele_mdoel=document.getElementsByClassName("model")[0];      //拿到的是一个数组,通过index来取var ele_shade=document.getElementsByClassName("shade")[0];//ele_add节点添加ele_add.onclick=function () {ele_mdoel.classList.remove("hide");ele_shade.classList.remove("hide")};// 通过ele_del节点添加ele_del.onclick=function () {ele_mdoel.classList.add("hide");ele_shade.classList.add("hide")}</script>
</body>
</html>
输出结果:
“人的一生为什么要努力?有一句回答说得非常动人:“因为最痛苦的事,不是失败,是我本可以。”
是的,我们原本可以的!

<wiz_tmp_tag id="wiz-table-range-border" contenteditable="false" style="display: none;">



来自为知笔记(Wiz)



转载于:https://www.cnblogs.com/zcfx/p/7594387.html

相关文章:

难以置信!LSTM和GRU的解析从未如此清晰(动图+视频)

作者 | Michael Nguyen编译 | 蔡志兴、费棋编辑 | Jane出品 | AI科技大本营【导语】机器学习工程师 Michael Nguyen 在其博文中发布了关于 LSTM 和 GRU 的详细图解指南。博文中&#xff0c;他先介绍了 LSTM 和 GRU 的本质&#xff0c; 然后解释了让 LSTM 和 GRU 有良好表现的内…

php 开发restful api,用PHP创建RESTful API?

如果您的服务支持所有CRUD操作,则始终建议实现RESTful接口.这样做并不是很难.我已经概述了下面的一些基础知识.RESTful服务只是做了一些事情&#xff1a;>它使用HTTP请求方法进行CRUD操作的通信>它使用HTTP状态代码来传达响应状态,以及>它使用URI来定义您的资源(您正在…

MySQL服务器的配置教程

1、安装MySQL 这个应该很简单了&#xff0c;而且我觉得大家在安装方面也没什么太大问题&#xff0c;所以也就不多说了&#xff0c;下面我们来讲讲配置。 2、配置MySQL 注意&#xff0c;在Ubuntu下MySQL缺省是只允许本地访问的&#xff0c;如果你要其他机器也能够访问的话&am…

php开发我的世界插件,WorldEdit/开发与API

本页面已存在其他语言的内容&#xff0c;请协助翻译为本地化的中文。点击此处开始翻译。如本模板出现在原文存档页面&#xff0c;请注意更新主页面后&#xff0c;仍需要去除此处该模板如当前页面已经没有需要翻译的内容&#xff0c;请删去待翻译模板有标题的大篇幅文章&#xf…

关于AI,腾讯又有大动作!开发者该如何应对?

时隔 6 年后&#xff0c;腾讯公司的组织架构迎来新一轮的优化调整&#xff0c;在原有七大事业群&#xff08;BG&#xff09;的基础上进行重组整合。 腾讯公司董事会主席兼首席执行官马化腾表示&#xff1a;“作为一家以互联网为基础的科技和文化公司&#xff0c;技术是腾讯公司…

Android存储方式之SQLite

前言 SQLite数据库操作在Android开发中非常常用今天我将带大家全面了解关于SQLite数据库的操作&#xff08;增、删、查、改&#xff09;目录 1. SQLite数据库介绍 SQLite是Android内置的一个小型、关系型、属于文本型的数据库。 > Android提供了对 SQLite数据库的完全支持&a…

最近要换个主机,现在的太慢了

最近在学习wtl&#xff0c;打算做一个文件搜索工具来练手&#xff0c;需要正则表达式处理、数据库存储、键盘HOOK以及UI等技术UI用WTL搞定正则表达式的处理&#xff1a;http://research.microsoft.com/projects/greta/regex_perf.htmlhttp://www.tropicsoft.com/Components/Reg…

oracle数据库配置失败,oracle11g – Oracle 11G XE安装错误:数据库配置失败

在linuxMint上安装后运行oracle配置时&#xff1a;/etc/init.d/oracle-xe configure指定以下错误&#xff1a;sudo /etc/init.d/oracle-xe configureOracle Database 11g Express Edition Configuration-------------------------------------------------This will configure …

显示来自多个表的数据——JOIN

表关系简介 一、语法 SELECT 字段列表FROM TABLE1 [CROSS JOIN TABLE2 ] | [NATURAL JOIN TABLE2 ] | [JOIN TABLE2 USING (字段名) ] | [JOIN TABLE2 ON (TABLE.COLUMN_NAME TABLE2.COLUMN_NAME) ] | [(LEFT | RIGHT | FULL OUT) JOIN TABLE2 ON (TABLE1.COLUMN_NAME TABL…

20年第三次架构大调整,腾讯永远年轻!

整理 | 琥珀出品 | AI科技大本营&#xff08;公众号ID&#xff1a;rgznai100&#xff09;凌晨&#xff0c;腾讯官方公众号发布了一则消息&#xff0c;公布了成立 20 周年以来的新一轮整体战略升级。此前&#xff0c;国内各大互联网公司包括阿里、百度、美团、滴滴、京东都相继进…

NHibernate和Cuyahoga(二)(翻译):

原文:http://www.cuyahoga-project.org/home/developers.aspxMappings: 在我们使用像NHibernate这样强大的ORM工具的时候,映射类有时候是相当严格的.这就造成了很大的障碍,尤其是由于没有足够的真实的映射例子(更确切的说,对于Java版本的Hibernate来说,会有更多的例子).…

Enterprise Library Step By Step系列(十二):异常处理应用程序块——进阶篇

一&#xff0e;把异常信息Logging到数据库在日志和监测应用程序块中&#xff0c;有朋友提意见说希望能够把异常信息Logging到数据库中&#xff0c;在这里介绍一下具体的实现方法。1&#xff0e;创建相关的数据库环境&#xff1a;我们可以用日志和监测应用程序块自带的SQL语句来…

观点PK_倘若做不好AI,云服务商还能勇往直前吗?

AI强大却不独立存在&#xff0c;如今已经成为人们普遍接受的理念之一。在这个火热的时代&#xff0c;AI技术不是一个独立的产品&#xff0c;而是一种“基本生产力”&#xff0c;它适用于大部分经济活动&#xff0c;可以让各行各业都产生“增倍效应”&#xff0c;可以预见的是&a…

练习 MongoDB 操作 —— 备份篇(三)

2019独角兽企业重金招聘Python工程师标准>>> mongodb数据备份和还原主要分为二种&#xff0c; 一种是针对于库的mongodump和mongorestore&#xff0c; 一种是针对库中表的mongoexport和mongoimport。 mongodb 数据库操作--备份 还原 导出 导入 导入与导入 导入与导出…

判断是否为闰年oracle,ORACLE 通过日期变量判断是否闰年

最近在做同比环比报表&#xff0c;2月份的日期需要判断是否闰年&#xff0c;在网上查了很多资料&#xff0c;大部分都是用sysdate说明的&#xff0c;不是很理想&#xff0c;自己捣鼓了半天&#xff0c;终于整出来了。跟大家分享下。declarevbdate date;V_LASTDAY NUMBER(2,0);V…

CentOS 6.x中目录结构及用途

目录名称作用/根目录&#xff0c;一般根目录下只存放目录&#xff0c;不要存放文件/bin存放普通用户可执行的系统命令/sbin存放的是超级管理员执行的系统命令/etc系统管理和配置文件存放路径/etc/rc.d启动的配置文件和脚本存放目录/etc/passwd系统用户密码文件&#xff0c;包含…

oracle dataguard 日志 很多no,oracle dataguard 日志传输原理

Services)&#xff0c;它不仅控制着传输redo数据到其它数据库&#xff0c;同时还管理着解决由于网络中断造成的归档文件未接收的过程。一、如何发送数据在primary数据库&#xff0c;DataGuard可以使用归档进程(ARCn)或者日志写进程(LGWR)收集redo数据并传输到standby&#xff0…

“偷鸡”不成的马斯克,终于丢掉了自己的“王位”

整理 | 非主流出品 | AI科技大本营&#xff08;公众号ID&#xff1a;rgznai100&#xff09;昨天&#xff0c;好战的马斯克丢了一血。据多家外媒报道&#xff0c;美国当地时间周六&#xff0c;埃隆马斯克与美国证券交易委员会&#xff08;SEC&#xff09;达成和解协议。马斯克必…

JVM指令详解(上)

文中提及的栈是虚拟机栈中的栈帧的操作数栈&#xff0c;本地变量表是栈帧中的本地变量表&#xff0c;如下图:/*** Author: qlq* Description* Date: 22:44 2018/9/25*/ public class MathTest {public static void main(String a[]){MathTest mathTest new MathTest();System.…

oracle修改时区无效,Oracle 时区问题

oracle中的tz_offset是用来返回给定时区与标准时区(UTC universal of time Coordinate 通用时间坐标)的偏移量&#xff0c;其参数可以是&#xff1a;1.一个合法的时区名2.一个离UTC的标准偏移量3.关键字SessionTimeZone或者是DB_timezone其中合法的时区名可以从系统视图V$TimeZ…

::operator new、sgi stl alloc、dlmalloc测试结果

注&#xff1a; 使用的dlmalloc为2.8.3版本使用GetTickCount()&#xff0c;测试1000000次的new/delete分配空间大小为2的幂&#xff0c;依次递增在Debug模式下sgi-stl alloc > dlmalloc > ::operator new在Release模式下dlmalloc > sgi-stl alloc > ::operator new…

假期快乐!超强面试资源等你Pick,先收藏!

整理 | Jane 出品 | AI科技大本营 【导读】准备面试不是一件简单的事情&#xff0c;本文的作者在过去一段时间先后参加 50 多次面试。过程是艰难的&#xff0c;但是在这个过程中也积累了一些非常有用的资源。今天 AI科技大本营就为大家整理了那些有价值的学习资源&#xff0c;…

oracle判断值是否为0的高数,SQLServer和Oracle的常用函数对比

数学函数1.绝对值S:select abs(-1) valueO:select abs(-1) value from dual2.取整(大)S:select ceiling(-1.001) valueO:select ceil(-1.001) value from dual3.取整(小)S:select floor(-1.001) valueO:select floor(-1.001) value from dual4.取整(截取)S:select cast(-1.002 …

9月机器学习开源项目Top10

作者 | Mybridge译者 | 王天宇整理 | Jane出品 | AI科技大本营【导读】我们从过去一个月近 250 个有关机器学习的开源项目中&#xff0c;精心挑选出了最热门的 10 个。在挑选过程中&#xff0c;我们始终在各个项目之间作比较。Mybridge AI 基于大量的因素来估量项目的专业水平&…

翻译:CREATE DATABASE语句

本文为mariadb官方手册&#xff1a;CREATE DATABASE的译文。 原文&#xff1a;https://mariadb.com/kb/en/create-database/我提交到MariaDB官方手册的译文&#xff1a;https://mariadb.com/kb/zh-cn/create-database/ 语法 CREATE [OR REPLACE] {DATABASE | SCHEMA} [IF NOT …

Consultanting Service

在我所做的咨询顾问工作中最耗费精力的事情就是去客户那边提案&#xff0c;对于咨询公司来说&#xff0c;这个过程就像高考一样。 这里的提案指的是&#xff0c;咨询公司给企业做的报告或者方案的演示 。提案之所以重要&#xff0c;是因为它质量的好坏直接关系到客户是否会继续…

第三次组织架构变动背后,腾讯AI走向何方?

AI科技大本营注&#xff1a;在 9 月末一场轰轰烈烈的“甚至连腾讯人自己都是睡梦中得知”的组织架构大调整后&#xff0c;不少业内人士给出了对暴风雨中腾讯的上帝视角评价。据了解&#xff0c;此次腾讯组织架构调整&#xff0c;酝酿已久&#xff0c;在腾讯内部早已不是秘密。如…

使按钮响应回车键

定在<head></head>之间 <script language"javascript"event"onkeydown"for"document">if(event.keyCode13) { document.all(Button1).focus(); document.all(Button1).click(); }</script> 转载于:https://www.cnb…

oracle cusor游标,ORACLE CURSOR 游标详解

DECLAREsqlStr VARCHAR2(2000); --拼写sqlflag int; --判断是否存在col_name VARCHAR2(100); --字段名字tab_name VARCHAR2(100); --表名col_type VARCHAR2(100); --表名operator_str VARCHAR2(100) : ;FindUser VARCHAR2(50) :ERSAFETY; --要查…

【播放器SDK】Android如何实现固定竖屏播放视频

安卓的固定竖屏播放并不受手机是否开启旋转的限制&#xff0c;需要用户设置Activity为固定竖屏。目前带皮肤的播放器内部对竖屏播放视频做了一定的支持.用户使用相对比较简单. 带皮肤播放器 参考Demo代码FixedSkinActivity 1.在onCreate里面设置当前Activity为固定竖屏模式. se…