3_JavaScript

1、什么是JavaScript

1.1、概述

JavaScript是一门世界上最流行的脚本语言

JavaScript与Java没什么关系,是为了蹭Java的热度

JavaScript是10天开发出来的

一个合格的后端人员,必须要精通JavaScript

1.2、历史

https://blog.csdn.net/kese7952/article/details/79357868

ECMAScript它可以理解为是JavaScript的一个标准

最新版本已经到ES6版本~

但是大部分的浏览器还只停留在支持ES5代码上!

这就会导致开发环境和线上环境版本不一致

2、快速入门

2.1、引入JavaScript

  1. 内部标签

    <script>
    	alert("Hello, World!")
    </script>
    
  2. 外部引入

    test.js

    alert("Hello, World!")
    

    test.html

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

注意:

  1. script标签必须成对出现
  2. 不用显示定义type="text/javascript",默认就是

2.2、基本语法入门

  1. 定义变量:变量类型 变量名 = 变量值;

    var score = 70
    
  2. 条件控制

    if (score > 60 && score < 70) {
        alert("60 ~ 70");
    } else if (score > 70 && score < 80) {
        alert("70 ~ 80");
    } else {
        alert("other");
    }
    
  3. 在浏览器的控制台打印变量

    console.log(score);
    

浏览器必备调试须知:

F12打开开发者工具

2.3、数据类型

数值、文本、图形、音频、视频……

  • 变量

    var a = 1;
    var 王者荣耀 = "倔强青铜";
    
  • number

    js不区分小数和整数,Number

    123 //整数123
    123.1 //浮点数123.1
    1.123e3  //科学计数法
    -99  //负数
    NaN   //not a number
    Infinity  //表示无限大
    
  • 字符串

    'abc'
    "abc"
    
  • 布尔值

    true
    false
    
  • 逻辑运算

    &&   //两个都为真,结果为真
    ||   //一个为真,结果为真
    !    //真即假,假即真 
    
  • 比较运算符

    ==    //等于(类型不一样,值一样,也会判断为true)
    ===   //绝对等于(类型一样,值一样,结果为true)
    

    这是js的一个缺陷,坚持不要使用==比较

    须知:

    • NaN === NaN,这个与所有的数值都不相等,包括自己

    • 只能通过isNaN(NaN)来判断这个数是否是NaN

    浮点数问题:

    console.log((1/3) === (1-2/3)) //false
    

    尽量避免使用浮点数进行运算,存在精度问题!

    可以使用这个方式来判断:

    console.log(Math.abs(1/3-(1-2/3)) < 0.00000001) //true 
    
  • null 和 undefined

    • null 空
    • undefined 未定义
  • 数组

    Java的数组必须是相同类型的对象,js不需要

    //为了保证代码的可读性,尽量使用[]
    var arr1 = [1, 2, 3, 4, "hello", null, true];
    var arr2 = new Array(1, 2, 3, 4, "hello");
    

    取数组下标:如果越界了,就报undefined

  • 对象

    对象是大括号,数组是中括号

    每个属性之间使用逗号隔开,最后一个不需要添加

    var person = {
        name: "zhangsan",
        age: 3,
        tags: ['js', 'java', 'web']
    };
    

    取对象的值

    person.name
    > "张三"
    person.age
    > 3
    

2.4、严格检查格式

  1. 为了预防JavaScript的随意性导致产生一些问题
  2. 使用前提:IDEA需要设置支持ES6语法
  3. 必须写在JavaScript的第一行!
  4. 局部变量建议使用let去定义
'use strict';
let i = 1;

3、数据类型

3.1、字符串

  1. 正常字符串我们使用 单引号 或者 双引号 包裹

  2. 注意转义字符 \

    \'   //字符串单引号
    \n   //换行符
    \t   //tab
    \u4e2d  //中(unicode字符)
    \x41   //A(Ascll字符)
    
  3. 多行字符串编写

    var msg = `hello
    		world,
    		你好!`
    
  4. 模版字符串(ES6新特性)

    let name = "张三";
    let age = 3;
    let msg = `你好啊,${name}`;
    
  5. 字符串长度

    console.log(str.length);
    
  6. 字符串的可变性,不可变

    > var student = "student";
    > student[0] = 1;
    > console.log(student);
      student
    
  7. 大小写转换

    > console.log(student.toUpperCase())
      STUDENT
    > console.log(student.toLowerCase())
      student	
    
  8. 获取字符串指定下标

    > console.log(student.indexOf("t"))
      1
    > console.log(student.indexOf("u"))
      2
    
  9. 字符串截取,[ ),包头不包尾

    //从第一个字符串截取到最后一个字符串
    > console.log(student.subtring(1))
      tudent
    //[1, 3)  
    > console.log(student.substring(1, 3))
      tu
    

