1. 1. JavaScript
    1. 1.1. JavaScript简介
    2. 1.2. JavaScript基础四用法:
    3. 1.3. JavaScript入门
      1. 1.3.1. 字面量和变量概述
        1. 1.3.1.1. 字面量概述:
        2. 1.3.1.2. 变量概述:
          1. 1.3.1.2.1. 变量类型:
          2. 1.3.1.2.2. 声明须知:
      2. 1.3.2. JavaScript函数
      3. 1.3.3. JavaScript对象
        1. 1.3.3.1. 创建对象(介绍两种方法)
          1. 1.3.3.1.1. 对象字面量:
          2. 1.3.3.1.2. 使用构造函数:
        2. 1.3.3.2. 对象属性和方法
        3. 1.3.3.3. this关键字
        4. 1.3.3.4. new关键字
      4. 1.3.4. JavaScript语句
        1. 1.3.4.1. 分支语句
          1. 1.3.4.1.1. if 语句
          2. 1.3.4.1.2. switch语句
        2. 1.3.4.2. 循环语句
          1. 1.3.4.2.1. for语句
            1. 1.3.4.2.1.1. for …in
            2. 1.3.4.2.1.2. for …of
            3. 1.3.4.2.1.3. 二者区别
          2. 1.3.4.2.2. while语句
    4. 1.4. JavaScript变量
      1. 1.4.1. JavaScript字符串及方法
        1. 1.4.1.1. 语法
          1. 1.4.1.1.1. **${}**语法:如下:
          2. 1.4.1.1.2. 字符串基元和字符串对象
        2. 1.4.1.2. 方法
      2. 1.4.2. JavaScript数值及方法
        1. 1.4.2.1. 语法
          1. 1.4.2.1.1. NaN-非法数字:
          2. 1.4.2.1.2. JavaScript无穷
          3. 1.4.2.1.3. JavaScript基数
          4. 1.4.2.1.4. 数字基元和数字对象
      3. 1.4.3. JavaScript数组及方法
        1. 1.4.3.1. 语法
        2. 1.4.3.2. 方法
        3. 1.4.3.3. 数组迭代
          1. 1.4.3.3.1. Array.forEach(ex, index, Array)
          2. 1.4.3.3.2. Array.map(ex, index, Array)
          3. 1.4.3.3.3. Array.filter(ex, index, Array)
          4. 1.4.3.3.4. Array.find(ex, index, Array)
          5. 1.4.3.3.5. Array.findIndex(ex, index, Array)
          6. 1.4.3.3.6. Array.every(ex, index, Array)
    5. 1.5. JavaScript事件
      1. 1.5.1. 概述:
        1. 1.5.1.1. 使用事件的三种方式
          1. 1.5.1.1.1. 内联事件处理程序
          2. 1.5.1.1.2. 事件处理程序属性
          3. 1.5.1.1.3. 焦点事件
      2. 1.5.2. 事件监听
        1. 1.5.2.1. addEventListener()方法
          1. 1.5.2.1.1. 语法:
          2. 1.5.2.1.2. 将事件监听添加到元素
          3. 1.5.2.1.3. 将多个事件监听添加到同一元素
          4. 1.5.2.1.4. 传递参数
          5. 1.5.2.1.5. 将事件监听添加到Window对象
        2. 1.5.2.2. removeEventListener()方法
      3. 1.5.3. 事件传播
        1. 1.5.3.1. 原理
        2. 1.5.3.2. 停止事件传播
        3. 1.5.3.3. 访问目标元素
        4. 1.5.3.4. 防止默认动作
        5. 1.5.3.5. 事件委托
    6. 1.6. JS HTML DOM
      1. 1.6.1. 概述:
      2. 1.6.2. JS HTML DOM选择器
        1. 1.6.2.1. 按ID查找
        2. 1.6.2.2. 按标签查找
        3. 1.6.2.3. 按类名称查找
        4. 1.6.2.4. 通过CSS选择器查找
        5. 1.6.2.5. 通过HTML对象集合
      3. 1.6.3. JS DOM 改变HTML内容
        1. 1.6.3.1. 更改HTML内容
        2. 1.6.3.2. 改变输出流
        3. 1.6.3.3. 更改属性值
        4. 1.6.3.4. 向DOM添加新元素
        5. 1.6.3.5. 从DOM中删除现有元素
      4. 1.6.4. JS DOM 改变CSS
      5. 1.6.5. JS DOM 改变元素属性
        1. 1.6.5.1. 获取元素的属性值
        2. 1.6.5.2. 在元素上设置属性
        3. 1.6.5.3. 从元素中删除属性
      6. 1.6.6. JS DOM的Navigation
        1. 1.6.6.1. DOM节点
        2. 1.6.6.2. 在节点之间导航
          1. 1.6.6.2.1. 访问子节点
          2. 1.6.6.2.2. 访问父节点
          3. 1.6.6.2.3. 访问兄弟节点
          4. 1.6.6.2.4. DOM根节点
          5. 1.6.6.2.5. noteType属性
    7. 1.7. JavaScript对象
      1. 1.7.1. 基础
        1. 1.7.1.1. 概述:
        2. 1.7.1.2. JavaScript基元
      2. 1.7.2. 创建JavaScript对象
        1. 1.7.2.1. 使用对象常量
        2. 1.7.2.2. 使用new Object()
        3. 1.7.2.3. 使用构造函数
        4. 1.7.2.4. JavaScript对象是可变的
        5. 1.7.2.5. 比较对象
      3. 1.7.3. JavaScript 对象属性
        1. 1.7.3.1. 访问JavaScript属性
        2. 1.7.3.2. 添加新,修改旧属性
        3. 1.7.3.3. 删除对象属性
        4. 1.7.3.4. 遍历对象属性
      4. 1.7.4. JavaScript 对象方法
        1. 1.7.4.1. 概述:
        2. 1.7.4.2. 使用this作为对象引用
        3. 1.7.4.3. 添加新方法
        4. 1.7.4.4. Getters和Setters
        5. 1.7.4.5. Object.defineProperty()
      5. 1.7.5. JavaScript 对象构造函数
        1. 1.7.5.1. 不要将Number、String或Boolean声明为对象
      6. 1.7.6. JavaScript 对象原型及原型链
        1. 1.7.6.1. 原型
        2. 1.7.6.2. 原型链
          1. 1.7.6.2.1. 原型对象
          2. 1.7.6.2.2. JS原型链
      7. 1.7.7. JavaScript 类
        1. 1.7.7.1. 概述:
        2. 1.7.7.2. 类继承
        3. 1.7.7.3. JavaScript 静态方法

