vlambda博客
学习文章列表

基础回顾之Javasript基础


一、

1、概述与基础语法

1、什么是JavaScript

JavaScript是一种运行与JavaScrpt解释器/引擎中的解释型脚本语言

运行环境

1.独立安装的JS解释器(NodeJS

2.嵌入在[浏览器]内核中JS解释器

解释型

运行之前是不需要编译的,运行之前不会检查错误,知道碰到错误为止

编译型

对源码进行编译,还能检查语法错误(C/C++

JS使用场合

PC机、手机、平板、机顶盒

2、JS组成

完整的JS是由三部分组成:

① 核心(ECMAScript):语法基础


② 文档对象模型(DOMDocument Object Model):让JS有能力与网页进行对话

基础回顾之Javasript基础


③ 浏览器对象模型(BOMBrowser Object Model):让JS有能力与浏览器进行对话

基础回顾之Javasript基础


3、JS特点

① 开发工具简单,记事本即可

② 无需编译,直接由JS引擎负责执行

③ 弱类型语言,由数据来决定数据类型

④ 面向对象

4、浏览器内核的作用

负责页面内容的渲染。内核主要由两部分组成:

① 内容排版引擎解析HTMLCSS

② 脚本解释引擎解析JavaScript

5JS运行环境以及JS的三种添加方式

① 独立安装JS引擎

② 嵌入在浏览器内核中的引擎:直接在浏览器中输入并执行JS;将JS脚本嵌入在HTML页面中执行

1、将JS脚本嵌入在HTML页面中执行的步骤

1、将JS代码嵌入在元素“事件”中

      onclick:当单击元素时所做的操作

      <div id=”” onclick=JS代码> XXX </div>

<html>

<body>

<button onclick=" console.log( 'Hello World' ); ">

打印消息

</button>

</body>

</html>

2、将JS代码嵌入在<script>标记中

1<script></script>

允许出现网页的任意位置处

< html>

<body>

页头

<hr/>

<script>

document.write( '<b>欢迎</b>');

console.log( "脚本执行结束... );

</script>

<hr/>

页尾

</body>

</html>

3、将JS代码写在外部脚本文件中(** js)

1、创建js文件,并编写JS代码

***.js

2、在页面中引入js文件

<script font-family:宋体;">文件路径"></script>

< html>

< head>

< script src= " myscript.js"> </script>

</head>

<body>

</body>

</html>

注意:

<script > </script>该对标记中,是不允许出现任何内容的

<script >console.log(); </script>   //以上代码是错误的

例子:

基础回顾之Javasript基础

2、语法规范

1、语句

允许被JS引擎所解释的代码

使用分号来表示结束

console.log();

document. write();

大小写敏感

console. log0;正确

Console.logO;错误

英文标点符号

console.log(");正确

consoole.log (“”) ;错误

由表达式、关键字、运算符组成

2、注释

单行注释: //

多行注释:/* */

sublime textCtrl+/

2、变量

内存:保存程序在运行过程中,所需要用到的数据

8bit(比特是表示信息的最小单位)=1byte

1024byte = 1KB

1024KB = 1MB

1024MB = 1GB

1024GB = 1TB

变量即内存中的一段存储空间名:内存空间的别名,可以自定义值:保存在内存空间中的数据。

1、语法

声明://声明过程中,尽量不要省略var关键字,否则声明的是“全局变量”

var 变量名;

赋值;

变量名=值;

console.log()document.write()使用变量名取代""

打印变量stuName的值到控制台.

var stuName= ="PP.XZ";

console.log(stuName); -- PP.XZ

console. log("stuName"); -- stuName

一次性声明多个变量并赋值

语法:

var变量名1变量名2.. .变量名n;

 

var stuName=' 'PP.XZ",stuAge=25, stuHeight;

等同于

var stuName= "PP.XZ";

var stuAge=25;

var stuHeight;

2、变量名 命名规范

① 不允许使用JS的关键字和保留关键字

基础回顾之Javasript基础

② 由字母、数字、下划线以及$组成

③ 不能以数字开头

④ 尽量见名知意

⑤ 可以采用“驼峰命名法”:变量名为合成词时,第一个单词全小写,第二个单词开始,每个单词首字符变大写;如果只有一个单词作为变量名,全小写

3、变量的使用

① 未经初始化的变量:变量声明后,从未赋值,称之未未经初始化变量

② 使用未声明的变量:变量未被定义过,直接打印或使用console.log(stuHeight);结果为错

③ 对变量进行的存取操作:

基础回顾之Javasript基础

注意:=出现的话,永远是将=右边的东西保存给=左边的变量,左边必须是变量。

3、数据类型

1、数据类型

1、数字类型 number类型

可以表示32位的整数以及64位的浮点数

整数:32位即4字节

浮点数:即小数,64位,8字节

 

整数

 

十进制:生活中常用数字

八进制:逢八进一

十六进制:逢15进一

小数

2、字符串类型 String类型

String表示一系列的文本字符数据Unicode字符,数字,标点组成Unicode下所有的字符,数字,标点在内存中都占2字节"".charCodeAt().toString(16)

查看字符""的十六进制表现方式结果为: 5f20

\u4e00 :汉字的起始字符\u9fa5 :汉字的结束字符

转义字符\n换行\r回车\t:一个制表符

3、布尔类型 boolean类型

作用:用于表示条件的结果

取值:true:真,肯定的结果;false:假,否定的结果(除条件判断外,做运算是,true可以作1运算,false可作0运算)

4、

声明对象未赋值:null

5、未定义 undefined

1、声明变量未赋值;2、访问对象不存在的属性

2、数据类型转换

1、弱类型

由数据来决定变量的数据类型是什么

var stu; //undefined

stu=25; //number

stu=25 //string

不同数据类型的数据在运算的过程中,如何处理?

var num1=15; //number

var num2=13; //number

var result=num1+num2;//28->number

var str1=15;//string

var result1=num1+str1;

2、隐式转换

自动转换,由JS在运算过程中,自己进行转换的操作,不需要人为参与

① 函数 typeof()typeof

② NaN  Not a Number不是一个数字

isNaN(数据):判断数据是否为非数字

是否为一个数字?当结果为布尔类型时,true不是一个数字,false是一个数字(所有的数据类型与string+ 运算时,最后的结果都为string

3、转换函数-显示转换(强制转换)

toString():将任意类型的数据转换为string类型

变量。toString(); 会得到一个全新的结果,类型为string,如:var num=15;var str=num+””;

parseInt():整型Integer的作用为获取指定数据的整数部分,语法:“var result = parseInt”,值得注意的是:parseInt从左向右依次转换,碰到第一个非整数字符,则停止转换。如果第一个字符就是非整数字符的话,结果为NaN

③ parseFloat():浮点类型Float,将指定数据转换为小数,语法:“var result = parseFloat

④ Number():将一个字符串解析为number,语法:“var result = Number”;注意如果包含非法字符,则返回NaN

4、运算符与表达式

运算符:能够完成数据计算的一组符号,比如:+-*/,……

表达式:由运算符和操作数所组成的式子叫作表达式,每个表达式都有自己的值

1、运算符

(+)、减(- )、乘(*)、 除(/)、求余(% )

- 可以表示减号,也可以表示负号,如: x=-y

+ 可以表示加法,也可以用于字符串的连接

1、算术运算符

%:取余操作,作用是取两个数字的余数(判断数字的奇偶性、获取数字的最后几位)

2、自增++ & 自减--

++:自增,在数值的基础上,进行+1操作

: 自减,在数值的基础上,进行- 1操作

2、关系运算符

判断数据之间的大小关系:判断结果为truefalse

>

大于

<

小于

>=

大于等于

<=

小于等于

==

判断等于:比较数值

!=

不等于

===

全等,除数值外,类型也比较

!==

不全等

判断一个数据是否为数字:

var input=prompt(请输入一个数据:);

判断input是否为数字??

isNaN(数据)

isNaN() 会抛开数据类型来判断数据是否为数字

如果 数据 是数字类型,则返回false

如果 数据 不是数据类型,则返回true

3、逻辑运算符

作用:关联条件

1、逻辑与&&

关联两个条件,两个条件都为真的时候,那么整个表达式的结果才为真

语法:条件1  && 条件2

2、逻辑或||

关联两个条件,两个条件中,只要有一个为真,那么整个表达式的结果就为真

3、逻辑非!

对条件取反(注意:逻辑非,只有一个操作数),语法:!条件

非真即假,非假即真

4、短路逻辑

1、短路&&

如果第个条件的结果已经为false的话,那么就不会再判断第二个条件那么整个表达式的值,就是false

如果第一个条件的结果是true的话,则继续判断(执行)第二个条件(表达式),并且以第二个表达式的值,作为整个表达式的值

2.短路||

如果第一个条件的结果已经为true的话, 那么就不会再判断第二个条件,那么整个表达式的值,就是true

如果第一个条件的结果是false的话,则继续判断(执行)第二个条件(表达式),并且以第二个表达式的值,作为整个表达式的值

4、条件运算符

1、三目运算符:运算符需要三个操作

语法:表达式1?表达式2:表达式3

表达式1是一个条件,值为boolean类型

若表达式1的值为true,则执行表达式2的操作,并且以表达式2的结果作为整个表达式的结果;若表达式1的值为false,则执行表达式3的操作,并且以表达式3的结果作为整个表达式的结果

var age = 20 ;

var msg = age > 18 ? 成年人 : 未成年人;

条件运算符的嵌套:输入一个考试成绩,判断如果成绩在80以上,则输出优秀;如果成绩在60以上,则输出合格;否则输出不合格

var score = 85;

var result = score >= 80 ? 优秀(

          score >= 60?合格 : 不合格

)

5、函数

函数(function),也可以被称之为方法(method),或者过程(procedure)是一段预定义好,并可以被反复使用的代码块。其中可以包含多条可执行语句

预定义好:事先声明好,但不被执行

反复使用:允许被多个地方(元素,函数中)所应用

代码块:允许包含多条可执行的代码

函数本质上是功能完整的对象

1、函数的声明

语法:

function 函数名(){

        可执行语句;

}

ex:创建一个函数名称:sayHello,主体功能为:向控制台上输出一句Hello World

function printHello(){

        console.log(Hello);

        console.log(world);

}

2、函数的调用

执行函数中的内容,任何JS的合法位置处,都允许调用函数,语法:函数名称();

function sayHello( ){

console.log( "hello" );

console.log( "world" );

}

sayHello( );

3、定义函数的参数和返回值

转换函数

parseInt(数据); //将指定数据转换为整数

parseFloat(数据); //将指定的数据转换为小数

console.log(要打印的话)

1、定义带参数函数

function 函数名(参数列表声明){

    //代码块(函数体,功能体,方法体)

}

参数列表:由一个或多个变量名称来组成,声明函数时定义的参数,可以称之为叫作“形参”(形式参数),在调用函数时所传递的参数值,被称之为“实参”(实际参数)

基础回顾之Javasript基础

2、带返回值的函数

function 函数名(0或多个参数){

//代码块;

return;

}

调用:var 变量 = 函数名(参数);

function add( num1, num2){

return num1 + num2 ;

}

var result = add( 10, 20 );

console.log( result );     //输出30

3、变量的作用域

1、作用域

作用域就是变量或函数的可访问范围。它控制着变量或函数的可见性和生命周期

JS中,变量或函数的作用域可分为: .

函数作用域,只在当前函数内可访问

全局作用域,一经定义,代码的任何位置都可以方式

2、函数作用域

函数作用域中的变量(局部变量)只在当前函数内可访问到,离开此范围就无法访问了。

function add(){

varsum=1+2;   //局部变量

console.log( sum );    //正确

}

console.log( sum ) ;     //脚本错误


3、全局作用域

全局作用域中的变量,称之为“全局变量”,在代码的任何位置处都能访问

基础回顾之Javasript基础


4、声明提前

JS在正式执行之前,会将所有var声明的变量和function声明的函数,预读到所在作用域的顶部。但是,对变量的赋值,还保留在原来的位置处

基础回顾之Javasript基础


5、按值传递

传参时,实际上是将实参复制了一-份副本传给了函数。在函数体内对变量进行修改,实际上是不会影响到外部的实参变量的

var n=100;  //全局变量n

function fun(n){  //参数变量也是局部变量

n-=3;  //修改的是局部变量n

console.log(n);  //输出的是局部变量n

}

fun(n); //按值传递,方法内输出97;

console.log(n);  //输出全局变量的值: 100

 

6、分支结构

1、程序的流程控制:程序 = 数据 + 算法

1、程序的三种结构

基础回顾之Javasript基础

1、分支结构

程序在运行过程中,根据不同的条件,选着执行某些语句

if- 结构

当条件满足时,运行某些语句;当条件不满足时,则不运行这些语句

语法:

if(条件表达式){

    语句块;

}

流程:

1、判断条件表达式的结果

2、如果结果为true,则执行语句块内容;如果结果为false,则不执行语句块的内容

1if语句,条件位置处,必须为boolean的值/表达式/变量;如果条件不是boolean类型的话,JS会自动进行转换

2if语句块的{} ,可以被省略的;如果省略{},那么if只控制它下面的第一条语句

if-else 结构

当条件满足时,运行某些语句;当条件不满足时,运行另外一些语句

语法:

if(条件){

语句块1;

}else{

语句块2;

}

如果条件为真的话,则执行语句块1中的操作;否则则执行语句块2中的操作

else-if 结构

复杂 if 结构 或 多重 if 结构

语法:

if(条件1){

语句块1;

}else if(条件2){

语句块2;

}else if(条件3){

语句块3;

}..else{    //最后的else模块,可以选择性添加

语句块n; .

}

switch-case

使用场合:优先用于 等值判断 的条件中;switch case语句是一种特殊的分支结构,可以根据一个表达式的不同取值,从不同的程序入口开始执行。

switch (表达式) {

case1 :

语句1;

语句2;

case2:

语句3;

……

default:

语句n;

}

流程:

1、计算变量或表达式的值

2、将计算出来的值与case后的数值做等值判断,如果判断相等的话,则执行对应的case后的执行语句

switch (表达式) {  

case1 :

语句1;

break;   //break语句作用:跳出switch结构

case2:

语句3;

break;

……

default:

语句n;

}

流程:

1、计算变量或表达式的值

2、将计算出来的值与case后的数值做等值判断,如果判断相等的话,则执行对应的case后的执行语句

3、如果碰到break,则结束执行,否则,继续向下执行

switch-case的结束机制:

1、碰到break结束

2、整个结构都执行完毕结束直落两个case或多个case之间,没有任何的可执行代码,那么就以最后一块的case为主

switch-case的优势

常常和break语句结合使用实现分支的功能。switch-case在实现分支功能时和if-else的主要区别在于:

1if..else....可以判定相等或不等的情形,适用性更广;

2switch...case...结构的结构更清晰、效率更高;

3、但一般只用于指定变量相等于某个范围内的某个特定的值。

 

 

7、循环结构

循环:重复执行相同或相似的代码

循环的两大要素:

① 循环条件:什么时候开始,什么时候结束

② 循环操作:循环体,循环过程中执行的操作

1、while循环

语法:

while(boolean表达式){

    循环体语句;

}

流程:

1、判断条件

2、如果条件为真,则执行循环操作

3、再判断条件,如果为真,继续执行循环操作

 ……

n、判断循环条件,如果条件为假,则退出循环结构

:一般情况下,循环操作中会存在使得循环终止的可能性,如果循环条件一直为真的话, 那么循环就是个死循环,尽量避免死循环的产生。一定要记得更新循环变量条件

2、循环的流程控制

1continue关键字

作用用在循环中,用于终止本次循环,继续执行下次循环

2break 关键字

作用用在循环中的话,终止整个循环结构!!!

3、do-while循环

语法:

do{

可执行语句;  //无论循环条件是否满足,循环体至少执行一次

}while(boolean表达式);

流程:

1、先执行循环操作

2、再判断循环条件

如果条件为真,则继续执行循环操作

如果条件为假,则终止循环即退出循环

4、whiledowhile区别

while

先判断,后执行

最少一次循环都不执行(第一次条件就不满足)

do...while

先执行,后判断

最少要执行一次循环操作(第一 次条件就不满足)

 

5、for循环

语法:

for(表达式1;表达式2;表达式3){

循环体语句;

}

for循环执行过程:

1.计算表达式1的值;

2.计算表达式2 (boolean表达式) 的值,如果为true则执行循环体,否则退出循环;

3.执行循环体;

4.执行表达式3;

5.计算表达式2,如果为true则执行循环体,否则退出循环;

6.如此循环往复,直到表达式2的值为false

1for循环用于实现固定次数的循环

基础回顾之Javasript基础

6、forwhiledo-while之间的区别

forwhile

最少执行0

while:多数用于不确定循环次数时使用

for:多数用于确定循环次数时使用

do- while

最少执行1

适合用于不确定循环次数时使用

7、循环的嵌套

在一个循环体内再出现一个循环

for / while / do-while三种循环在很多情况下是可以互换的;般情况下,for循环使用最多

8、数组

1、索引数组

索引数组是内存中连续存储多个数据的数据结构,再起一个统一的名字;

普通的变量只能存储一个数据程序=数据结构+算法(算法是解决问题的步骤;数据结构是数据在内存中的存储结构,好的数据结构可以极大的提高程序的执行效率)

只要存储多个连续的数据就可使用索引数组。

1、创建

1、创建空数组

在创建数组时,还不知道数组中的元素内容时,可以创建空数组(2种)

数组直接量:

var arr = [];

new

var arr = new Array();

2、创建-

var arrl =[ ];    //定义一个不包含元素的数组

var arr2= [97, 85, 79];    //定义一个包含3个元素的数组

var arr3 = new Array);    //定义一-个不包含元素的数组

var arr4 = new Array("Tom", "Mary", "John");    //定义个三个字符串元素的数组

3、创建数组同时初始化

在创建数组时,已经知道数组的元素内容

数组直接量:var array=[元素1,元素2,];

newvar arr=new Array(元素1,元素2,);

4、先声明空数组,再添加元素

基础回顾之Javasript基础


2、访问数组中的元素

数组中每个数据都是一个元素,通过下标(数组中唯一标识每个元素存储位置的序号)访问,从0开始,连续不重复;只要访问数组元素,只能用下标;数组名[i]——用法和单个变量完全一样。

1、数组GET操作与SET操作

①设置数组元素的值——SET

基础回顾之Javasript基础

②获取数组元素的值——GET

基础回顾之Javasript基础

2、访问数组中的元素

数组的length属性:记录了数组中理论上的元素个数length属性的值永远是最大下标+1

遍历数组元素,通常选择for循环语句,元素的下标作循环变量,元素下标从0开始,到length-1结束

3、固定套路

① 获得数组最后一个元素:arr[arr.length-1]

② 获得倒数第n个元素的位置:arr[arr.length-n]

③ 数组缩容:减小arr.length的数值,会删除结尾的多余元素。

④ 遍历数组:依次访问数组中每个元素,对每个元素执行相同的操作

for(var i=0;i<arr.length;i++){

arr[i]  //当前正在遍历的元素

}

3、特殊:三个不限制

① 不限制数组的元素个数:长度可变

② 不限制下标越界:

获取元素值:不报错!返回undefined

修改元素值:不报错!自动在指定位置创建新元素,并且自动修改length属性为最大下标+1;如果下标不连续的数组——稀疏数组

③ 不限制元素的数据类型

2、关联数组

关联数组是可自定义下标名称的数组,索引数组中的数字下标没有明确的意义,只要希望每个元素都有专门的名称时,便可使用索引数组,具体分为两步:①创建空数组;②向空数组中添加新元素,并自定义下标名称。

1、创建方式

var bookInfo= [ ];

bookInfo['bookName'] =西游记' ;

bookInfo['price'] =35.5;

由于关联数组的length属性值无法获取其中元素的数量,所有遍历关联数组只能使用for..in循环

2、遍历关联数组:for in 循环

for(var key in hash){

key//只是元素的下标名

hash[key]/当前元素值

}

3、索引数组与关联数组的对比

基础回顾之Javasript基础

基础回顾之Javasript基础

总结:希望快速查找元素时,可以使用hash数组

9、数组API函数

1、数组转字符串

1、String(arr)

arr中每个元素转为字符串,用逗号分隔

固定套路:对数组拍照:用于鉴别是否数组被修改过

2、arr.join(连接符)

arr中每个元素转为字符串,用自定义的连接符分隔

//将字符拼接为单词

var chars=["H","e","Il","'l","o"];

console. log( chars.join("));      //Hello

固定套路:

1、将字符组成单词:chars.join(“”)->无缝拼接

     (判断数组是空数组:arr.join(“”)==””

2、将单词组成句子:words.join(“”)

3、将数组转化为页面元素的内容:

<开始标签>+arr.jion(</结束标签><开始标签>)+</结束标签>

2、拼接和选取

不直接修改原数组,而返回新数组!

1、拼接concat

concat()拼接两个或更多的数组,并返回结果

var newArr=arr1.concat(1,2,arr2,3,)  //将值1,值2arr2中每个元素,以及值3都拼接到arr1的元素之后,返回新数组,其中:arr2的元素会被先“打散”,再拼接

2、选取slice

slice()返回现有数组的一个子数组

var subArray=arr.slice(starti,endi+1)  //选取arrstarti位置开始,到endi结束的所有元素组成新数组返回——原数组不变

强调:凡是两个参数都是下标的函数,都有一个特性:含头不含尾

① 一直选取到结尾:可省略第二个参数

② 如果选取的元素离结尾近:可用倒数下标:

arr.slice(arr.length-n,arr.length-m+1)  可以简写为   arr.slice(-n,-m+1);

③ 复制数组:

arr.slice(0,arr.length);   可以简写为   arr.slice();

3、修改数组

1、删除

arr.splice(starti,n)  直接修改原数组,删除arrstarti位置开始的n个元素不考虑含头不含尾。

var deletets = arr.splice(starti,n);  //返回值deletes保存了被删除的元素组成的临时数组

2、插入

arr.splice( starti,0,1,2,...)

arrstarti位置,插入新值1 ,...starti位置的值及其之后的值被向后顺移

3、替换

其实就是删除旧的,插入新的

arr. splice(starti,n,1,2,...)

先删除arrstarti位置的n个值,再在starti位置插入新值强调:删除的元素个数和插入的新元素个数不必一致。

4、颠倒reverse

颠倒数组中元素的顺序  arr.reverse();   //仅负责原样颠倒数组,不负责排序

5、排序sort

将元素按从小到大的顺序重新排列

排序API

arr.sort():默认将所有元素转为字符串再排列

问题:只能排列字符串类型的元素

解决:使用自定义比较器函数

排序算法:

(手写)冒泡快速插入排序

 

10、DOM查找

DOMdocument object model)是W3C(万维网联盟)的标准,是中立于平台和语言的接口,它允许程序和脚本动态地访问和更新文档的内容、结构和样式。对网页进行增删改查的操作。

1、id属性精确查找一个元素对象

var name = document.getElementById(id)    //效率非常高

getElementById只能用在document上,只用于精确查找一个元素,但不是所有元素都有id

<ul id= " myList" >

<li id="m1">首页</li>

<li id="m2">企业介绍</li>

<li id="m3">联系我们</li>

</ul>

var ul = document.getElementByld('myList');

console.log(ul );

2、按标签名找

var elems= parent.getElementsByTagName("tag ");

//查找指定parent节点下的所有标签为tag的子代节点

强调:

1.可用在任意父元素上

2.不仅查直接子节点,而且查所有子代节点

3.返回一个动态集合,即使只找到一-个元素,也返回集合,必须用[0],取出唯一元素

问题:

不但找直接,而且找所有子代。

<ul id= " myList" >

<li id="m1">首页</li>

<li id="m2">企业介绍</li>

<li id="m3">联系我们</li>

</ul>

var ul = document.getElementByld( menuList');

var list = ul.getElementsByTagName('li');

console.log(list );

 

3、通过name属性查找

document.getElementsByName( 'name属性值’ )

可以返回DOM树中具有指定name属性值的所有子元素集合。

<form id =" registerForm">

< input type= " checkbox" name= " boy' '/>

<input type= " checkbox" name= "boy' '/>

<input type=" checkbox" name= "boy"/>

< /form>

var list = document.getElementsByName( 'boy');

console.log( typeof list );

 

4、通过class查找

查找父元素下指定class属性的元素

var elems= parent.getElemnetsByClassName(" class' ");   //有兼容性问题: IE9+

<div id="news">

<p class=”mainTitle" >新闻标题1</p>

<p >新闻标题2 </p>

<p class=" mainTitle ">新闻标题3</p>

</div>

var div = document.getElementByld( news');

var list = div.getElementsByClassName( mainTitle');

console.log(list );

 

 

5、通过CSS选择器查找

元素选择器类选择器Id选择器后代选择器子代选择器群组选择器

1、只找一个元素

var elem=parent.querySelector("selector")

强调: selector支持一切css中选择器

强调: 如果选择器匹配的有多个,只返回第一个

2、找多个元素

var elems=parent.querySelectorAll("selector")

强调: selector API返回的是非动态集合

11、DOM修改

核心DOM:可操作一切结构化文档的API,包括HTMLXML——万能,但是繁琐

HTML DOM:专门操作HTML文档的简化版DOM API,仅对常用的复杂的API进行简化


1、修改属性

1、读取属性值

① 先获得属性节点对象,再获得节点对象的值:

var attrNode = elem.attributes[下标/属性名];

var attrNode = elem.getAttributeNode(属性名)

attrNode.value-属性值

② 直接获得属性值

var value=elem.getAttribute("属性名");

2、修改属性值

elem.setAttribute(属性名,value);

3、判断是否包含指定属性

var bool=elem.hasAttribute("属性名")

element.hasAttribute('属性名') //truefalse

4、移除属性

elem.removeAttribute("属性名")


2、修改样式

内联样式:  elem.style.属性名

强调:  属性名:去横线,变驼峰

比如:  css: background-color => backgroundColor

list-style-type => listStyleType

 

12、DOM添加

1、添加元素的步骤

① 创建空元素

var elem = document.createElement(元素名)

② 设置关键属性

 

设置关键属性

 

a.innerHTML= "go to tmooc

a.herf= " http://tmooc.cn";

<a href= "http://tmooc.cn">go to tmooc</a>

设置关键样式

a.style.opacity =” 1 ";

a.style.cssText = "width: 100px;height: 100px";

③ 将元素添加到DOM

parentNode.appendChild(childNode)   //可用于将为一个父元素追加最后一个子节点

parentNode.insertBefore(newChild, existingChild) 

//用于在父元素中的指定子节点之前添加一个新的子节点

 

2、添加元素优化

每次修改DOM树,都导致重新layout,因此要尽量少操作DOM

1.如果同时创建父元素和子元素时,建议在内存中先将子元素添加到父元素,再将父元素一次性挂到页面

2.如果只添加多个平级子元素时,就要将所有子元素,临时添加到文档片段中。再将文档片段整体添加到页面

文档片段内存中,临时保存多个平级子元素的虚拟父元素用法和普通父元素完全一-

1.创建片段

var frag=document.createDocumentFragment();

2.将子元素临时追加到frag

frag.appendChild(child);

3.frag追加到页面

parentappendChild(frag);   //强调: append之后,frag自动释放,不会占用元素

13、BOM

1、BOM概述

BOMBrowser Object Model)专门操作浏览器窗口的API——没有标准,有兼容性问题

1、浏览器对象模型

window

代表整个窗口

history

封装当前窗口打开后,成功访问过的历史url记录

navigator

封装浏览器配置信息

document

封装当前正在加载的网页内容

location

screen

封装了屏幕的信息

event

定义了网页中的事件机制

2、获取当前窗口大小

完整窗口大小: window.outerWidth/outerHeight

文档显示区大小: window.innerWidth/innerHeight

3、定时器

定时器让程序按指定时间间隔自动执行任务;网页动态效果、计时功能等

1、周期性定时器

让程序按指定时间间隔反复自动执行一项任务

1、语法

setInterval(exp,time):周期性触发代码exp

exp:执行语句

time:时间周期,单位为毫秒

setInterval(function(){

console.log(" Hello World");

},1000);

2、停止定时器

1、给定时器取名

var timer = setInterval(function(){

console.log(" Hello World");

},1000);

2、停止定时器

clearlnterval(timer);

3、一次性定时器

让程序延迟一段时间执行

1、语法

setTimeout(exp,time):一次性触发代码exp

exp:执行语句

time:间隔时间,单位为毫秒

setTimeout(function(){

alert("恭喜过关");

},3000);

只要反复执行,就用周期性

只要只执行一次,就用一次性