3.2、数组

Array可以包含任意的数据类型

var arr = [1, 2, 3, 4, "hello", true, "1"];
//通过下标取值和赋值
arr[0];
arr[0] = 1;
  1. 长度

    > arr.length
      6
    > arr.length = 10
      [1, 2, 3, 4, "hello", true, "1", empty * 3]
    > arr.length = 2
      [1, 2]
    

    注意:假如给arr.length赋值,数组大小会发生变化,如果赋值过小,元素就会丢失

  2. indexOf,通过元素获得下标索引

    > arr.indexOf(2)
      1
    > arr.indexOf(1)
      0
    > arr.indexOf("1")
      6
    

    字符串的“1”和数字 1 是不同的

  3. slice(),截取Array的一部分,返回一个新数组,类似于字符串中的subtring

    > arr.slice(3)
      [4, "hello", true, "1"]
    > arr.slice(1, 5)
      [2, 3, 4, "hello"]
    
  4. push()、pop() 尾部

    > arr.push('a', 'b')
    > arr
      [1, 2, 3, 4, "hello", true, "1", 'a', 'b']
    > arr.pop()
      "b"
    > arr
      [1, 2, 3, 4, "hello", true, "1", 'a']
    

    push:压入到尾部

    pop:弹出尾部的一个元素

  5. unshift(),shift() 头部

    > arr.unshift('a', 'b')
    > arr
      ['a', 'b', 1, 2, 3, 4, "hello", true, "1"]
    > arr.shift()
      'a'
    > arr
      ['b', 1, 2, 3, 4, "hello", true, "1"]
    

    unshift:压入到头部

    shift:弹出头部的一个元素

  6. 排序 sort()

    > var arr = ["B", "C", "A"] 
    > arr.sort()
      ["A", "B", "C"] 
    
  7. 元素反转 reverse()

    > arr.reverse()
      ["C", "B", "A"]
    
  8. 拼接 concat()

    > arr.concat([1, 2, 3])
      ["C", "B", "A", 1, 2, 3]
    > arr
      ["C", "B", "A"]
    

    注意:concat()并没有修改数组,只是返回一个新的数组

  9. 连接符 join

    打印拼接数组,使用特定的字符串连接

    > arr.join("-")
      "C-B-A"
    
  10. 多维数组

    > arr = [[1, 2], [3, 4], [5, 6]]
    > arr[1][1]
      4
    
  11. 替换 fill()

    > var arr = [1, 3, 4]
    > arr.fill("a")
      ["a", "a", "a"]
    
  12. splice(),向/从数组中添加/删除元素,并返回删除的数组。它会改变原始数组

    参数:index, howmany, item1, ...., itemX

    index:必需。整数,指定在什么位置添加/删除元素。

    howmany:可选。要删除的元素数,如设为0,则不会删除任何元素。

    item1, ...., itemX:可选。要添加到数组中的新元素。

    > var arr = [1, 2, 3, 4, 5]
    > arr.splice(0, 3)
      (3) [1, 2, 3]
    > arr
      (2) [4, 5]
    
    > var arr = [1, 2, 3, 4, 5]
    > arr.splice(0, 3, "aa", "bb")
      (3) [1, 2, 3]
    > arr
      (4) ['aa', 'bb', 4, 5]
    

3.3、对象

若干个键值对

var 对象名 = {
    属性名: 属性值,
    属性名: 属性值,
    属性名: 属性值
}
var person = {
    name: "zhangsan",
    age: 30, 
    score: 60
}

js中对象,{...}表示一个对象,键值对描述属性xxx: xxx,多个属性之间使用逗号隔开,最后一个属性不加逗号

