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的引入方式

{#1 直接编写#}
    <script>
        alert('hello yuan')
    </script>

{#2 导入文件#}
    <script src="hello.js"></script>
  • 二、JavaScript的基础

  • 1、变量

x=5
y=6
z=x+y

在代数中,我们使用字母(比如 x)来保存值(比如 5)。

通过上面的表达式 z=x+y,我们能够计算出 z 的值为 11。

在 JavaScript 中,这些字母被称为变量。

  • 1、变量是弱类型的(很随便)

  • 2、声明变量时不用声明变量类型,全都使用var关键字

  • 3一行可以声明多个变量并且可以是不同类型

<script>
    var x;
    x=12;

    var y=22;

    var name='cunzhang',  age=28;

</script>
  • 4、 声明变量时可以不用var如果不用var那么它是全局变量

  • 5变量命名首字符只能是字母下划线$美元符三选一,且区分大小写,x与X是两个变量

  • 6、变量命名的一些规则:

Camel 标记法
首字母是小写的,接下来的字母都以大写字符开头。例如:
var myTestValue = 0, mySecondValue = "hi";

Pascal 标记法
首字母是大写的,接下来的字母都以大写字符开头。例如:
var MyTestValue = 0, MySecondValue = "hi";

匈牙利类型标记法
在以Pascal标记法命名的变量前附加一个小写字母(或小写字母序列),说明该变量的类型。例如,i 表示整数,s 表示字符串,如下所示:
var iMyTestValue = 0, sMySecondValue = "hi";
  • 2、基础规范

  • 1、每行应以分号结束,但也可不加分号没有分号会以换行符作为每行的结束

  • 2、注释支持多行注释 /* */ 和单行注释 //

  • 3、使用{}来封装代码块

function f() {

}


if(2>1){
    alert(111)
}else{
    alert(222)
}
  • 3、常量和标识符

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

标识符:

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

 

  • 4、数据类型

  • 数字类型(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 10^23

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
  • 字符串(String)

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

String数据类型的使用

  • 特殊字符的使用方法和效果
  • Unicode的插入方法
<script>
        var str="\u4f60\u597d\n欢迎来到\"JavaScript世界\"";
        alert(str);
</script>
  • 布尔型(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;
    }
  • Null & Undefined

Undefined 类型

Undefined 类型只有一个值,即 undefined:

1、当声明的变量未初始化时,该变量的默认值是undefined

2、当函数无明确返回值时,返回的也是值undefined


Null 类型:typeof时展示的是object

另一种只有一个值的类型是Null,它只有一个专用值null。Null类型针对的是对象,代表一个空的对象。


值undefined实际上是从值null派生来的,因此 ECMAScript 把它们定义为相等的。尽管这两个值相等,但它们的含义不同。undefined 是声明了变量但未对其初始化时赋予该变量的值;null 则用于表示尚未存在的对象,如果函数或方法要返回的是对象,那么找不到该对象时,返回的通常是null。

var person=new Person()

var person=null
<script>
        var x;
        console.log(x)



        function f() {
            document.write('<h1>hello Yuan!</h1>')
        }

        console.log(f());
</script>

结果为:

  • 数据类型转换

JavaScript属于松散类型的程序语言
变量在声明的时候并不需要指定数据类型
变量只有在赋值的时候才会确定数据类型
表达式中包含不同类型数据则在计算过程中会强制进行类别转换

数字 + 字符串:数字转换为字符串

数字 + 布尔值:true转换为1,false转换为0

字符串 + 布尔值:布尔值转换为字符串true或false
<script> 
 
    console.log('hello'+2);

    console.log('hello'+true);

    console.log(2+true);

</script>

结果为:

  •  强制类型转换函数

函数parseInt:强制转换成整数,例如parseInt("6.12")=6;parseInt(“12a")=12;parseInt(“a12")=NaN;parseInt(“1a2")=1

函数parseFloat:强制转换成浮点数,parseFloat("6.12")=6.12

函数eval:将字符串强制转换为表达式并返回结果eval("1+1")=2;eval("1<2")=true
<script>
        console.log(parseInt(6.9234454));

        //NAN: not a number,属于Number的一种

        console.log(parseInt('hello'));    
        console.log(parseInt('123'));     
        console.log(parseInt('123abc'));
        console.log(parseInt('abc1234'));

</script>

结果为:

  • 类型查询函数:typeof

ECMAScript 提供了 typeof 运算符来判断一个值是否在某种类型的范围内。可以用这种运算符判断一个值是否表示一种基本数据类型:如果它是基本数据类型,还可以判断它表示哪种基本类型

<script>

    console.log(typeof 123);
    console.log(typeof 'hello');
    console.log(typeof true);
    console.log(typeof null);
    console.log(typeof undefined);

    console.log(typeof [12,3,4]);
    console.log(typeof {'name':'123'});

</script>

结果为:

  • ECMAScript 运算符

  • ECMAScript 算数运算符

加(+)、 减(-)、 乘(*) 、除(/) 、余数(% )  加、减、乘、除、余数和数学中的运算方法一样,例如:9/2=4.5,4*5=20,9%2=1

- 除了可以表示减法运算还可以表示负号,例如:x=-y

+ 除了可以表示加法运算还可以用于字符串的连接,例如:"abc"+"def"="abcdef"
  • 递增(++) 、递减(--)

假如x=2,那么x++表达式执行后的值为3,x--表达式执行后的值为1
i++相当于i=i+1,i--相当于i=i-1
递增和递减运算符可以放在变量前也可以放在变量后:++i,--i
区别在于在console.log()时,i++先展示i再进行+1操作,++i先进行+1操作再展示i
<script>
        var i = 10;
        i++;
        // i--;
        console.log(i);
</script>

结果为:

<script>
        var i = 10;

        console.log(i++);
        console.log(++i);
</script>

结果为:

  •  一元加减法:

    var a=1;
    var b=1;
    a=-a;  //a=-1

    var c="10";
    alert(typeof (c));
    c=+c;    //类型转换
    alert(typeof (c));
//    -------------------
    var d="yuan";
    d=+d;
    alert(d);//NaN:属于Number类型的一个特殊值,当遇到将字符串转成数字无效时,就会得到一个NaN数据
    alert(typeof(d));//Number
<script>
// NaN的特点
var n=NaN; console.log(n>5); console.log(n<5); console.log(n==5); console.log(n==NaN); //NaN只要参与比较,布尔值一定是false,除非!= console.log(n != NaN); </script>

结果为:

  • ECMAScript 逻辑运算符

等于 ( == ) 、 不等于( != ) 、 大于( > ) 、 小于( < ) 
、 大于等于(>=) 、 小于等于(<=) 、 完全等于(===)

与 (
&&) 、或(||) 、非(!) 1 && 1 = 1 1 || 1 = 1 1 && 0 = 0 1 || 0 = 1 0 && 0 = 0 0 || 0 = 0 !0=1 !1=0
  • 逻辑 AND 运算符(&&)

逻辑 AND 运算的运算数可以是任何类型的,不止是 Boolean 值

如果某个运算数不是原始的 Boolean 型值,逻辑 AND 运算并不一定返回 Boolean 值:

  • 如果一个运算数是对象,另一个是 Boolean 值,返回 Boolean 值(true在 AND 前时,返回对象)
  • 如果两个运算数都是对象,返回第二个对象
  • 如果某个运算数是 null,返回 null 
  • 如果某个运算数是 NaN,返回 NaN
  • 如果某个运算数是 undefined,返回undefined
  • false、null、NaN、undefined 任意两个进行 AND 运算时,返回 AND 前面的
1、false && object => false
2、object && false => false
3、true && object => object => true
4、object && true => true

5、object1 && object2 => object2

6、null && true => null
7、true && null => null
8、null && false => null
9、false && null => false

10、NaN && true => NaN
11、true && NaN => NaN
12、NaN && false => NaN
13、false && NaN => false

14、NaN && null => NaN
15、null && NaN => null

16、undefined && true => undefined
17、true && undefined => undefined
18、undefined && false => undefined
19、false && undefined => false
20、undefined && null => undefined
21、null && undefined => null
22、undefined && NaN => undefined
23、NaN && undefined => NaN
  • 逻辑 OR 运算符(||)

与逻辑 AND 运算符相似,如果某个运算数不是 Boolean 值,逻辑 OR 运算并不一定返回 Boolean 值

  • 如果一个运算数是对象,另一个是 Boolean 值,返回对象(true在 OR 前时,返回 true)
  • 如果两个运算数都是对象,返回第一个对象
  • true 与 null、NaN、undefined 进行 OR 运算时,返回 true
  • false、null、NaN、undefined 任意两个进行 OR 运算时,返回 OR 后面的
1、object || true -> object
2、true || object -> true
3、object || false -> object
4、false || object -> object

5、object1 || object2 -> object1

6、null || true -> true
7、true || null -> true
8、null || false -> false
9、false || null -> null

10、NaN || true -> true
11、true || NaN -> true
12、NaN || false -> false
13、false || NaN -> NaN

14、NaN || null -> null
15、null || NaN -> NaN

16、undefined || true -> true
17、true || undefined -> true
18、undefined || false -> false
19、false || undefined -> undefined
20、undefined || null -> null
21、null || undefined -> undefined
22、undefined || NaN -> NaN
23、NaN || undefined -> undefined
  • ECMAScript 赋值运算符

赋值 = 
JavaScript中=代表赋值,两个等号==表示判断是否相等:
例如,x
=1表示给x赋值为1 if (x==1){...}程序表示当x与1相等时 if(x=="on"){…}程序表示当x与"on"相等时
配合其他运算符形成的简化表达式: 例如i
+=1相当于i=i+1,x&=y相当于x=x&y
  • ECMAScript 等性运算符

执行类型转换的规则如下:

  • 如果一个运算数是 Boolean 值,在检查相等性之前,把它转换成数字值。false 转换成 0,true 为 1
  • 如果一个运算数是字符串,另一个是数字,在检查相等性之前,要尝试把字符串转换成数字
  • 如果一个运算数是对象,另一个是字符串,在检查相等性之前,要尝试把对象转换成字符串 
  • 如果一个运算数是对象,另一个是数字,在检查相等性之前,要尝试把对象转换成数字

在比较时,该运算符还遵守下列规则:

  • 值 null 和 undefined 相等
  • 在检查相等性时,不能把 null 和 undefined 转换成其他值
  • 如果某个运算数是 NaN,等号将返回 false,不等号将返回 true
  • 如果两个运算数都是对象,那么比较的是它们的引用值,如果两个运算数指向同一对象,那么等号返回 true,否则两个运算数不等

  • ECMAScript 关系运算符(重要)

  • 比较运算符两侧如果一个是数字类型,一个是其他类型,会将其类型转换成数字类型
  • 比较运算符两侧如果都是字符串类型,比较的是最高位的asc码,如果最高位相等,继续取第二位比较
<script>
        console.log('hello' && 4);

        console.log(2==2);
        console.log(2=='2');
        console.log(2==='2');  //完全等于,不进行格式转换

        console.log(3>20);
        console.log(3>'20');
        console.log('3'>'20');
</script>

结果为:

  • Boolean运算符(重要)

var temp=new Object();    // false;[];0; null; undefined;object(new Object();)

    if(temp){
        console.log("yuan")
    }else {
        console.log("alex")
    }
  • 控制语句

  • if 控制语句

if-else基本格式:
if (表达式){ 语句1; ...... }else{ 语句2; ..... }
功能说明: 如果表达式的值为true则执行语句1, 否则执行语句2

if语句嵌套格式:

if (表达式1) {
    语句1;
}else if (表达式2){
    语句2;
}else if (表达式3){
    语句3;
} else{
    语句4;
}

<script>
    var name='alex';
    if (name=='lijie')
    {
        alert('俗气')
    }
    else if(name=='zhichao')
    {
        alert('洋气')
    }
    else{
        alert('this is ALEX!')
    }
</script>
<script>
        var x= (new Date()).getDay();
        //获取今天的星期值,0为星期天
        var y;

        if ( (x==6) || (x==0) ) {
        y="周末";
        }else{
        y="工作日";
        }

        alert(y);

        //等价于

        y="工作日";
        if ( (x==6) || (x==0) ) {
        y="周末";
        }

</script>
  • switch  选择控制语句

switch基本格式:

switch (表达式) {
    case 值1:语句1;break;
    case 值2:语句2;break;
    case 值3:语句3;break;
    default:语句4;
}

<script>
    var week='Monday';

    switch(week){
        case 'Monday':alert('星期一');break;  //如果不写break,会继续执行后面的分支,直到break为止
        case 'Tuesday':alert('星期二');break;
        case 'Wednesday':alert('星期三');break;
        case 'Thursday':alert('星期四');break;
        case 'Friday':alert('星期五');break;
        case 'Saturday':alert('星期六');break;
        case 'Sunday':alert('星期日');break;
        default:alert('nothing');  //最好放最后,放在上面后面要加break
    }
</script>

结果为:

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

首先要看一个问题,if 语句适用范围比较广,只要是 boolean 表达式都可以用 if 判断;而 switch 只能对基本类型进行数值比较。两者的可比性就仅限在两个基本类型比较的范围内。
说到基本类型的数值比较,那当然要有两个数。然后重点来了——
if 语句每一句都是独立的,看下面的语句:
if (a == 1) ...
else if (a == 2) ...
这样 a 要被读入寄存器两次,1 和 2 分别被读入寄存器一次。于是你是否发现其实 a 读两次是有点多余的,在你全部比较完之前只需要一次读入寄存器就行了,其余都是额外开销。但是 if 语句必须每次都把里面的两个数从内存拿出来读到寄存器,它不知道你其实比较的是同一个 a。
于是 switch case 就出来了,把上面的改成 switch case 版本:
switch (a) {
        case 0:
                break;
        case 1:
}
                
总结:

1.switch用来根据一个整型值进行多路分支,并且编译器可以对多路分支进行优化
2.switch-case只将表达式计算一次,然后将表达式的值与每个case的值比较,进而选择执行哪一个case的语句块
3.if..else 的判断条件范围较广,每条语句基本上独立的,每次判断时都要条件加载一次
所以在多路分支时用switch比if..else if .. else结构要效率高
switch为什么比else if效率高?
  • for  循环控制语句

for循环基本格式:

for (初始化; 条件; 增量){
    语句;
    ...
}

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

<script>
    for (var i=0; i<10; i++){
        document.write('welcome'+i+'<br>')
    }
</script>

结果为:

<script>

var attr=[111, 222, 333] for (var i=0; i<attr.length; i++){ document.write(i); document.write('<br>'); document.write(attr[i]); document.write('<br>'); }
</script>

结果为:

<script>

var attr=[111, 222, 333]

// python方式的for循环方法
for (var i in attr){ document.write(i); document.write('<br>'); document.write(attr[i]); document.write('<br>'); }
</script>

结果为:

 两种for循环对比:

1、python式for循环

<body>

    <p>hello 村长</p>
    <p>hello 正文</p>
    <p>hello 志超</p>
    <p>hello 浩辰</p>

<script>

    var eles_P = document.getElementsByTagName('p');
    console.log(eles_P);

    for (var i in eles_P){
        console.log(i);    //不建议用这种方式,循环底下还有其他东西
    }

</script>
</body>

结果为:

 

2、JavaScript式for循环

<body>

    <p>hello 村长</p>
    <p>hello 正文</p>
    <p>hello 志超</p>
    <p>hello 浩辰</p>

<script>

    var eles_P = document.getElementsByTagName('p');

    for (var i=0;i<eles_P.length;i++){
        console.log(i);
        console.log(eles_P[i]);
    }

</script>
</body>

结果为:

 结论:for i in的python方式循环不推荐使用

  • while 循环控制语句

while循环基本格式:

while (条件){
语句;
...
}

功能说明:
运行功能和for类似,当条件成立循环执行大括号{}内的语句,否则跳出循环

<script>

    var x=0;
    var i=1;
    while (i<=100){
        x += i;
        i++;
    }
    console.log(x);

</script>
<script>

    var sum=0;
    for (var i=0;i<101;i++){
        sum += i;
    }
    console.log(sum)

</script>
for循环版

结果为:

<script>
    var i=1;
    while (i<=7) {
        document.write("<H"+i+">hello</H "+i+"> ");
        document.write("<br>");
        i++;
    }
    //循环输出H1到H7的字体大小
</script>

结果为:

  •  异常处理

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

注:主动抛出异常 throw Error('xxxx')

<script>
    
    try{
        console.log(123);
        throw Error('define error')
    }
    catch (e){
        console.log(e)
    }
    finally {
        console.log('finally')
    }

</script>

结果为:

  • ECMA对象

从传统意义上来说,ECMAScript 并不真正具有类。事实上,除了说明不存在类,在 ECMA-262 中根本没有出现“类”这个词。ECMAScript 定义了“对象定义”,逻辑上等价于其他程序设计语言中的类。

var o = new Object()

  • 对象的概念与分类

  • 由ECMAScript定义的本地对象,独立于宿主环境的 ECMAScript 实现提供的对象(native object)

  • ECMAScript 实现提供的、独立于宿主环境的所有对象,在 ECMAScript 程序开始执行时出现.这意味着开发者不必明确实例化内置对象,它已被实例化了。ECMA-262 只定义了两个内置对象,即 Global 和 Math (它们也是本地对象,根据定义,每个内置对象都是本地对象)(built-in object)

  • 所有非本地对象都是宿主对象(host object),即由 ECMAScript 实现的宿主环境提供的对象,所有 BOM 和 DOM 对象都是宿主对象

object对象ECMAScript 中的所有对象都由这个对象继承而来;Object 对象中的所有属性和方法都会出现在其他对象中

ToString():返回对象的原始字符串表示。
ValueOf():返回最适合该对象的原始值。对于许多对象,该方法返回的值都与 ToString() 的返回值相同。

11种内置对象

包括:

Array,String,Date,Math,Boolean,Number,Function,Global,Error,RegExp,Object

简介:

JavaScript中除了nullundefined以外其他的数据类型都被定义成了对象,也可以用创建对象的方法定义变量,StringMathArrayDateRegExp都是JavaScript中重要的内置对象,在JavaScript程序大多数功能都是通过对象实现的

 

  • String对象

  • 创建字符串的两种方法 

1、自动创建字符串对象:

var str1='hello';

调用字符串的对象属性或方法时自动创建对象,用完就丢弃

2、手工创建字符串对象:

var str2=new String('hello2');

采用new创建的字符串对象,全局有效

两种方法创建的字符串对象的展示类型不同,new String的方法创建的字符串采用的是堆的方式,所以算object类型:

console.log(typeof  str1);
console.log(typeof  str2);

结果为:

 

  • String对象的属性:获取字符串长度

console.log(str1.length);

结果为:

  • String对象的方法

 

 

 

  •  String对象的方法(1) —— 格式编排方法

书写格式:

String对象提供了一组针对HTML格式的方法,如x.anchor()返回锚定义字符串<a>x</a>,
x.bold()返回粗体表示字符串<b>x</b>,x.sup()返回上标格式字符串<sup>x</sup>
———————————————————————————————————————————————————————————————————————————————————————

console.log(str1.italics()); //<i>hello</i> console.log(str1.bold()); console.log(str1.anchor());

结果为:

  •  String对象的方法(2) ——  大小写转换

var str1="AbcdEfgh";
var str2
=str1.toLowerCase(); var str3=str1.toUpperCase(); alert(str2); //结果为"abcdefgh" alert(str3); //结果为"ABCDEFGH"
  • String对象的方法(3) —— 获取指定字符

书写格式

x.charAt(index)

x.charCodeAt(index)

使用注解

x代表字符串对象
index代表字符位置
index从0开始编号
charAt返回index位置的字符
charCodeAt返回index位置的Unicode编码
———————————————————————————————————————————————————————————————————————————————————————

var str1 = "welcome to the world of JS! 猿皇";
var str2
= str1.charAt(28); var str3 = str1.charCodeAt(28);
alert(str2);
//结果为"猿" alert(str3); //结果为33489
  • String对象的方法(4) —— 查询字符串索引

书写格式

1、x.indexOf(findstr,index)
2、x.lastIndexOf(findstr)

-------------------------------------

var str1 = "welcome to the world of JS!";

var str2 = str1.indexOf("l");
var str3 = str1.lastIndexOf("l");

alert(str2);
//结果为2
alert(str3);
//结果为18

******************************************************************

书写格式

3、x.match(regexp)

4、x.search(regexp)

使用注解

x代表字符串对象

regexp代表正则表达式或字符串

match返回匹配字符串的数组,如果没有匹配则返回null

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
  • String对象的方法(5) —— 子字符串处理

  •  截取子字符串
  • 书写格式
1、x.substr(start, length)

2、x.substring(start, end)

使用注解

x代表字符串对象

start表示开始位置

length表示截取长度

end是结束位置加1

第一个字符位置为0

-------------------------------------

var str1 = "abcdefgh";

var str2 = str1.substr(2,4);
var str3 = str1.substring(2,4);

alert(str2);
//结果为"cdef"
alert(str3);
//结果为"cd"

**************************************************************************

3、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)

-------------------------------------

var str1 = "abcdefgh";

var str2 = str1.replace("cd","aaa");

alert(str2);
//结果为"abaaaefgh"
  • 分割字符串
书写格式

x.split(slpstr)

-------------------------------------

var str1 = "一,二,三,四,五,六,日"; var strArray = str1.split(","); alert(strArray[1]); //结果为""
  • 连接字符串
书写格式

x.concat(addstr)

使用注解

x代表字符串对象
addstr为添加字符串
返回x+addstr字符串

-------------------------------------
var str1
= "abcd";
var str2
= str1.concat("efgh"); alert(str2); //结果为"abcdefgh"
  • Array对象

  • 创建数组对象

Array 对象用于在单个的变量中存储多个值
语法:

创建方式1:
var a=[1,2,3];

创建方式2:
new Array();     // 创建数组时允许指定元素个数也可以不指定元素个数

new Array(size);  // 如果1个参数且为数字,即代表size,不是数组里的内容
初始化数组对象:
    var cnweek=new Array(7);
        cnweek[0]="星期日";
        cnweek[1]="星期一";
        ...
        cnweek[6]="星期六";


new Array(element0, element1, ..., elementn)  // 也可以直接在建立对象时初始化数组元素,元素类型允许不同

var test=new Array(100,"a",true);
<script>
    //创建方式
    var arr1=[1,'hello',[11,2],{'name':'Yuan'}];
    var arr2=new Array(3);
    var arr3=new Array(1,'world',true,[1,2,3]);

    console.log(typeof arr1);
    console.log(typeof arr2);
    console.log(typeof arr3);


    //注意:var arr4=new Array(10),此处10是size
    var cnweek=new Array(4);
        cnweek[0]="星期日";
        cnweek[1]="星期一";
        cnweek[2]="星期二";
        cnweek[3]="星期六";

    console.log(cnweek);
</script>

结果为:

  • 创建二维数组

<script>
    //创建二维数组
    var cnweek=new Array(3);
    for (var i=0;i<=2;i++){
        cnweek[i]=new Array(2);
        };
        cnweek[0][0]="星期日";
        cnweek[0][1]="Sunday";
        cnweek[1][0]="星期一";
        cnweek[1][1]="Monday";
        cnweek[2][0]="星期六";
        cnweek[2][1]="Saturday";

    console.log(cnweek);
</script>

结果为:

  • Array对象的属性

获取数组元素的个数:length

<script>
    var arr1=[1,'hello',[11,2],{'name':'Yuan'}];
    
    console.log(arr1.length)
</script>

结果为:

  • Array对象的方法

 

  •  连接数组-join方法
书写格式
x.join(bystr)
使用注解 x代表数组对象 bystr作为连接数组中元素的字符串 返回连接后的字符串 与字符串的split功能刚好相反
<script>
    //join方法
    var arr5=[1,2,3,4,'1234'];
    var ret=arr5.join('**');

    console.log(ret);
    console.log(typeof ret);
</script>

结果为:

  •  连接数组-concat方法
书写格式
x.concat(value,...)
<script>
    
    // Tostring()--不是数组的专属方法
    var arr1=[1,'hello',[11,2],{'name':'Yuan'}];
    var ret2=arr1.toString();
    console.log(ret2);
    console.log(typeof ret2);

    //concat()
    var arr5=[1,2,3];
    var ret3=arr5.concat([5,66]);    //不是作为整体拼接进去
    console.log(ret3);
    console.log(typeof arr3);

</script>

结果为:

  •  数组排序-reverse sort
<script>
    //reverse
    var arr6=[10,23,45,37,100,88];
    console.log(arr6.reverse());

    //sort
    console.log(arr6.sort());  //按最高位排序
</script>

<script>

    // 如果就想按着数字大小比较呢?
    function f(a,b){
        if(a>b){
            return 1
        }
        else if(a<b){
            return -1
        }
        else {
            return 0
        }
    }

    function f2(a,b){
        return a-b
    }

    console.log(arr6.sort(f));
    console.log(arr6.sort(f2));

</script>

结果为:

  •  数组切片-slice
格式
x.slice(start, end)

使用注解

x代表数组对象
start表示开始位置索引
end是结束位置下一数组元素索引编号
第一个数组元素索引为0
start、end可为负数,-1代表最后一个数组元素
end省略则相当于从start位置截取以后所有数组元素
<script>

    var arr1=['a','b','c','d','e','f','g','h'];
    var arr2=arr1.slice(2,4);
    var arr3=arr1.slice(-5,-1)

    console.log(arr2.toString())
    console.log(arr3)

</script>

结果为:

  •  增删子数组
格式
x. splice(start, deleteCount, value, ...)

使用注解

x代表数组对象
splice的主要用途是对数组指定位置进行删除和插入
start表示开始位置索引
deleteCount删除数组元素的个数,为0时表示添加元素
value表示在删除位置插入的数组元素
value参数可以省略
<script>
    //增删子数组:x.splice(start, deleteCount, value, ...)
    var a = [1,2,3,4,5,6,7,8];
    a.splice(1,2);
    //a变为 [1,4,5,6,7,8]
    console.log(a.toString());

    a.splice(1,0,9,10);
    //a变为[1,9,10,4,5,6,7,8]
    console.log(a.toString());
</script>

结果为:

  •  数组的进出栈操作(1)——在尾部操作
push,pop这两个方法模拟的是一个栈操作

x.push(value, ...)  压栈--添加
x.pop()             弹栈--删除      

使用注解

x代表数组对象
value可以为字符串、数字、数组等任何值
push是将value值添加到数组x的结尾
pop是将数组x的最后一个元素删除
<script>
    //push pop:栈操作--在尾部插入
    var arr7=[1,2,3];
    arr7.push([7,8,0]);
    arr7.push('hello',5);
    console.log(arr7);
    console.log(arr7.length);

    console.log(arr7.pop());
    console.log(arr7.pop());
    console.log(arr7.length);
</script>

结果为:

  •  数组的进出栈操作(2)——在头部操作
unshift,shift 
x.unshift(value,...) 添加 x.shift() 删除 使用注解 x代表数组对象 value可以为字符串、数字、数组等任何值 unshift是将value值插入到数组x的开始 shift是将数组x的第一个元素删除
<script>
    var arr8=[4,5,6];
    arr8.unshift([11,222]);
    arr8.unshift(true,'yes');
    console.log(arr8);
    console.log(arr8.length);

    arr8.shift();
    console.log(arr8);
    console.log(arr8.length);
</script>

结果为:

  •  总结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);//8
         arr5[10] = "hahaha";
         alert(arr5.length); //11
         alert(arr5[9]);// undefined */
View Code
  • Function 对象(重点)

  • 函数的创建方式——两种

方式一:

function 函数名 (参数){

    函数体;
    return 返回值;
}

方式二:基本不用,可以印证函数也是对象

var 函数名 = new Function("参数1","参数n","函数体");
<script>

    //函数的创建方式一
    function f(x,y){
        alert(123);
        return x+y      // 没有return默认返回null
    }

    console.log(f(23,5678));


    foo('xialv');    //可以在函数定义前调用
    
    function foo(name){
        console.log('hello'+name)
    }


    //函数的创建方式二 -- 基本不用

    var obj=new Function('name', 'console.log(\'hello\'+name)');
    
    obj('wuda');

</script>
  • 功能说明:

  1. 可以使用变量、常量或表达式作为函数调用的参数
  2. 函数由关键字function定义
  3. 函数名的定义规则与标识符一致,大小写是敏感的
  4. 返回值必须使用return

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

注意:js的函数加载执行与python不同,它是整体加载完才会执行,所以执行函数放在函数声明上面或下面都可以

  • Function 对象的 length 属性

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

console.log(foo.length);    //length在函数中是计算的是参数的个数
  • Function 对象的方法

 Function 对象也有与所有对象共享的 valueOf() 方法和 toString() 方法。这两个方法返回的都是函数的源代码,在调试时尤其有用。

alert(void(fun1(1,2)))

运算符void()作用:拦截方法的返回值

  • 函数的调用

<script>
  
    function add(x,y,z){
        return x+y+z
    }
// 只要函数名写对即可,参数怎么填都不报错
console.log(add(
1,2,3,4,5,6)); console.log(add(1,2)); //参数不够,传入undefined console.log(add('hello','world')); </script>

结果为:

<script>

    function f(x,y){
        return x+y
    }

    var f=1;
    var b=2;
    f(f,b)

<script>

结果为:
报错:f is not a function
面试题
  • 函数的内置对象arguments

<script>

    function f(a,b){
        console.log(arguments);
        console.log(arguments[0]);
        console.log(arguments[1]);
        console.log(arguments[2]);
        console.log(arguments[3]);
        console.log(arguments[4]);
        console.log(arguments[5]);
        return a+b
    }

    f(1,2,45,6,7,78);

</script>

结果为:

  • arguments的用处一
<script>

    function ADD(){
        var sum=0;
        for (var i=0;i<arguments.length;i++){
            sum += arguments[i]
        }
        return sum
    }

    console.log(ADD(1,2,34,5,6,3));

</script>

结果为:

  •  arguments的用处二
<script>

    function f(a,b,c){
        if (arguments.length!=3){
            throw new Error("function f called with "+arguments.length+" arguments,but it just need 3 arguments")
        }
        else {
            alert("success!")
        }
    }

    f(1,2,3,4,5);

</script>

结果为:

  • 匿名函数

<script>   
    //1
    var func=function(arg){
        alert(arg)
    };

    func('hello');  //匿名函数不提前加载


    //2 这种方式也叫自执行函数
    (function(arg){
        alert(arg)
    })('YUAN')

</script>   

结果为:

 

  • 函数的作用域链和闭包

  • 作用域

js函数的作用域和python相似,if while等控制语句并没有自己作用域,而函数是有自己的作用域的

<script>

    if (1){
        var x=10;
    }
    console.log(x);


    function f(){
        var y=12;
    }
    console.log(y);

</script>

结果为:

  •  嵌套函数的作用域:

例1:

<script>

    var city = 'beijing';

    function func(){
        var city = 'shanghai';
        function inner(){
            var city = 'shenzhen';
            console.log(city);
        }
        inner();
    }
    func();

</script>

结果为:

 例2:

<script>

    var city = 'beijing';
function Bar(){ console.log(city); }
function func(){ var city = 'shanghai'; return Bar; }
var ret = func(); ret(); //beijing </script>

结果为:

  •  闭包

<script>

    var city = 'beijing';

    function func(){
        var city = "shanghai";
        
        function inner(){
            console.log(city);
        }
        return inner;
    }
    
    var ret = func();
    ret();

</script>

结果为:

  • BOM对象

BOM(浏览器对象模型),可以对浏览器窗口进行访问和操作。使用 BOM,开发者可以移动窗口、改变状态栏中的文本以及执行其他与页面内容不直接相关的动作。

使 JavaScript 有能力与浏览器“对话”。 

  • Window对象

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

alert()            显示带有一段消息和一个确认按钮的警告框
confirm()          显示带有一段消息以及确认按钮和取消按钮的对话框
prompt()           显示可提示用户输入的对话框

open()             打开一个新的浏览器窗口或查找一个已命名的窗口
close()            关闭浏览器窗口
setInterval()      按照指定的周期(以毫秒计)来调用函数或计算表达式
clearInterval()    取消由 setInterval() 设置的 timeout
setTimeout()       在指定的毫秒数后调用函数或计算表达式
clearTimeout()     取消由 setTimeout() 方法设置的 timeout
scrollTo()         把内容滚动到指定的坐标
window.onscroll = function(){} 监听滑轮位置, 只要滑轮动就执行里面的代码
<script>
    //window对象的方法
    //alert
    window.alert('hello');

    //confirm
    var ret=window.confirm('hello Yuan');
    console.log(ret);

    //prompt
    var ret2=window.prompt('hello....');
    console.log(ret2);

</script>

结果为:

1、alert

 2、confirm

 选择确定,传入true;选择取消,传入false

 3、promt

 输入内容,选择确认,传入所写内容;选择取消,传入null

<script>
    open('http://www.baidu.com')
</script>

结果为:跳转到百度

<script>
    setInterval(f,1000);

    function f() {
        console.log('hello')
    }
</script>

结果为:

  • setInterval和clearInterval应用

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        #id1{
            width:200px;
            height:50px;
        }

    </style>

</head>
<body>


<input type="text" id="id1" onclick="begin()">
<button onclick="end()">停止</button>


<script>

    function showTime(){
        var current_time=new Date().toLocaleString();
        var ele=document.getElementById('id1');

        ele.value=current_time
    }

    var clock1;

    function begin(){
        if (clock1==undefined) {
            showTime();    // 先showtime一下,避免等1秒才能看见时间
            clock1 = setInterval(showTime, 1000)
        }
    }

    function end() {
        clearInterval(clock1);
        clock1=undefined;
    }


</script>


</body>
</html>
时间显示的应用

结果为:

  • setTimeout和clearTimeout应用

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>


<script>
    function f(){
        console.log('hello...')
    }
    var c=setTimeout(f,1000);    //1秒之后只执行一次f
    clearTimeout(c)

</script>
</body>
</html>
View Code

结果为:

  • History 对象

  • History 对象属性

History 对象包含用户(在浏览器窗口中)访问过的 URL

History 对象是 window 对象的一部分,可通过 window.history 属性对其进行访问

length  返回浏览器历史列表中的 URL 数量
  • History 对象方法

back()    加载 history 列表中的前一个 URL
forward()    加载 history 列表中的下一个 URL
go()    加载 history 列表中的某个具体页面
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<a href="js_history2.html">click</a>

<button onclick="history.forward()">>>>>></button>
<!--<button onclick="history.go(1)">>>>>></button>-->
</body>
</html>
history功能展示页面1
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>


<button onclick="history.back()">back</button>
<!--<button onclick="history.go(-1)">back</button>-->
</body>
</html>
history功能展示页面2
  • Location 对象

Location 对象包含有关当前 URL 的信息。

Location 对象是 Window 对象的一个部分,可通过 window.location 属性来访问

  • Location 对象方法

location.assign(URL)    跳转到链接,可以后退
location.reload()          刷新
location.replace(newURL)    替换当前链接,不能后退,两个在同一层级
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<button onclick="f()">click</button>

<script>
    function f(){
        // location.assign('http://www.baidu.com')    //跳转到链接,可以后退
        // location.reload()    //刷新
        location.replace('http://www.baidu.com')    //替换当前链接,不能后退,两个在同一层级
    }



</script>
</body>
</html>
View Code
  • DOM对象(DHTML)

  • 什么是 DOM?

DOM 是 W3C(万维网联盟)的标准。DOM 定义了访问 HTML 和 XML 文档的标准:

W3C 文档对象模型(DOM)是中立于平台和语言的接口,它允许程序和脚本动态地访问和更新文档的内容、结构和样式。

W3C DOM 标准被分为 3 个不同的部分:

  1. 核心 DOM - 针对任何结构化文档的标准模型
  2. XML DOM - 针对 XML 文档的标准模型
  3. HTML DOM - 针对 HTML 文档的标准模型
  • 什么是 XML DOM?  ---->XML DOM 定义了所有 XML 元素的对象和属性,以及访问它们的方法。
  • 什么是 HTML DOM?---->HTML DOM 定义了所有 HTML 元素的对象和属性,以及访问它们的方法。
  • DOM 节点 

根据 W3C 的 HTML DOM 标准,HTML 文档中的所有内容都是节点(NODE):

  • 整个文档是一个文档节点(document对象)
  • 每个 HTML 元素是元素节点(element 对象)
  • HTML 元素内的文本是文本节点(text对象)
  • 每个 HTML 属性是属性节点(attribute对象)
  • 注释是注释节点(comment对象)

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

节点(自身)属性:

  • attributes - 节点(元素)的属性节点
  • nodeType – 节点类型
  • nodeValue – 节点值
  • nodeName – 节点名称
  • innerHTML - 节点(元素)的内容
  • innerText - 节点(元素)中的文本内容
<body>

<div class="div1">
    <p name="littleP" class="p1">hello p</p>
    <div class="div2">hello div
        <div>div3</div>
        <a href="">click</a>
    </div>
    <span>span</span>
</div>

<span>spanspanspanspan</span>

<div>hhhhh</div>

<script>
    var ele=document.getElementsByClassName('p1')[0];
    
    console.log(ele);
    console.log(ele.nodeName);
    console.log(ele.nodeType);
    console.log(ele.nodeValue);
    console.log(ele.innerHTML);    
    console.log(ele.innerText);
</script>
</body>

结果为:

// 通过属性修改标签里的内容

ele.innerHTML='hello world';

导航属性:后4个可能会取到空白节点,建议使用带Element的推荐导航属性

  • parentNode - 节点(元素)的父节点 (推荐)
  • firstChild – 节点下第一个子元素
  • lastChild – 节点下最后一个子元素
  • childNodes - 节点(元素)的子节点 
  • nextSibling- 节点(元素)的兄弟节点 

推荐导航属性:

parentElement              // 父节点标签元素

children                        // 所有子标签
  
firstElementChild          // 第一个子标签元素

lastElementChild           // 最后一个子标签元素

nextElementtSibling       // 下一个兄弟标签元素

previousElementSibling  // 上一个兄弟标签元素
<body>

<div class="div1">
    <p name="littleP" class="p1">hello p</p>
    <div class="div2">hello div
        <div>div3</div>
        <a href="">click</a>
    </div>
    <span>span</span>
</div>

<span>spanspanspanspan</span>

<div>hhhhh</div>

<script>
    var ele=document.getElementsByClassName('p1')[0];

    var p_ele=ele.parentNode;
    console.log(p_ele.nodeName);

    var b_ele=ele.nextSibling;   //按节点找,空文本也算节点
    console.log(b_ele.nodeName);

    var b_ele2=ele.nextElementSibling;    //按标签找,推荐使用
    console.log(b_ele2.nodeName);
    console.log(b_ele2.innerHTML);
</script>

</body>

结果为:

 

节点树中的节点彼此拥有层级关系

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

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

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

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

全局查找标签:

  • 通过使用 document.getElementById() 方法 
  • 通过使用 document.getElementsByTagName() 方法 
  • 通过使用 document.getElementsByClassName() 方法 
  • 通过使用 document.getElementsByName() 方法 

局部查找标签:仅支持以下两种方法

  • 使用 element.getElementsByTagName() 方法 
  • 使用 element.getElementsByClassName() 方法 
<body>

<div class="div1">
    <p name="littleP" class="p1">hello p</p>
    <div class="div2">hello div
        <div>div3</div>
        <a href="">click</a>
    </div>
    <span>span</span>
</div>

<span>spanspanspanspan</span>

<div>hhhhh</div>

<script>
    var ele3=document.getElementsByClassName('div1')[0];
    console.log(ele3.children);
    console.log(ele3.children[1].children);
</script>

</body>

结果为:

<body>

<div class="div1">
    <p name="littleP" class="p1">hello p</p>
    <div class="div2">hello div
        <div>div3</div>
        <a href="">click</a>
    </div>
    <span>span</span>
</div>

<span>spanspanspanspan</span>

<div>hhhhh</div>

<script>
    
    // eg:
    var ele4=document.getElementsByName('littleP')[0];
    var ele5=ele4.nextElementSibling;
    console.log(ele5.innerHTML);    // 标签里的全部内容
    console.log(ele5.innerText);    // 标签的全部文本内容
    
    ele5.innerHTML="<h1>YUAN</h1>";

</script>

</body>

结果为:

                                   

 局部查找:

<body>

<div class="div1">
    <p name="littleP" class="p1">hello p</p>
    <div class="div2">hello div
        <div>div3</div>
        <a href="">click</a>
    </div>
    <span>span</span>
</div>

<span>spanspanspanspan</span>

<div>hhhhh</div>

<script>
    
    //局部查找
    var ele6=document.getElementsByClassName('div1')[0];
    var ele7=ele6.getElementsByTagName('span');
    console.log(ele7[0].innerHTML);

</script>

</body>

结果为:

  • HTML DOM Event(事件)

HTML 4.0 的新特性之一是有能力使 HTML 事件触发浏览器中的动作(action),比如当用户点击某个 HTML 元素时启动一段 JavaScript。下面是一个属性列表,这些属性可插入 HTML 标签来定义事件动作。

onclick        当用户点击某个对象时调用的事件句柄
ondblclick     当用户双击某个对象时调用的事件句柄

onfocus        元素获得焦点               //练习:输入框
onblur         元素失去焦点               应用场景:用于表单验证,用户离开某个输入框时,代表已经输入完了,我们可以对它进行验证.
onchange       域的内容被改变             应用场景:通常用于表单元素,当元素内容被改变时触发(三级联动)

onkeypress     某个键盘按键被按下并松开
onkeydown      某个键盘按键被按下          应用场景: 当用户在最后一个输入框按下回车按键时,表单提交
onkeyup        某个键盘按键被松开
onload         一张页面或一幅图像完成加载
onmousedown    鼠标按钮被按下
onmousemove    鼠标被移动
onmouseout     鼠标从某元素移开
onmouseover    鼠标移到某元素之上
onmouseleave   鼠标从元素离开

onselect      文本被选中
onsubmit      确认按钮被点击
  • 两种为元素附加事件属性的方式

<div id="abc" onclick="func1(this)">事件绑定方式1</div>

<script>
    function func1(self){    // self可以为除this以外的任何命名
        console.log(self.id)
    }

    //jquery下是$(self), 这种方式this参数必须填写;
</script>

//------------------------------------------
    
<div id="id123">事件绑定方式2</div>
<script>
    var ele=document.getElementById("id123").onclick=function(){
         console.log(this.id);
        //jquery下是$(this), 这种方式不需要this参数;
    }
    
</script>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<p onclick="func(this)">hello</p>

<div>hello DIV</div>

<script>
    //绑定事件方式一
    function func(self) {
        console.log(self);
        alert(1234)
    }

    //绑定事件方式二
    var ele=document.getElementsByTagName('div')[0];
    ele.onclick=function (){
        console.log(this);   //this指的是调用函数的那个标签
        alert(6666)
    }
</script>


</body>
</html>
样例

1、方式一举例:

<body>

<div class="v1">
    <div class="v2">dddd</div>
    <div class="v2">dddd</div>
    <div class="v2">dddd</div>
    <div class="v2">dddd</div>
    <div class="v2">dddd</div>
    <p id="p1" onclick="func(this)">pppppp</p>
</div>

<script>
    function func(that) {
        console.log(that);
        console.log(that.previousElementSibling);
        console.log(that.parentNode)
    }

</script>
</body>

点击p标签结果为:

 

 2、方式二举例:

<body>

<div class="v1">
    <div class="v2">dddd</div>
    <div class="v2">dddd</div>
    <div class="v2">dddd</div>
    <div class="v2">dddd</div>
    <div class="v2">dddd</div>
    <p id="p1">pppppp</p>
</div>

<script>

    // 绑定单个标签
    var ele=document.getElementById('p1');
    ele.onclick=function () {
         alert(123);
     console.log(this) };
// 绑定一类的多个标签 var ele2=document.getElementsByClassName('v2'); for (var i=0;i<ele2.length;i++){ ele2[i].onclick=function() { alert(555) } } </script> </body>

点击p标签结果为:

 

点击div标签结果为:

 3、输入框绑定事件举例:获取焦点和失去焦点事件

<body>
<input type="text" id="search" value="请输入用户名" onfocus="f1()" onblur="f2()">


<script>
    var ele=document.getElementById('search');

    function f1() {
        if(ele.value=='请输入用户名') {
            ele.value = '';
        }
    }
    
    function f2() {
        if (!ele.value.trim()) {
            ele.value = '请输入用户名';
        }
    }
</script>
</body>

结果为:

  • onload

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

1、使用方法一:window.onload=function(){}

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script>
        window.onload=function() {
            var ele=document.getElementsByClassName('div1')[0];
            console.log(ele.innerHTML)
        };

        // function f() {
        //     var ele=document.getElementsByClassName('div1')[0];
        //     console.log(ele.innerHTML)
        // }

    </script>
</head>
<body>
<!--<body onload="f()"></body>-->

<div class="div1">hello div</div>



</body>
</html>

2、使用方法二:<body onload="f()">

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script>

        function f() {
            var ele=document.getElementsByClassName('div1')[0];
            console.log(ele.innerHTML)
        }

    </script>
</head>
<body onload="f()">

<div class="div1">hello div</div>

</body>
</html>
  • onsubmit

 是当表单在提交时触发,该属性也只能给form元素使用,先触发onsubmit绑定的函数,再触发form表单往后端发送信息的功能

应用场景:在表单提交前验证用户输入是否正确,如果验证失败,在该方法中我们应该阻止表单的提交

<form id="form">
            <input type="text"/>
            <input type="submit" value="点我!" />
</form>

<script type="text/javascript">

            // 阻止表单提交方式1:return false
            //onsubmit 命名的事件函数,可以接受返回值,其中返回false表示拦截表单提交,其他为放行
            var ele=document.getElementById("form");
                ele.onsubmit=function() {
                     alert("验证失败 表单不会提交!");
                     return false


            // 阻止表单提交方式2:event.preventDefault() ==>通知浏览器不要执行与事件关联的默认动作
            var ele=document.getElementById("form");
            ele.onsubmit=function(event) {
                 alert("验证失败 表单不会提交!");
                 event.preventDefault()
    }
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<form action="" id="form1">
    <input type="text" name="username">
    <input type="submit" value="提交">
</form>


<script>
    var ele=document.getElementById('form1');
    ele.onsubmit=function(e){
        // console.log('hello')
        alert(1234);

        // return false
        e.preventDefault()
    }
</script>

</body>
</html>
  • Event 对象

Event 对象代表事件的状态,比如事件在其中发生的元素、键盘按键的状态、鼠标的位置、鼠标按钮的状态

事件通常与函数结合使用,函数不会在事件发生前被执行!event对象在事件发生时系统已经创建好了,并且会在事件函数被调用时传给事件函数,我们获得仅仅需要接收一下即可

比如onkeydown,我们想知道哪个键被按下了,需要问下event对象的属性,这里就是KeyCode

阻止事件传播:stopPropagation()

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        .outer{
            width:300px;
            height:300px;
            background-color: antiquewhite;
        }
        .inner{
            width:100px;
            height:100px;
            background-color: rebeccapurple;
        }
    </style>
</head>
<body>

<div class="outer" onclick="func2()">
    <div class="inner"></div>
</div>

<script>
    
    var ele=document.getElementsByClassName('inner')[0];
    ele.onclick=function (e){
        alert('I am inner!');
        e.stopPropagation()
    };


    function func2(){
        alert('I am outer!')
    }
</script>
</body>
</html>

结果为:

  • 增删改查演示

  • node的增删改查

createElement(name)  创建元素
appendChild()  添加元素

获得要删除的元素
获得它的父元素
使用removeChild()方法删除


第一种方式:

      使用上面增和删结合完成修改

第二中方式:

      使用replaceChild(new, old)进行修改

使用setAttribute();方法修改属性          

使用innerHTML属性修改元素的内容

在增加元素和修改元素的时候,可以
  
1、使用setAttribute()方法进行为元素增加或修改属性
也可以通过"="的方法进行增加或修改属性      
    

2、使用innerHTML属性进行增加或修改元素的内容

查:使用之前介绍的方法

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        .div1,.div2,.div3,.div4{
            width:300px;
            height:100px;
        }
        .div1{
            background-color: green;
        }
        .div2{
            background-color: yellow;
        }
        .div3{
            background-color: rebeccapurple;
        }
        .div4{
            background-color: deeppink;
        }
    </style>
</head>
<body>
<div class="div1">
    <button onclick="add()">add</button>
    hello div1
</div>
<div class="div2">
    <button onclick="del()">del</button>
    hello div2
</div>
<div class="div3">
    <button onclick="change()">change</button>
    <p>hello div3</p>
</div>
<div class="div4">hello div4</div>


<script>
    function change() {
        var img=document.createElement('img');  //<img src="">
        //img.setAttribute('src','psj.jpg');
        img.src='psj.jpg';

        var ele=document.getElementsByTagName('p')[0];
        var father=document.getElementsByClassName('div3')[0];
        father.replaceChild(img, ele)
    }

    function add(){
        var ele=document.createElement('p')   //<p></p>
        ele.innerHTML='<h1>hello p</h1>';
        //ele.innerText='<h1>hello p</h1>';
        ele.style.color='red';
        ele.style.fontSize='10px';
        var father=document.getElementsByClassName('div1')[0];
        father.appendChild(ele)
    }

    function del() {
        var father=document.getElementsByClassName('div1')[0];
        var son=father.getElementsByTagName('p')[0];
        father.removeChild(son)
    }

</script>
</body>
</html>

结果为:

  • 修改 HTML DOM 

  • 改变 HTML 内容 

        改变元素内容的最简答的方法是使用 innerHTML ,innerText,例如:

ele.innerHTML='<h1>hello p</h1>'
  • 改变 CSS 样式 
<p id="p2">Hello world!</p>
document.getElementById("p2").style.color="blue";
                             .style.fontSize=48px    // css里的类似 font-size 样式在js里变为 fontSize 格式
  • 改变 HTML 属性 

        elementNode.setAttribute(name,value),也可以用过"="进行操作

        elementNode.getAttribute(name) --------------> elementNode.value(DHTML)

  • 创建新的 HTML 元素 

        createElement(name)

  • 添加新的HTML元素

        elementNode.appendChild(node)

  • 删除已有的 HTML 元素 

        elementNode.removeChild(node)

  • 关于class属性的操作 

        elementNode.className

        elementNode.classList.add

        elementNode.classList.remove

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<div class="div1 div2">div1</div>


<script>
    var ele=document.getElementsByTagName('div')[0];

    console.log(ele.className);
    console.log(ele.classList[0]);
    console.log(ele.classList[1]);
    ele.classList.add('hide');
    console.log(ele.className);

</script>

</body>
</html>

结果为:

 

  •  一些练习

  • 模态对话框

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        .content{
            height:1800px;
            background-color: white;
        }

        .shade{
            position:fixed;
            top:0;
            left:0;
            right:0;
            bottom:0;
            background-color: gray;
            opacity:0.7;
        }

        .model{
            width:200px;
            height:200px;
            background-color: bisque;
            position:absolute;  /*用fixed会锁定在窗口中间*/
            top:50%;
            left:50%;
            margin-top: -100px;
            margin-left: -100px;

        }

        .hide{
            display: none;
        }

    </style>

</head>
<body>

<div class="content">
    <button onclick="show()">show</button>
    hellohellohellohellohellohellohellohellohello
</div>

<div class="shade hide"></div>

<div class="model hide">
    <button onclick="cancel()">cancel</button>
</div>


<script>
    function show(){
        var ele_shade=document.getElementsByClassName('shade')[0];
        var ele_model=document.getElementsByClassName('model')[0];

        ele_model.classList.remove('hide');
        ele_shade.classList.remove('hide');
    }

    function cancel(){
        var ele_shade=document.getElementsByClassName('shade')[0];
        var ele_model=document.getElementsByClassName('model')[0];

        ele_shade.classList.add('hide');
        ele_model.classList.add('hide');
    }
</script>
</body>
</html>
View Code
  • 全选反选取消

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<button onclick="selectAll()">全选</button>
<button onclick="Cancel()">取消</button>
<button onclick="reverse()">反选</button>
<hr>
<table border="1px">
    <tr>
        <td><input type="checkbox"></td>
        <td>111</td>
        <td>111</td>
        <td>111</td>
    </tr>
    <tr>
        <td><input type="checkbox"></td>
        <td>222</td>
        <td>222</td>
        <td>222</td>
    </tr>
    <tr>
        <td><input type="checkbox"></td>
        <td>333</td>
        <td>333</td>
        <td>333</td>
    </tr>
</table>

<script>
    function selectAll(){
        var inputs=document.getElementsByTagName('input');
        for (var i=0;i<inputs.length;i++){
            var input=inputs[i];
            input.checked=true;
        }
    }

    function Cancel(){
        var inputs=document.getElementsByTagName('input');
        for (var i=0;i<inputs.length;i++){
            var input=inputs[i];
            input.checked=false;
        }
    }

    function reverse(){
        var inputs=document.getElementsByTagName('input');
        for (var i=0;i<inputs.length;i++){
            var input=inputs[i];
            input.checked=!input.checked

        //     if(input.checked){
        //         input.checked=false
        //     }else{
        //         input.checked=true
        //     }
        }
    }

</script>
</body>
</html>
View Code
  • 两级联动

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<select id="provinces">
    <option value="">请选择省份</option>
    <!--<option value="">河北省</option>-->
</select>

<select name="" id="cities">
    <option value="">请选择城市</option>
</select>


<script>

    // a={name:'alex'};
    // b={'name':'alex'};
    // console.log(a.name);
    // console.log(b['name']);
    //
    //
    // data={'河北':['石家庄','廊坊'], '山西':['晋城','大同'], '陕西':['西安','延安']};
    // console.log(data);
    // console.log(typeof data);
    // console.log(data['河北']);
    // console.log(data.河北);
    //
    // for (var i in data){
    //     console.log(i);
    // }


    data={'河北':['石家庄','廊坊'], '山西':['晋城','大同'], '陕西':['西安','延安']};
    var pro_ele=document.getElementById('provinces');
    var city_ele=document.getElementById('cities');

    for (var i in data){
        var ele=document.createElement('option');
        ele.innerHTML=i;
        pro_ele.appendChild(ele)
    }

    pro_ele.onchange=function(){
        console.log(this.selectedIndex);
        console.log(this.options[this.selectedIndex]);

        var cities=data[this.options[this.selectedIndex].innerHTML];

        // city_ele.options.length=0;    //保留option的前n行
        city_ele.options.length=1;    //保留option的前n行

        for(var i=0;i<cities.length;i++){
            var ele=document.createElement('option');
            ele.innerHTML=cities[i];
            city_ele.appendChild(ele)
        }
    }





</script>
</body>
</html>
View Code
  • select左右移

<div id="box1">
    <select multiple="multiple" size="10" id="left">
        <option>book</option>
        <option>book2</option>
        <option>book3</option>
        <option>book4</option>
        <option>book5</option>
        <option>book6</option>
    </select>
</div>


<div id="choice">
    <input class="add"     type="button" value="--->" onclick="add()"><br>
    <input class="remove"  type="button" value="<---" onclick="remove();"><br>
    <input class="add-all" type="button" value="====>" onclick="ADDall()"><br>
    <input class="remove-all" type="button" value="<===" onclick="remall()">
</div>


<div>
    <select multiple="multiple" size="10" id="right">
        <option>book9</option>
    </select>
</div>

<script>

     function add(){
         var right=document.getElementById("right");
         var options=document.getElementById("left").getElementsByTagName("option");

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

             var option=options[i];

             if(option.selected==true){
                   right.appendChild(option);
                 i--;
             }

         }

     }

    function ADDall(){
         var right=document.getElementById("right");
         var options=document.getElementById("left").getElementsByTagName("option");
         for (var i=0; i<options.length;i++){
             var option=options[i];
             right.appendChild(option);
             i--;

         }

     }

</script>
View Code

posted @ 2020-02-20 20:03  江畔何人初见月/  阅读(271)  评论(0)    收藏  举报