JavaScipt入门

JavaScript

JavaScript简介

  • JavaScript代码需要在<script>标签中写入
  • JavaScript代码可以在<head>,<body>以及外部文件中写入

JavaScript基础四用法:

  • 使用 window.alert() 弹出警告框。
  • 使用 document.write() 方法将内容写到 HTML 文档中。
  • 使用 innerHTML 写入到 HTML 元素。
  • 使用 console.log() 写入到浏览器的控制台。

1.window.alert()

1
2
3
<script>
window.alert(5 + 6);
</script>

2.document.write

1
2
3
<script>
document.write(HELLO);
</script>

3.innerHTML

1
2
3
<script>
document.getElementById("pq").innerHTML = 'is a handsome!';
</script>

4.console.log()

1
2
3
<script>
console.log(3 + 4);
</script>

JavaScript入门

字面量和变量概述

字面量概述:

在编程语言中,一般固定值称为字面量,如 3.14。数字,字符串,表达式,数组,对象,函数都可以作为字面量

变量概述:

  • 需要声明变量,用var声明,不需要声明数据类型,允许一个var声明多个变量
  • Value = undefined,在计算机程序中,经常会声明无值的变量。未使用值来声明的变量,其值实际上是 undefined
  • 重新声明 JavaScript 变量不会丢失原来的值
  • 变量值可以如python一样,直接转换值类型
变量类型:

**值类型(基本类型)**:字符串(String)、数字(Number)、布尔(Boolean)、空(Null)、未定义(Undefined)、Symbol。

引用数据类型(对象类型):对象(Object)、数组(Array)、函数(Function),还有两个特殊的对象:正则(RegExp)和日期(Date)。

声明须知:

字符串赋值不在意单或双引号

声明数组:var car=new Arroy(‘a’, ‘b’, ‘c’).;下标从0开始

或者:var cars=[“Saab”,”Volvo”,”BMW”];

声明布尔:var x=true; var y=false;

声明对象:var person={firstname:”John”, lastname:”Doe”, id:5566};

Undefined 和 Null:Undefined 这个值表示变量不含有值,可以通过将变量的值设置为 null 来清空变量。

对象须知:

访问对象属性的两种方式:A.a 或 A[‘a’]。

对象方法:A.a()

JavaScript函数

函数是由事件驱动的或者当它被调用时执行的可重复使用的代码块。

JavaScript函数名对大小写敏感。格式如下:

function myFunction(***var1***,***var2***)
{
*代码*
}

一个简单的文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>GRAAMMER</title>
</head>
<body>
<button onclick="pq()">点这里</button>
</body>
<script>
function pq(){
document.write('HELLO');
}
</script>
</html>

JavaScript对象

创建对象(介绍两种方法)

对象字面量:

var object {

name = pq;

age = 100;

}

使用构造函数:

function person(name, age) {

this.name = name;

this.age = age;

}

ver son = new person(pq, 19);

对象属性和方法

属性是对象中名称和值之间的关联,并且可以包含任何数据类型。

属性通常是指对象的特征。

方法是作为对象属性值的函数,因此是对象可以执行的任务。

方法存储在属性中作为函数定义

this关键字

this关键字是指代码被写入内部当前对象-所以在这种情况下,this等同于user