JavaScript中的所有的键都是字符串,值是任意对象!

  1. 对象赋值

    > person.name = "lisi"
    > person.name
      "lisi"
    
  2. 使用一个不存在的对象属性,不会报错!

    > person.haha
      undefined
    
  3. 动态的删减属性,通过delete删除对象的属性

    > delete person.name
      true
    > person
      {age: 30, score: 60}
    
  4. 动态的添加属性,直接给新的属性添加值即可

    > person.haha = "haha"
    > person
      {age: 30, score: 60, haha: "haha"}
    
  5. 判断属性值是否在这个对象中 xxx in xxx

    > 'age' in person
      true
    > 'toString' in person
      true
    
  6. 判断一个属性是否是这个对象自身拥有的 hasOwnProperty()

    > person.hasOwnProperty('toString')
      false
    > person.hasOwnProperty('age')
      true
    

3.4、流程控制

  • if判断

    var age = 3;
    if (age < 3) {
        alert("haha");
    } else if (age < 5) {
        alert("kuwa");       
    } else {
        alert("……");
    }
    
  • while循环

    var age = 1;
    while (age < 100) {
        age = age + 1;
        console.log(age);
    }
    
    do {
        age = age + 1;
        console.log(age);
    } while (age < 100)
    
  • for循环

    for (let i = 0; i < 100; i++) {
        console.log(i);
    }
    
  • forEach循环

    ES5.1引入

    var arr = [
        {name: "张三", age: 20}, 
        {name: "李四", age: 21}, 
        {name: "王五", age: 22}
    ];
    arr.forEach(function (obj) {
        console.log(obj.name);
        console.log(obj.age);
    });
    
  • for...in循环

    var arr = [1, 2, 3, 4, 5, 6];
    for (let i in arr) {
        console.log(arr[i]);
    }
    
  • for...of循环(ES6新特性)

    var arr = [1, 2, 3, 4, 5, 6];
    for (let value of arr) {
        console.log(value);
    }
    

3.5、Map和Set

ES6的新特性~

  • Map
var map = new Map([['tom', 90], ['jack', 80], ['jay', 70]]);
var name = map.get('tom'); //通过key获得value
console.log(name);
map.set('john', 100);  //新增或修改
map.delete('tom');  //删除
  • Set(无序不重复的集合)
var set = new Set([3, 1, 1, 1, 1]);
set.add(2);  //添加
set.delete(1);   //删除
console.log(set.has(3));   //是否包含某个元素

3.6、iterator

ES6的新特性~

  • 遍历数组
var arr = [1, 2, 3, 4, 5, 6];
for (let x of arr) {
    console.log(x);
}
  • 遍历Map
var map = new Map([['tom', 90], ['jack', 80], ['jay', 70]]);
for (let x of map) {
    console.log(x);
}
  • 遍历Set
var set = new Set([5, 6, 7]);
for (let x of set) {
    console.log(x)
}

4、函数

4.1、定义函数

绝对值函数

定义方式一

function abs(x) {
    if (x >= 0) {
        return x;
    } else {
        return -x;
    }
}

一旦执行到return代表函数结束,返回结果!

如果没有执行return,函数执行完也会返回结果,结果就是undefined

定义方式二

var abs = function(x) {
    if (x >= 0) {
        return x;
    } else {
        return -x;
    }
}

function(x) {......}这是一个匿名函数。但是可以把结果赋值给abs,通过abs就可以调用函数!

方式一和方式二等价!

调用函数

abs(10)   //10
abs(-10)  //10

参数问题:JavaScript可以传任意个参数,也可以不传递参数~

假设不存在参数,如何规避?

var abs = function(x) {
    //手动抛出异常来判断
    if (typeof x !== 'number') {
        throw 'Not a Number';
    }
    if (x >= 0) {
        return x;
    } else {
        return -x;
    }
}

arguments

arguments是js免费赠送的一个关键字

代表传递进来的所有的参数,是一个数组

var abs = function(x) {
    for (let i = 0; i < arguments.length; i++) {
        console.log(arguments[i])
    }
}
> abs(10, 2, 3, 4, 5, 6, 7)
  10
  2
  3
  4
  5
  6
  7

问题:arguments包含所有的参数,我们有时候想使用多余的参数来进行附加操作,需要排除已有的参数~

rest

以前:

if (arguments.length > 2) {
     for (let i = 2; i < arguments.length; i++) {
        console.log(arguments[i])
    }
}

ES6引入的新特性,获取除了已经定义的参数之外的所有参数

function aaa(a, b, ...rest) {
    console.log("a=>" + a);
    console.log("b=>" + b);
    console.log(rest);
}

rest参数只能写在最后面,必须用 ...标识

4.2、变量的作用域

在JavaScript中,var定义变量实际是有作用域的。

假设在函数体中声明,则在函数体外不可以使用~(非要想实现的话,后面可以研究一下闭包

function f() {
    var x = 1;
    x += 1;
}
x = x + 2; //Uncaught RenferenceError: x is not defined

如果两个函数使用了相同的变量名,只要在函数内部,就不冲突

function f1() {
    var x = 1;
    x += 1;
}

function f2() {
    var x = 'A';
    x = x + 1;
}

内部函数可以访问外部函数的成员,反之则不行

function outer() {
    var x = 1;
    
    function inner() {
        var y = x + 1;
    }
    
    var z = y + 1;
}
> console.log(z)
  Uncaught RenferenceError: z is not defined
> outer()
  Uncaught RenferenceError: y is not defined

假设内部函数变量和外部函数的变量重名!

function outer() {
    var x = 1;
    
    function inner() {
        var x = 'A';
        console.log("inner" + x);
    }
    console.log("outer" + x);
    inner();
}

outer();

假设在JavaScript中函数查找变量从自身函数开始,则由“内”向“外”查找。假设外部存在这个同名的函数变量,则内部函数会屏蔽外部函数的变量。

提升变量的作用域

function f() {
    var x = "x" + y;
    console.log(x);
    var y = "y";
}

结果:xundefined

说明:js执行引擎,自动提升了y的声明,但是不会提升变量y的赋值。

function f() {
    var y;
    var x = "x" + y;
    console.log(x);
    y = "y";
}

这个是在JavaScript建立之初就存在的特性。养成规范:所有的变量定义都放在函数的头部,不要乱放,便于代码维护

function f() {
    var x = 1,
        y = x + 1,
        z, i, a;
    //之后随意用
}

全局变量

var x = 1;

function f() {
    console.log(x);
}
f();
console.log(x);

全局对象window

var x = "xxx";
alert(x);
alert(window.x); //默认所有的全局变量,都会自动绑定在window对象下

alert()这个函数本身也是一个window的变量

JavaScript实际上只有一个全局作用域,任何变量(函数也可以视为变量),假设没有在函数作用内找到,就会向外查找,如果在全局作用域都没有找到,则会报错。

规范

由于我们所有的全局变量都会绑定到我们的window上。如果不同的js文件,使用了相同的全局变量,会产生冲突。

//唯一的全局变量
var app = {};
app.name = "小程序";
app.add = function(a, b) {
    return a + b;
}

把自己的代码全部放入自定定义的唯一空间名字中,降低全局命名冲突的问题

局部作用域 let

function aaa() {
    for (var i = 0; i < 10; i++) {
        console.log(i)
    }
    console.log(i + 1);//输出11,除了这个作用域还可以使用
}

ES6 let 关键字,解决局部作用域冲突问题!

function aaa() {
     for (let i = 0; i < 10; i++) {
        console.log(i)
    }
    console.log(i + 1);//Uncaught RenferenceError: i is not defined
}

建议大家都使用let去定义局部作用域的变量

常量 const

在ES6之前,怎么定义常量:只要用全部大写字母命名的变量就是常量;建议不要修改这样的值

var PI = "3.14";
console.log(PI);
PI = "123";   //可以改变这个值
console.log(PI);

在ES6中引入了常量关键字const

const PI = "3.14"; //只读变量
console.log(PI);
PI = "123";  //TypeError: Assignment to constant variable.
console.log(PI);

4.3、方法

定义方法

方法就是把函数放在对象的里面,对象只有两个东西:属性和方法

var app = {
    name: "zhangsan",
    birth: "1990",
    age: function() {
        var now = new Date().getFullYear();
        return now - this.birth;
    }
}
//属性
app.name;
//方法,一定要带()
app.age();

this代表什么?拆开上面的代码看看

function getAge() {
    var now = new Date().getFullYear();
    return now - this.birth;
}

var app = {
    name: "zhangsan",
    birth: "1990",
    age: getAge
}

app.age()  //ok
getAge()  //NaN

在Java中this是无法指向的,是默认指向调用它的那个对象

apply

在js中可以控制this指向!

function getAge() {
    var now = new Date().getFullYear();
    return now - this.birth;
}

var app = {
    name: "zhangsan",
    birth: "1990",
    age: getAge
}

getAge.apply(app, []);  //this指向了app,参数为空

5、内部对象

标准对象

typeof 123
"number"
typeof '123'
"string"
typeof true
"boolean"
typeof []
"object"
typeof {}
"object"
typeof Math.abs
"function"
typeof undefined
"undefined"

5.1、Date

  • 基本使用

    > var now = new Date()  //中国标准时间
    > now.getFullYear()  //年
      2021
    > now.getMonth()   //月(0~11)
      5
    > now.getDate()   //日
      24
    > now.getDay()   //星期几
      4
    > now.getHours() //时
      0
    > now.getMinutes()  //分
      35
    > now.getSeconds()  //秒
      15
    > now.getTime()  //时间戳 1970年1月1日 00:00:00 到现在的毫秒值
      1624466115749
    > new Date(1624466115749)  //毫秒值转中国标准时间
      Thu Jun 24 2021 00:35:15 GMT+0800 (中国标准时间)
    > now.toLocaleString()  //转本地字符串时间
      "2021/6/24上午12:35:15"
    > now.toGMTString()
      "Wed, 23 Jun 2021 16:35:15 GMT"
    

5.2、JSON

早期,所有数据传输习惯使用XML文件!

  • json是什么
    • JSON(JavaScript Object Notation)是一种轻量级的数据交换格式。
    • 简洁和清晰的层次结构使得JSON成为理想的数据交换语言。
    • 易于人阅读和编写,同事也易于机器解析和生成,并有效地提升网络传输效率。

在JavaScript中一切皆为对象、任何js支持的类型都可以用JSON来表示。

格式:

  • 对象都用{}
  • 数组都用[]
  • 所有的键值对都是用key:value

JSON字符串和JS对象的相互转换

var user = {
    name: "张三",
    age: 30,
    sex: "男"
};
//对象转换为json字符串
var json = JSON.stringify(user); 
console.log(json); //{"name": "张三", "age": 30, "sex": "男"}

//json字符串转换为对象
var obj = JSON.parse(json);
console.log(obj); // {name: "张三", age: 30, sex: "男"}

5.3、Ajax

  • 原生的js写法,xhr异步请求
  • jQuery封装好的方法 $.ajax()
  • axios请求(目前使用这个,比较好用)

6、面向对象编程

原型对象

javascript、java、c#…… 面向对象;javascript有些区别!

  • 类:模版
  • 对象:具体的实例

在javascript中需要大家换一下思维方式!

var student = {
    name: "zhangsan",
    age: 20,
    run: function() {
        console.log(this.name + " run……");
    }
};
var xiaoming = {
    name: "小明"
};

xiaoming.__proto__ = student;
function Student(name) {
    this.name = name;
}
//给Student新增一个方法
Student.prototype.hello = function() {
  alert("hello");  
};

class 继承

class关键字,是在ES6引入的

1、定义一个类,属性、方法

//定义一个学生的类
class Student {
    constructor(name) {
        this.name = name;
    }
    hello() {
        alert("hello " + this.name);
    }
}
var xiaoming = new Student("xiaoming");
var xiaohong = new Student("xiaohong");
xiaoming.hello();

2、继承

class Student {
    constructor(name) {
        this.name = name;
    }
    hello() {
        alert("hello " + this.name);
    }
}

class pupil extends Student {
    constructor(name, grade) {
        super(name);
        this.grade = grade;
    }
    
    myGrade() {
        alert(this.name + "是一命小学生");
    }
}
var xiaoming = new Student("xiaoming");
var xiaohong = new pupil("xiaohong", 1);
xiaohong.myGrade();

原型链

__proto__:

7、操作BOM对象(重点)

浏览器介绍

JavaScript和浏览器关系?

JavaScript诞生就是为了能够让他在浏览器中运行!

BOM:浏览器对象模型

  • IE6~11
  • Chrome
  • Safari
  • FireFox (Linux默认的浏览器)
  • Opera

三方:

  • QQ浏览器
  • 360浏览器

window对象

window代表浏览器窗口

window.alert();
window.innerHeight //浏览器内部高度
window.innerWidth  //浏览器内部宽度
window.outerHeight //浏览器外部高度
window.outerWidth  //浏览器外部宽度

Navigator

Navigator封装了浏览器的信息

navigator.appName
"Netscape"
navigator.appVersion
"5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36"
navigator.userAgent
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36"
navigator.platform
"Win32"

大多数时候,我们不会使用navigator对象,因为会被人为修改!

不建议使用这些属性来判断和编写代码

screen

代表屏幕的尺寸

screen.width
1920 px
screen.height
1080 px

location (重要)

location代表当前页面的URL信息

host: "www.baidu.com"  //主机
href: "https://www.baidu.com/"
protocol: "https:"
reload: f reload()  //刷新页面
//设置新的地址
location.assign("https://sdfasdf")

document

document代表当前的页面,HTML DOM文档树

document.title
"百度一下,你就知道"
document.title = "Hello,World"
"Hello,World"

获取具体的文档树节点

<dl id="app">
	<dt>Java</dt>
    <dt>JavaSE</dt>
    <dt>JavaEE</dt>
</dl>
<script>
	var dl = document.getElementById("app");
</script>

获取cookie

document.cookie

劫持cookie原理

淘宝和天猫,单点登录就使用这个原理

恶意人员,获取你的cookie上传到他的服务器

服务器端可以设置cookie:httpOnly来保证安全性

history(不建议使用)

history代表浏览器的历史记录

history.back() //后退
history.forward() //前进

8、操作DOM对象(重点)

DOM:文档对象模型

核心

浏览器网页就是一个DOM树形结构!

  • 更新:更新DOM节点
  • 遍历DOM节点:得到DOM节点
  • 删除:删除一个DOM节点
  • 添加:添加一个新的节点

要操作一个DOM节点,就必须要先获得这个DOM节点

获取DOM元素高度和宽度

网页可见区域宽: document.body.clientWidth
网页可见区域高: document.body.clientHeight
网页可见区域宽: document.body.offsetWidth (包括边线的宽)
网页可见区域高: document.body.offsetHeight (包括边线的高)
网页正文全文宽: document.body.scrollWidth
网页正文全文高: document.body.scrollHeight
网页被卷去的高: document.body.scrollTop
网页被卷去的左: document.body.scrollLeft

元素的实际高度:document.getElementById("div").offsetHeight
元素的实际宽度:document.getElementById("div").offsetWidth
元素的实际距离左边界的距离:document.getElementById("div").offsetLeft
元素的实际距离上边界的距离:document.getElementById("div").offsetTop

获取DOM节点

<div id="father">
    <h1>标题一</h1>
    <p id="p1">p1</p>
    <p class="p2">p2</p>
</div>
<script>
	var h1 = document.getElementsByTagName('h1');
    var p1 = document.getElementById('p1');
    var p2 = document.getElementsByClassName('p2');
    var father = document.getElementById('father');
    var children = father.children; //获取父节点下的所有子节点
    father.firstChild;
    father.lastChild;
</script>

这是原生代码,之后我们尽量都使用jQuery();

更新节点

<div id="div"></div>
<script>
	var div = document.getElementById('div');
    //修改文本的值
    div.innerText = '123'; 
    //可以解析HTML文本标签
    div.innerHTML = '<strong>456</strong>';
    //修改字体颜色
    div.style.color = 'red';
    //修改字体大小
    div.style.fontSize = '20px';
    //修改内边距
    div.style.padding = '20px';
</script>

删除节点

删除节点的步骤:先获取父节点,在通过父节点删除自己

<div id="father">
    <h1>标题一</h1>
    <p id="p1">p1</p>
    <p class="p2">p2</p>
</div>
<script>
    var self = document.getElementById('p1');
    var father = self.parentElement;
    father.removeChild(self);
</script>

注意:删除多个节点的时候,children是在时刻变化的,删除节点的时候一定要注意!

插入节点

我们获得了某个DOM节点,假设这个DOM节点是空的,我们通过innerHTML就可以增加一个元素了,但是这个DOM节点已经存在元素了,我们就不能这么干了,会产生覆盖,只能追加。

<p id="js">JavaScript</p>
<div id="list">
    <p id="se">JavaSE</p>
    <p id="ee">JavaEE</p>
    <p id="me">JavaME</p>
</div>
<script>
    //已存在的节点插入
	var js = document.getElementById('js');
    var list = document.getElementById('list');
    list.appendChild(js);
    //通过js创建一个新的节点
    var newP = document.createElement('p');
    newP.id = 'newP';
    newP.innerText = 'Hello,World!';
    list.appendChild(newP);
    //创建一个标签节点(通过这个属性,可以设置任意的值)
    var myScript = document.createElement('script');
    myScript.setAttribute('type', 'text/javascript');
    
    //在一个节点前面插入
    var ee = document.getElementById('ee');
    //insertBefore(新节点,目标节点)
    list.insertBefore(js, ee);
</script>

9、操作表单(验证)

表单是什么 form

  • 文本框 text
  • 文本域 textarea
  • 下拉框 select
  • 单选框 radio
  • 多选框 checkbox
  • 隐藏域 hidden
  • 密码框 password
  • .........

表单的目的:提交信息

获得要提交的信息

<form action="post">
    <p>
        <span>用户名:</span>
        <input type="text" id="username">
    </p>
    <p>
        <span>性别:</span>
        <input type="radio" name="sex" value="man"> 男
        <input type="radio" name="sex" value="women"> 女
    </p>
</form>
<script>
	var username = document.getElementById('username').value;
    var radios = document.getElementsByName('sex');
    for (var i = 0; i < radios.length; i++) {
        if (radios[i].checked) {
            var sex = radios[i].value;
        }
    }
</script>

提交表单。MD5加密密码,表单优化

<!--MD5工具类-->
<script src="https://cdn.bootcss.com/blueimp-md5/2.10.0/js/md5.min.js"></script>
<!--
表单绑定提交事件
onsubmit=绑定一个提交检测的函数,true,false
将这个结果返回给表单,使用onsubmit接收
-->
<form action="https://www.baidu.com/" method="post" onsubmit="return aaa()">
    <p>
        <span>用户名:</span><input type="text" id="username" name="username">
    </p>
    <p>
        <span>密码:</span><input type="password" id="input-password">
    </p>
    <input type="hidden" id="md5-password" name="password">
    <button type="submit">提交</button>
</form>
<script>
	function aaa() {
        var username = document.getElementById('username');
        var pwd = document.getElementById("input-password");
        var md5pwd = document.getElementById("md5-password");
        md5pwd.value = md5(pwd.value);
        //可以检验判断表单内容,true就是通过提交,false阻止提交
        return true;
    }
</script>

10、jQuery

最新版本地址:https://code.jquery.com/jquery-3.6.0.min.js

<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<a href="#" id="test-jquery">点我</a>
<script>
	$("#test-jquery").click(function() {
        alert("hello,jQuery")
    });
</script>

选择器

document.getElementsByTagName();
document.getElementById();
document.getElementsByClassName();

$('p').click();
$('#id1').click();
$('.class1').click();

文档工具站:http://jquery.cuishifeng.cn/

事件

鼠标事件、键盘事件、其他事件

$("selector").mousemove();
$("selector").mouseover();
$("selector").mouseup();
$("selector").mousedown();
……

操作DOM

$("selector").text(); //获得值
$("selector").text("asdf"); //设置值
$("selector").html(); //获得值
$("selector").html('<p>ssssss</p>'); //设置值
$("selector").css({"color": "red"});
$("selector").show();
$("selector").hide();

jQuery获取元素各种宽高及页面宽高总结

  • 获取浏览器显示区域(可视区域)的高度:

    $(window).height();

  • 获取浏览器显示区域(可视区域)的宽度:

    $(window).width();

  • 获取页面的文档高度:

    $(document).height();

  • 获取页面的文档宽度:

    $(document).width();

  • 浏览器当前窗口文档body的高度:

    $(document.body).height();

  • 浏览器当前窗口文档body的宽度:

    $(document.body).width();

  • 获取滚动条到顶部的垂直高度 (即网页被卷上去的高度):

    $(document).scrollTop();

  • 获取滚动条到左边的垂直宽度:

    $(document).scrollLeft();

  • 获取或设置元素的宽高(不包括padding、border、margin):

    $(obj).width();

    $(obj).height();

  • 获取或设置元素的宽高(包括padding):

    $(obj).innerWidth();

    $(obj).innerHeight();

  • 获取或设置元素的宽高(包括padding + border):

    $(obj).outerWidth();

    $(obj).outerHeight();

  • 获取或设置元素的宽高(包括padding + border + margin):

    $(obj).outerWidth(true);

    $(obj).outerHeight(true);

  • 某个元素的上边界到body最顶部的距离(在元素的包含元素不含滚动条的情况下):

    obj.offset().top;

  • 某个元素的左边界到body最左边的距离(在元素的包含元素不含滚动条的情况下):

    obj.offset().left;

posted @ 2021-07-07 11:39  蓝色空间号  阅读(30)  评论(0)    收藏  举报