new关键字

当使用关键字声明JavaScript变量时,new关键字会使变量作为对象创建。

JavaScript语句

分支语句

if 语句

if 语句与C语言近乎一致,给一个模板即可:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
var a = 10, b = 20, c = 30;
var answer;

if (a > b) {
if (a > c) {
answer = "A 是三个中最大的";
} else {
answer = "C 是三个中最大的";
}
} else if (b > c) {
answer = "B 是三个中最大的";
} else {
answer = "C 是三个中最大的";
}

或者使用:condition ? A : B

当条件为true时进行A语句,否则进行B语句。

switch语句

switch 语句与C语言近乎一致,给一个模板即可:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
var day;
switch (new Date().getDay()) {
case 0:
day = "Sunday";
break;
case 1:
day = "Monday";
break;
case 2:
day = "Tuesday";
break;
case 3:
day = "Wednesday";
break;
case 4:
day = "Thursday";
break;
case 5:
day = "Friday";
break;
case 6:
day = "Saturday";
break;
default:
day = "Undefined Day";
}

同C语言一样,break与default必不可少。

循环语句

for语句

大体上与C语言一致

for …in

for…in循环迭代的对象的属性。

for(let i in objects) {

document.write(i);

}

for …of
二者区别

for...in 主要用于遍历对象的属性(键名),而 for...of 主要用于遍历可迭代对象的属性值。在处理数组等可迭代对象时,for...of 更常用,而在遍历对象属性时,for...in 更合适。

while语句

大体上与C语言一致

JavaScript变量

JavaScript字符串及方法

语法

  • 字符串对引号类型不做要求,但是必须保证引号不能提前闭合
  • 字符串之间用加号连接
**${}**语法:如下:
1
2
3
4
var str1 = "quick brown fox";
var str2 = "over the lazy dog";

var str3 = `The ${str1} jumps ${str2}.`;
  • 字符串转义序列:在JavaScript中,我们通过在字符\前面加上反斜杠()来实现此目的。
  • 长代码换行用 +
字符串基元和字符串对象

var pq = ‘man’;

var pq = new String(man);

二者弱等于,且无法比较

方法

  • str.length:返回字符串长度

  • str.concat(ex):拼接ex到str后面

  • str.ToupperCase()(TolowerCase):转为大(小)写

  • str.indexof(ex, num):返回ex第一次出现的位置,从第num处开始;可以将indexof替换成lastof

  • str.search(ex):查询ex第一个匹配项的位置

  • str.split(‘ex’):以ex为分割方式将str分割为字符数组

  • str.trim:字符串的两端删除空格,但不能去除字符串之间的空白,空格可以是制表符或空格

  • str.replace(ex1, ex2):将第一个匹配的ex1替换成ex2,ex1可使用正则进行全匹配

  • str.slice(num1,num2):提取字符串的一部分,并将其作为新字符串返回,而无需修改原始字符串。

  • str.charAt(num):返回字符串中指定索引处的字符

JavaScript数值及方法

语法

  • JavaScript只有一种数字类型,没有整数和浮点数的单独指定,用var声明

  • JavaScript中的数字被认为是准确的,最多15位数字。这意味着数字将在到达第16位后四舍五入

  • JavaScript数字允许用科学计数法e,与C语言类似

  • 字符串 + 数字的结果是拼接

  • 数值字符串可以执行数学表达式,但是数值加法不可执行

    NaN-非法数字:
    1
    var x = 50 / "(cainiaojc.com)";  // x  = NaN (Not a Number)

显而易见的

​ 使用全局JavaScript isNaN()函数来确定值是否为数字:

1
2
var x = 50 / "(cainiaojc.com)";
isNaN(x);// 返回true,因为x不是一个数字

​ 将值分配给NaN时,即使另一个数是合法数字,也将返回NaN

1
2
3
var x = NaN;
var y = 27;
var z = x + y; // z = NaN
JavaScript无穷

正无穷:Infinity,负无穷:-Infinity

1
2
var x = 5 / 0;   // 将返回无穷
var y = -5 / 0; // 将返回负无穷

数值上限:1.797693134862315E+308

数值下限:-1.797693134862316E+308

JavaScript基数

默认情况下,JavaScript将数字显示为以10基数的小数。

数字也可以用十六进制(基数16),二进制(基数2)和八进制(基数8)表示。

二进制前缀:0b

八进制前缀:0

十六进制前缀:0x

数字基元和数字对象

弱等于,但是不强等于,数值对象无法比较。

JavaScript数组及方法

语法

JavaScript中的数组是一种全局对象,用于在单个变量中存储多个值。

创建数组数组通常用于将相似数据类型的列表组合在一起,但是从技术上讲,它们可以包含任何值或值的混合,如下:

1
let myArray = [5, 22, "Arrow", "Bone", true, new Date()];

在上文中介绍了两种方法创建数组:方括号和new关键字(尽量避免new

1
let fruits = ["Apple", "Mango", "Banana", "Orange"];
1
let fruits = new Array("Apple", "Mango", "Banana", "Orange");

向数组添加元素

看个例子:

1
2
let fruits = ["Apple", "Mango", "Banana", "Orange"];
fruits[4] = "Guava";

一切正常,但是如果:

1
fruits[6] = "Strawberry";

跳过的都将创建值为空(“”)的元素

附:通过Array.length查看数组长度

方法

Array.toString():将数组转换为(逗号分隔)数组值的字符串。

Array.join(ex):将数组转换为( ex 分隔)数组值的字符串,默认是逗号。

Arrary.push(ex):添加元素ex到数组,并返回新的数组长度。

Array.unshift(ex1, ex2, ···):一个或多个新元素添加到数组的开头,并返回新的数组长度。

Array.pop():删除数组末尾的最后一个元素,并返回“popped out(弹出)”的值。

Array.shift():从数组中删除开始的第一个元素,并返回被“移出(shifted out)”的元素。

Array.splice(s_num, sum, ex):对现有元素和(或)添加新元素来更改数组。s_num为开始索引值,sum表示对多少个元素进行操作,ex为添加的元素。

Array.concat(array):Array与array合并。

Array.slice(begin, sum):将数组的一部分复制到新数组。如果省略第二个参数,则该slice()方法将切出数组的其余部分。允许使用负值。

Array.indexOf(ex):返回可以在数组中找到元素ex的第一个索引。如果ex在数组中不存在,返回 -1。lastindexOf()同理。

Array.fill(ex, begin, final):用一个静态值替换数组中的范围内的元素,左闭右开。

Array.reverse():反转数组中元素的顺序。

Array.sort():根据元素中的第一个字符对数组中的元素进行排序。 在第一个字符相同的情况下,它将继续向下一行并比较第二个字符,依此类推。先排大写。

数组迭代

Array.forEach(ex, index, Array)

该方法对数组的每个元素执行一次提供的函数(一个回调函数)

该函数带有3个参数,由于2个参数(索引,数组)是可选的,因此我们可以跳过它们:

  • 元素值(必填)
  • 元素索引(可选)
  • 数组本身(可选)
Array.map(ex, index, Array)

该方法返回一个新数组,不会改变原始数组。同时新数组中的元素为原始数组元素调用函数处理后的值,并按照原始数组元素顺序依次处理元素。

该方法与**Array.forEach(ex, index, Array)**类似

Array.filter(ex, index, Array)

该方法把Array的某些元素过滤掉,然后返回剩下的元素。其主要原理是 filter会把传入的函数依次作用于每个元素,然后根据返回值是 true 还是false决定保留还是丢弃该元素。

Array.reduce(result, ex, index, Array)

接收一个函数作为累加器,数组中的每个值(从左到右)开始缩减,最终计算为一个值。这在数字中很常见,例如找到数组中所有数字的总和。

该函数采用4个参数:

  • 初始值/先前返回的值(必填)
  • 元素值(必填)
  • 元素索引(可选)
  • 数组本身(可选)
Array.find(ex, index, Array)

该方法返回通过给定检测的数组中的第一个值。

Array.findIndex(ex, index, Array)

该方法返回通过给定检测的数组中的第一个索引值。

Array.every(ex, index, Array)

该方法用于检测数组所有元素是否都符合指定条件(通过函数提供检测)。

JavaScript事件

概述:

事件是在浏览器中发生的操作,可由用户或浏览器本身启动。

每个可用事件都有一个事件处理程序,该事件处理程序是代码块(通常是用户定义的JavaScript函数),将在事件触发时运行。

举几个例子:

  • 页面加载完成
  • 用户单击一个按钮
  • 用户滚动文档
  • 用户调整浏览器大小
  • 用户移动鼠标
  • 用户提交表单
  • 用户按下键盘上的一个键
  • HTML输入字段已更改

使用事件的三种方式

  • 内联事件处理程序
  • 事件处理程序属性
  • 事件监听器
内联事件处理程序

在HTML中,onclick 是一种事件属性(event attribute),它允许你为特定的HTML元素指定一个JavaScript代码块,在用户触发点击事件时执行这个代码块。具体说,onclick 属性用于定义鼠标单击事件的处理程序。

利用onclick属性,如下:

1
2
3
4
5
6
<h onclick="funOne(this)">Click me</h>
<script>
function funOne(self) {
self.innerHTML = 'As we know, PQ is a handsome!';
}
</script>

附:内联事件处理程序是开始理解事件的简单方法,但通常不应将其用于测试和教育目的之外。

事件处理程序属性

利用id属性,如下:

1
2
3
4
5
<p id="id_one">Well, I am a handsome.</p>
var id_one = document.getElementById('id_one')
id_one.onclick = function() {
id_one.innerHTML = 'The senctence is true.';
}
焦点事件

onmouseover当将指针设备(通常是鼠标)移动到元素或其子元素之一时,将触发该事件。

onmouseout当将指针设备(通常是鼠标)移离元素或其子元素之一时,将触发该事件。

事件监听

addEventListener()方法

该方法将事件处理程序附加到指定的元素。

语法:
1
element.addEventListener(event, listener, useCapture)

第一个参数是事件的类型(例如“ click”或“ mousemove”)。

第二个参数是事件发生时我们要调用的监听函数。

第三个参数是一个布尔值,指定是使用事件冒泡还是使用事件捕获。此参数是可选的。

注意,不要为事件使用“ on”前缀。使用“ click”代替“ onclick”。

将事件监听添加到元素

内部放入函数,如下:

1
2
3
4
5
6
<script>
const h1 = document.querySelector("h1")
h1.addEventListener("click", function() {
document.write('HHHHHHH')
})
</script>

外部引用,如下

1
2
3
4
h1.addEventListener('mouseenter', abc)
function abc() {
document.write('click, click')
}

注意:第二个参数填函数名,没有括号。

将多个事件监听添加到同一元素
1
2
3
document.querySelector("button").addEventListener("mouseenter", myFunc1);
document.querySelector("button").addEventListener("click", myFunc2);
document.querySelector("button").addEventListener("mouseout", myFunc3);
传递参数

传递参数值时,请使用匿名函数,该函数使用参数调用指定的函数:

示例

1
2
3
4
var btn = document.querySelector("button");
btn.addEventListener("click", function() {
myFunc(x, y);
});
将事件监听添加到Window对象

文档

1
2
3
document.addEventListener("click", function() {
alert("Hello World!!!");
});

窗口

1
2
3
window.addEventListener("resize", function() {
box.innerHTML = Math.random();
});

removeEventListener()方法

该方法从元素中删除一个或所有事件,语法与addEventListener()一致。

事件传播

事件传播是一种描述在Web浏览器中触发的事件“堆栈”的方法。

原理

有冒泡和捕获两种传播机制

语法:element.addEventListener(event, listener, useCapture)

“useCapture”缺省值为false,它将默认使用冒泡传播;而将值设置为true时,事件将使用捕获传播。

捕获阶段:

  • 浏览器将检查元素的最外层父级(html)是否在捕获阶段注册了onclick事件处理程序,如果是,则运行该事件处理程序。
  • 然后,它移动到的下一个元素并执行相同的操作,然后执行下一个,依此类推,直到到达实际单击的元素。

冒泡阶段,正好相反:

  • 浏览器检查在冒泡阶段实际单击的元素是否在其上注册了onclick事件处理程序,如果是,则运行该事件处理程序。
  • 然后,它移动到下一个直接父级元素,然后再执行下一个,依次类推,直到到达html元素为止。

停止事件传播

可以使用event.stopPropagation(),如下:

1
2
3
4
5
6
7
8
document.querySelector("div").addEventListener("click", myFunc);
document.querySelector("p").addEventListener("click", myFunc);
document.querySelector("a").addEventListener("click", myFunc);

function myFunc() {
alert("You clicked: "+ this.tagName);
event.stopPropagation();
}

访问目标元素

目标元素,即event.target

须知:在事件传播的捕获阶段,只有一个方向,即从最外层的祖先元素一直传播到目标元素。一旦到达目标元素,再往下传播到子元素的阶段,事件将进入冒泡阶段,这时才会再次触发事件处理程序。

目标元素是已生成事件的DOM节点。

例如,如果用户单击超链接,则目标元素是超链接。

目标元素的访问方式为event.target,在事件传播阶段不会更改。

防止默认动作

某些事件具有与之关联的默认操作。例如,如果您单击链接浏览器,则将您带到链接的目标,当您单击表单提交按钮时,浏览器将提交表单等等。您可以使用event.preventDefault()事件对象的方法来防止此类默认操作。

1
2
3
function myFunc() {
event.preventDefault();
}

但是,阻止默认操作并不能阻止事件传播;事件继续照常传播到DOM树。

事件委托

冒泡还使我们能够利用事件委托。

如果你想在点击时弹出一条消息,你可以在父

    上设置click事件监听器,它会弹出alert,例子如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    <ul id="parent-list">
    <li id="post-1">Item 1</li>
    <li id="post-2">Item 2</li>
    <li id="post-3">Item 3</li>
    <li id="post-4">Item 4</li>
    <li id="post-5">Item 5</li>
    <li id="post-6">Item 6</li>
    </ul>
    <script>
    document.getElementById("parent-list").addEventListener("click", function(event) {
    if(event.target && event.target.nodeName == "LI") {
    alert("List item " + event.target.id.replace("post-", "") + " was clicked!");
    }
    });
    </script>

    JS HTML DOM

    概述:

    文档对象模型,通常被称为DOM,是使网站交互的一个重要部分。

    文档对象模型表示被显示在一个窗口中的HTML文档。

    它是一个接口,允许JavaScript处理网站的内容,结构和样式。

    例子

    HTML DOM方法是可以对HTML元素执行的操作

    HTML DOM属性是可以设置或更改的HTML元素的

    在DOM中,所有HTML元素都定义为objects

    例子如下:

    1
    2
    3
    <script>
    document.getElementById("para").innerHTML = "Hello world";
    </script>

    getElementById()是方法,innerHTML是属性

    JS HTML DOM选择器

    简单来说就是定位器,有以下方法:

    • 通过ID查找HTML元素
    • 通过标签名称查找HTML元素
    • 通过类名称查找HTML元素
    • 通过CSS选择器查找HTML元素
    • 通过HTML对象集合查找HTML元素

    ID查找

    方法:getElementById()

    例子:var x = document.getElementById(“msg”);

    按标签查找

    方法:getelementsByTagName()

    例子:var x = document.getElementsByTagName(“p”);

    返回的是列表

    按类名称查找

    方法:getElementsByClassName()

    例子:var x = document.getElementsByClassName(“demo”);

    返回的是列表

    通过CSS选择器查找

    方法:querySelectorAll()

    例子:var x = document.querySelectorAll(“div”);

    通过HTML对象集合

    HTML文档中最顶层的元素可以直接用作文档属性。

    例子:

    1
    2
    var html = document.documentElement;
    var body = document.body;

    JS DOM 改变HTML内容

    更改HTML内容

    使用innerHTML属性,语法如下:

    1
    element.innerHTML = text

    须知:利用各种选择器返回的是元素对象。

    改变输出流

    使用**document.write()**方法

    须知:此方法仅在解析该文档时将内容写入当前文档。如果在页面加载后使用此方法,它将覆盖该文档中的所有现有内容。

    更改属性值

    语法:element.attribute = new value

    向DOM添加新元素

    document.createElement()

    1
    2
    3
    4
    5
    6
    <script>
    var new_h = document.createElement('h2');
    var new_h_con = document.createTextNode('HHHHH');
    new_h.appendChild(new_h_con);
    document.body.appendChild(new_h);
    </script>

    appendChild()方法将新元素添加到指定父节点的任何其他子节点的末尾

    body.insertBefore()

    但是,如果要在其他任何子项的开头添加新元素,则可以使用该insertBefore()方法.

    语法:body.insertBefore(newElement, body.childNodes[n]);

    从1开始,在n前面。

    从DOM中删除现有元素

    该removeChild()方法从DOM中删除子节点,如下:

    1
    2
    var div = document.getElementById("demo");
    div.removeChild(div.firstElementChild);

    JS DOM 改变CSS

    使用style属性将样式应用于特定的HTML元素。

    语法:element.style.property = ‘value’

    要获取实际上用于呈现元素的所有CSS属性的值,可以使用以下window.getComputedStyle()方法:

    1
    2
    let para = document.querySelector('p');
    let compStyles = window.getComputedStyle(para);

    JS DOM 改变元素属性

    获取元素的属性值

    getAttribute()方法用于获取元素上指定属性的当前值。

    语法:var a = element.getAttribute(property)

    在元素上设置属性

    setAttribute()方法用于设置指定元素上的属性的值。

    如果属性已经存在,则更新值;否则,将添加具有指定名称和值的新属性。

    语法:element.setAttribute(property, ex)

    将元素element的属性property设置为ex

    从元素中删除属性

    removeAttribute()方法用于从指定元素中删除属性。

    语法:element.removeAttribute(property)

    JS DOM的Navigation

    DOM节点

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

    • 整个文档是一个文档节点
    • 每个HTML元素都是一个元素节点
    • HTML元素内的文本是文本节点
    • 每个HTML属性都是一个属性节点(不建议使用)
    • 所有注释都是注释节点

    DOM HTML树

    在节点之间导航

    使用以下节点属性来导航:

    • parentNode
    • childNodes[nodenumber]
    • firstChild
    • lastChild
    • nextSibling
    • previousSibling
    访问子节点

    使用:element.childNode[]

    附:

    使用firstChildDOM节点的属性来访问节点的第一个直接子节点

    但是由于代码的规范化,两个标签间会有换行和空格,会创建一个**#text**节点。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <title>Node</title>
    </head>
    <body>
    <div id="1">
    <div id="2">
    <div id="3">
    <p id="4">
    HELLO
    </p>
    <p id="5">
    </p>
    </div>
    </div>
    </div>
    <script>
    var father = document.getElementById('4');
    var child = father.firstChild.textContent;
    document.getElementById('5').innerHTML = child;
    </script>
    </body>
    </html>

    将目标作为自己的父节点,可以获取自身文本内容。

    附:nodeName是element的一个只读属性,返回当前节点作为字符串的名称。

    访问父节点

    语法:element.parentElement

    访问兄弟节点

    使用previousSiblingnextSibling属性来访问DOM树中的上一个和下一个节点。

    DOM根节点

    以下两个属性允许访问整个文档:

    • document.body(head)
    • document.documentElement

    附:document.documentElement的功能更强大,可以显示标签里的所有内容。

    noteType属性

    该属性以数字形式返回指定节点的节点类型

    语法:element.noteType

    下表列出了最重要的节点类型:

    ELEMENT_NODE 1

    Hello, World

    ATTRIBUTE_NODE 2 class =“heading”(不建议使用)
    TEXT_NODE 3 Hello, World
    COMMENT_NODE 8 <!–这是注释–>
    DOCUMENT_NODE 9 HTML文档本身(的父级)
    DOCUMENT_TYPE_NODE 10 <!doctype html>

    JavaScript对象

    基础

    概述:

    对象是由属性方法的集合组成的数据类型。

    在JavaScript中,基本上所有东西都是对象:

    • 字符串可以是对象(如果使用new关键字定义)
    • 数字可以是对象(如果使用new关键字定义)
    • 布尔值可以是对象(如果使用new关键字定义)
    • 日期始终是对象
    • 数学永远是对象
    • 数组始终是对象
    • 正则表达式始终是对象
    • 函数永远是对象
    • Object就是对象

    除原语外,所有JavaScript值都是对象。

    附:在Java编程语言中,原语(primitive)指的是一组基本的数据类型,它们不是对象,也不具有方法。

    JavaScript基元

    原始值是没有属性或方法的值。

    在JavaScript中,有5种原始类型:

    • string
    • number
    • boolean
    • null
    • undefined

    创建JavaScript对象

    终于详细讨论这个问题了。

    有多种创建新对象的方法:

    • 使用对象常量,它使用大括号:{}
    • 使用对象构造函数,它使用new Object()
    • 可以创建一个构造函数 ,然后示例化一个调用该函数的对象

    使用对象常量

    例子:

    1
    var Pq = {name: 'pq', age:20};

    附:对象定义可以跨越多行。

    使用new Object()

    例子(哈哈哈,我简化了):

    1
    2
    3
    var user = {};
    user.name = 'pq';
    user.age = 20;

    使用构造函数

    例子:

    1
    2
    3
    4
    5
    function Man(name, age) {
    this.name = name;
    this.age = age;
    }
    var Pq = new Man('pq', 20);

    JavaScript对象是可变的

    可变是一种可以更改的变量。在JavaScript中,只有对象和数组是可变的,不是原始值。

    可变对象是一种对象,其状态在创建后即可修改。

    不可变对象是一旦创建对象便无法更改其状态的对象。

    字符串数字不可变的,改值后地址变了。

    对象是可变的:它们是通过引用而不是值来寻址的。

    如果user是对象,则以下语句将不会创建该用户的副本:

    1
    var x = user;  // 这不会创建user副本.

    对象x不是user的副本,它是user。x和user是同一个对象。

    对x的任何更改也将更改user,因为x和user是相同的对象。

    比较对象

    在JavaScript中,对象是引用类型。即使两个不同的对象具有相同的属性,它们也永远不会相等。

    仅将同一对象引用与其自身进行比较会得出true

    JavaScript 对象属性

    属性是对象内的名称(键)和值之间的关联,并且它可以包含任何数据类型。

    属性通常是指一个对象的特征。

    通常可以更改,添加和删除属性,但某些属性是只读的。

    访问JavaScript属性

    有两种访问对象属性的方法:

    • 点表示法: .
    • 括号符号: []

    添加新,修改旧属性

    直接使用等于号,

    注意:避免对属性或方法名称使用保留字。

    删除对象属性

    语法:delete element.property

    遍历对象属性

    JavaScript具有for…in专门用于迭代对象属性的循环。

    语法:

    1
    for (variable in object) { statement to be executed}

    例子:

    1
    2
    3
    4
    5
    var user = {firstName:"Seagull", lastName:"Anna", age:22, location:"New Delhi"};

    for (let x in user) {
    document.write(x);
    }

    附:for…in循环不应与for…of循环混淆,后者仅在Array对象类型上使用。

    另一个有用的枚举方法是Object.keys()方法,该方法将返回对象属性的数组。

    语法:object.keys(对象)

    此方法使我们可以将对象的属性作为数组使用,因此您可以利用JavaScript数组的所有方法。

    附:属性的内部属性

    所有属性都有一个名称。另外它们也有属性值。

    该值是属性的属性之一。

    其他属性是:可枚举,可配置和可写。

    这些属性定义了属性的访问方式(可读性,可写性)。

    在JavaScript中,可以读取所有属性,但是只能更改属性值(并且仅在该属性为可写状态时)。

    JavaScript 对象方法

    概述:

    方法是与对象,或者说相关联的函数,一种方法是一个对象,它是函数的一个属性。

    方法的定义方式与常规函数的定义方式相同,不同之处在于必须将它们分配为对象的属性。

    使用this作为对象引用

    JavaScript有一个特殊的关键字this,您可以在方法中使用它来引用当前对象。

    如下:

    1
    2
    3
    getName: function() {
    return this.firstName + " " + this.lastName;
    }

    this关键字是指代码被写入内部当前对象-所以在这种情况下,this等同于user

    换句话说,this.firstName表示此对象的firstName属性。

    添加新方法

    直接等于号,如下:

    1
    2
    3
    4
    user.greet = function() {
    return "Hello World";
    };
    document.getElementById("para").innerHTML = user.greet();

    Getters和Setters

    getter是一种获取特定属性值的方法。

    setter是一种设置特定属性值的方法。

    例子:get关键字

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    //创建一个对象
    var user = {
    firstName: "Seagull",
    lastName : "Anna",
    age : 22,
    location : "New Delhi",
    get loc() {
    return this.location;
    }
    };

    //显示来自对象的数据
    document.getElementById("para").innerHTML = user.loc;

    还有:set关键字

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    //创建一个对象
    var user = {
    firstName: "Seagull",
    lastName : "Anna",
    age : 22,
    location : "New Delhi",
    get loc() {
    return this.location;
    }
    };

    //显示来自对象的数据
    document.getElementById("para").innerHTML = user.loc;

    Object.defineProperty()

    Object.defineProperty()方法还可以用于添加Getter和Setter。

    语法:

    1
    Object.defineProperty(object, property, {value : value})

    JavaScript 对象构造函数

    JavaScript 内置构造函数:

    1
    2
    3
    4
    5
    6
    7
    8
    let x1 = new String(); //一个新的String对象。
    let x2 = new Number(); //一个新的number对象。
    let x3 = new Boolean(); //一个新的布尔对象。
    let x4 = new Object(); //一个新Object对象。
    let x5 = new Array(); //一个新的Array对象。
    let x6 = new RegExp(); //一个新的RegExp对象。
    let x7 = new Date(); //一个新的date对象。
    let x8 = new Function(); //一个新函数对象。

    不要将Number、String或Boolean声明为对象

    终将数字,字符串或布尔值视为原始值。不作为对象。

    将这些类型声明为对象会降低执行速度,并产生意外结果。

    也可以这样做:

    • 使用{}代替new Object()
    • 使用””代替new String()
    • 使用0代替new Number()
    • 使用false代替new Boolean()
    • 使用[]代替new Array()
    • 使用/()/代替new RegExp()
    • 使用function (){}代替new Function()

    JavaScript 对象原型及原型链

    原型

    原型是一种机制,JavaScript对象通过该机制彼此继承特征。

    prototype属性可以向构造函数添加属性和方法。

    语法:object.property.name = value

    原型链

    部分内容摘自:一文搞懂JS原型与原型链(超详细,建议收藏) - 掘金 (juejin.cn)

    原型对象

    JS的每个函数在创建的时候,都会生成一个属性prototype,这个属性指向一个对象,这个对象就是此函数的原型对象。该原型对象中有个属性为constructor,指向该函数。这样原型对象它的函数之间就产生了联系。

    JS原型链

    每个通过构造函数创建出来的实例对象,其本身有个属性__proto__,这个属性会指向该实例对象构造函数原型对象

    image.png

    当访问一个对象的某个属性时,会先在这个对象本身属性上查找,如果没有找到,则会通过它的__proto__隐式属性,找到它的构造函数原型对象,如果还没有找到就会再在其构造函数prototype__proto__中查找,这样一层一层向上查找就会形成一个链式结构,我们称为原型链

    注意点:如果通过p1实例对象__proto__属性赋值,则会改变其构造函数原型对象,从而被所有实例所共享。

    原型链的尽头是NULL。

    神评:

    每个构造函数:例如Array都有自己的原型对象 Prototype, 而 Array每次new 出来的实例对象 array = new Array() 如果想找到 原型对象 Prototype上面的属性的话,得通过 proto 来找到(也就是 arrar.proto === Array.Prototype); 但是Array的原型对象 Prototype的上层其实还有 proto, 而它的__proto__指向的就是 Object.Prototype ; 也就是Array.Prototype._proto

    自我总结:每个构造函数抽象出一个原型对象以承载公共属性和方法,原型链使对象与构造函数的原型对象建立link。

    JavaScript 类

    概述:

    类是用于创建对象的模板。

    创建一个类并实例化的语法格式如下

    1
    2
    3
    4
    5
    6
    7
    class Runoob {
    constructor(name, url) {
    this.name = name;
    this.url = url;
    }
    }
    let site = new Runoob("菜鸟教程", "https://www.runoob.com");

    类继承

    super() 方法引用父类的构造方法。

    通过在构造方法中调用 super() 方法,我们调用了父类的构造方法,这样就可以访问父类的属性和方法。

    语法: super(father方法);

    还可以使用原型链。

    JavaScript 静态方法

    静态方法是使用 static 关键字修饰的方法,又叫类方法,属于类的,但不属于对象,在实例化对象之前可以通过 类名.方法名 调用静态方法。

    静态方法不能在对象上调用,只能在类中调用。