javascript学习

JavaScript

快速入门

什么是JavaScript? JS

网页脚本语言。用来处理一些动态的DOM(document = html 标签)、用于用户交互、网页中的业务。DOM 和事件

JS 有2套标准:W3C 和 IE

浏览器厂商: IE ,火狐、谷歌、苹果、opera(欧鹏)

IE 版本11以后开始 100% 兼容JavaScript ,因为对JS的不兼容导致对CSS3和Html5的不兼容,因为Html5和CSS3中内置了很多JS

https://www.w3school.com.cn/js/pro_js_history.asp 历史

ECMAScript5 (JavaScript) ES5标准

Vue.js 的标准 ES6

JS的编程模型

  1. 在页面的内部使用 script 标签
  2. 外部JS,需要 引入 <script src="./base.js"></script>
  3. 无论是内部JS还是外部JS ,其书写位置应该是 页面body中的最后一行,其目的是先渲染标签和样式表在加载脚本

需要自己去看的API :

  1. 字符串
  2. 运算符 (== 和 ===)
  3. 流程控制: 分支 循环
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>页面加载顺序的例子</title>
</head>
<body>

<script>
    // 获取 text 的文本值

    // 1. 获取标签对象,获取不到
    var text = document.getElementById("text");
    console.log(text); // null
    // 2. 获取文本属性的值
    var value = text.innerText;
    // 3. 输出到控制台
    console.log('元素之前:', value)
</script>

<h1 id="text">hello world</h1>


<script>
    // 获取 text 的文本值

    // 1. 获取标签对象
    var text = document.getElementById("text");
    // 2. 获取文本属性的值
    var value = text.innerText;
    // 3. 输出到控制台
    console.log('元素之后:', value)
    alert(value); //弹窗
</script>
</body>
</html>

语法

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>基本语法</title>
</head>
<body>


<script>

    /*
    JavaScript: 是弱类型语言、松散型语言。 声明变量不需要指定类型 变量的类型由字面量来决定
    Java: 是强类型语言。声明变量的时候需要指定变量的类型
     */

    // 声明变量: 使用 var
    var x;
    console.log(typeof x) // undefined;

    // 字面量
    x = "hello"; // string

    // 类型
    console.log(typeof x);
    x = 100;
    console.log(typeof x);

    // 函数 类似于java中的方法
    function fn(a, b) {
        console.log(a, b);
        return a + b; // 可以有返回值、可以没有返回值 由 执行的结果决定
    }

    // 语句: JavaScript中 使用分号或者换行来标记一行语句的结束

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

严格检查模式strict

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <!--
    前提:IDEA需要设置支持ES6语法
    'use strict'; 严格检查模式,预防JavaScript的随意性导致产生的一些问题
    必须写在JavaScript的第一行!
    局部变量建议都使用Let去定义~
    -->
<script>

    'use strict'; //加上严格检查模式,就不能定义 i=1;
    let i = 1;
    console.log(i)
</script>
</body>
</html>

数据类型

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>数据类型</title>
</head>
<body>
<script>
    /*数据类型:布尔、数值型、字符串、对象、undefined、null*/

    /*js中的类型是由字面量来决定*/

 var x;
    console.log(typeof x); // undefined
    x = false;
    console.log(typeof x); // boolean
    x = "hello"; // 字符串可以是 双引号  或者 单引号
    console.log(typeof x); // string
    x = 100.2; // js中不区分 整数型 和 浮点型
    console.log(typeof x); // number

    //数组
    x = new Array(2,3,4); // js中数组的简写 [] JS中数据不需要指定长度
    console.log(typeof x); // object
    x=[1,2,3,null,'hello',43]; //数组,可读性高,建议使用
    console.log(typeof x)

    //对象
    x = new Object(); // js 中对象的简写 {}
    console.log(typeof x); // object
    x = {
        name:'zhangsan',
        age:12,
    }
    console.log(x.age);//取值

    x = null; // 打印数来也是一个 object
    console.log(typeof x); // null | object

    /*PS:js虽然是一个弱类型语言,但是实际上我们在使用的时候都需要去约定变量的类型*/

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

字符串类型

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

    //转义字符\
    console.log('a')
    console.log('a\'');
    console.log('a\nb');
    console.log('a\tb');
    console.log('\u4e2d'); // \u#### Unicode字符
    console.log('\x41'); //  Ascll 字符

    //多行字符串编写,符号为Tab上面的键
    let msg = `
    中国
    加油,
    加油
    `;
    console.log(msg);

    //模板字符串
    let name = "张三";
    let age = 20;
    let msg1 = `你好,${name},${age}`;
    console.log(msg1)

    //字符串的长度
    let str = "student";
    console.log(str.length);

    //字符串不可变
    //str[1] = "1";
    console.log(str);

    //字符串转大小写是方法
    console.log(str.toUpperCase())

    //查找第一个出现的字符位置
    console.log(str.indexOf('t'))

    console.log(str.substring(1))//从第一个索引到最后一个字符
    console.log(str.substring(1,3)) //包含第一个不包含第三个[1,3)
    
</script>
</body>
</html>

数组

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

var arr = [1,2,3,4,'hello',5,"1"];//通过下表取值和赋值
arr[0];
arr[0] = 'world'

1.长度

arr.length

注意:加入了arr.length赋值,数组大小就会发生变化,如果赋值过小,元素就会丢失,增大,会添加undefined 的数据

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

arr.indexOf(2)

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

3.slice() 截取Array的一部分,返回一个新数组,类似于String中的substring

arr.slice(2,5) //包头不包尾

4.push(),pop() 尾部

arr.push() //向数组尾部压入数据,可压入多个
arr.pop() //弹出尾部的一个元素

5.unshift() , shift() 头部

arr.unshift() //向数组头部压入数据,可压入多个
arr.shift()  // 弹出头部的一个元素

6.排序 sort()

var arr = ["a","c","b"]
arr.sort()
["a", "b", "c"]

7.元素fanzhuan

(3) ["a", "b", "c"]
arr.reverse()
(3) ["c", "b", "a"]

8.concat()

(3) ["c", "b", "a"]
arr.concat("1",2,3)
(6) ["c", "b", "a", "1", 2, 3]
arr
(3) ["c", "b", "a"]

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

9.连接符join()

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

(3) ["c", "b", "a"]
arr.join('-')
"c-b-a"

10.多维数组

arr = [[1,2],[3,4],["5","6"]]
arr[1][1]
4

数组 :存储数据,知道如何存,如何取

对象类型

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

若干个键值对

var 对象名 = {
	属性名:属性值,
	属性名:属性值,
	属性名:属性值
}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>JS的对象</title>
</head>
<body>

<script>

    /*对象的写法*/

    /*常用的:支持面向对象*/
    /*
    // 创建一个对象
    var o = {};
    // 绑定对象的属性
    o.username = 'jack';
    o.age = 20;

    // 绑定函数(匿名函数)到对象
    o.show = function () {
        console.log('show');
    }
    // 使用对象的属性
    console.log(o.username, o.age);
    // 调用对象的方法
    o.show();
    */


    // 创建一个对象
    // 绑定对象的属性
    // 绑定函数(匿名函数)到对象
    o = {
        username: 'jack',
        age: 20,
        show: function () {
            console.log('show')
        }
    }

    // 使用对象的属性 : o['age'] 使用key的方式来获取
    console.log(o.username, o['age']);
    // 调用对象的方法
    o.show();

    // o.username, o['age'] 用于对象属性的赋值
    o.username = 'tom';
    o['age'] = 30;
    console.log(o.username, o['age']);
    
      //动态删除对象属性,delete
    console.log(delete o.age); //true
    console.log(o);

    //动态添加属性,直接给新的属性添加值
    console.log(o.ha = "haha"); //haha
    console.log(o);

    //判断一个属性值(key)是否在对象中
    console.log('ha' in o); //true
    console.log('toString' in o); //true,继承

    //判断一个属性(key)是否是这个对象自身拥有的hasOwnProperty()
    console.log(o.hasOwnProperty('toString')); //false
    console.log(o.hasOwnProperty('show')); //true
</script>
</body>
</html>

遍历对象

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>遍历对象</title>
</head>
<body>


<script>

    var arr = [15, 23, 64, 56, 6, 76];

    // for (var i = 0; i < arr.length; i++) {
    //     console.log(arr[i]);
    // }
	
    // for  in
    // key 就是数组的 索引
    // for (var key in arr) {
    //     console.log(arr[key]); // 通过key属性获取其对应value
    // }
    
    //for  of  value是数组的值,
    for(var value of arr){
        console.log(value);
    }
    
    //function的参数可以写一个
   // arr.forEach(function (value, index, array) {
    //    console.log(value); //值
    //    console.log(index); //索引
    //    console.log(array); //数组
   // })



    var o = {
        username: 'jack',
        age: 20
    }

    // 获取对象中所有的属性和值
    for (var field in o) {
        console.log(field, o[field]);
    }
</script>
</body>
</html>

类型转换

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>类型转换</title>
</head>
<body>

<!--
类型转换
String 类型的转换
boolean 类型的转换
number 类型的转换

类型的转换都会去调用对应类型的 函数
-->

<script>
    // 其他类型 转 String 类型  把对应类型的字面量 转成一个字符串

    /*
    var num = 100.89;
    var str = String(num);
    console.log(str, typeof str)

    var flag = false;
    str = String(flag);
    console.log(str, typeof str)
    */

    // 其他类型向 boolean 的转换

    // 非 0 都是true
    console.log(Boolean(1)); // true
    console.log(Boolean(10)); // true
    console.log(Boolean(0)); // false

    // 只要有内容都是 true
    console.log(Boolean("")); // false
    console.log(Boolean(" ")); // true

    // 非空为 true
    console.log(Boolean({})); // true
    console.log(Boolean([])); // true
    console.log(Boolean(function () {
    })); //true
    console.log(Boolean(null)); // false

    console.log(Boolean(Number.NaN));// false


    // 其他类型转 number
    console.log(Number("100"));
    console.log(Number("100.23"));
    console.log(Number("100A")); // NaN  = > 非数值

    console.log(Number(true));// 1
    console.log(Number(false));// 0

    console.log(Number({}));// NaN

    // NaN 和 任意数值进行运算后得到的 还是 NaN
    console.log(Number.NaN + 1); // NaN

    console.log(Number(null)); // 0
    console.log(Number(undefined)); // NaN

    // 转数值的API
    // 从第一个字符开始搜索一直到非数值
    console.log(parseInt("100A")); // 100
    console.log(parseInt("A100")); // NaN
    console.log(parseFloat("100.23A")); // 100.23

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

Map 和 Set

ES6的新特性

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<script>
    /*
        ES6 Map
        学生的姓名,学生的成绩
     */
    'use strict'

    var map = new Map([['tom',100],['jack',90],['bob',80]]);
    var score = map.get('tom'); //通过key获取value值
    console.log(scare);

    map.set('make',70); //新增或修改
    console.log(map)


    //Set无需不重复的集合
    var set = new Set([1,2,4,1,1]);// 会去重
    set.add(3); //添加
    console.log(set)
    set.delete(1); //删除
    console.log(set)
    console.log(set.has(2));//是否包含这个元素
    
</script>
</body>
</html>

iterator

es6 新特性

遍历map

var map = new Map([['tom',100],['jack',90],['bob',80]]);
for(let value of map){
    console.log(value)
}

遍历set

var set = new Set([1,2,4,1,1]);// 会去重   
for(let value of set){
    console.log(value);
}

== 和 ===

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>== 和 ===</title>
</head>
<body>
<!--
== : 值比较 (字面都转成 number 类型)
=== : 恒等于 先判断类型 在比较值
-->
<script>

    console.log(1 == '1'); // true
    console.log('2' == true); // false

    console.log(1 === '1'); // false 推荐使用这个

    // 一些特定的写法中会自动帮我我们转型
    // 判断一个字符串是否是空或者空字符串
    var str = null;
    // if (str !== null && str.length > 0) {
    //     console.log("非空")
    // } else {
    //     console.log("空")
    // }

    // 简写成  不推荐 解读性不强
    if (str) {
        console.log("非空")
    } else {
        console.log("空")
    }

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

函数

函数声明

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

<script>
    /*函数*/
    /*写法1 */

    // 函数的声明
    function fn1() {
        console.log('hello');
    }

    // 函数的调用
    fn1();

    // 有返回值的函数
    function fn2() {
        return 100; //代表函数结束,返回结果
    }

    var res = fn2();
    console.log(res);

    // 有参数的函数
    function fn3(a, b) {
        console.log(a, b);
    }

    fn3(100, 200);

    /*写法2*/
	//function(){} 这是一个匿名函数
    var fn4 = function (a, b) {
        return a + b;
    }

    var res = fn4(20, 30);
    console.log(res);

    /*写法3 了解即可 最底层的写法*/
    var fn5 = new Function("a", "b", "return a+b;")
    console.log(fn5(10, 20))

</script>
</body>
</html>
function abs(x) {
    if(x>=0){
        return x;
    }else{
        return -x;
    }
}
//执行到return代表函数结束,返回结果
var x =  abs(-5); 
console.log(x)
//如果没有执行到return,函数执行完也会返回结果
var y = abs("123")
console.log(y)

参数问题:javascript可以传任意的参数,也可以不传参数

参数进来是否存在的问题?

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

function abs(x) {
    if(typeof x !== 'number'){
        throw 'Not a Number';
    }

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

argument

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

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

function abs(x) {

    console.log("x=>",x);

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

    if(x>=0){
        return x;
    }else{
        return -x;
    }
}
	abs(45,453,34,23,23,23,23,54);

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

rest

以前

function f(a,b) {
    console.log("a=>"+a);
    console.log("b=>"+b);
    if(arguments.length>2){
        for (let i = 2; i <arguments.length ; i++) {
			//....
        }
    }
}

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

function f(a,b,...rest) {
    console.log("a=>"+a);
    console.log("b=>"+b);
	//打印参数之外的参数
    console.log(rest);
}

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

作用域

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

<script>
    /*全局变量: 定义在函数外的变量*/
    var a = 100;
    alert(a);
    alert(window.a);//默认所有的全局变量,都会自动绑定在window对象下

    function fn() {
        console.log(a);
    }

    fn();

    /*局部变量:定义在函数中,在函数中都可以访问*/

    function fn1() {
        var b = 200;
        console.log(b);
        if (true) {
            var c = 300;
        }
        // 在 if 代码块中声明但是也在函数中,所以可以访问,但是在java中不能访问
        // java的作用域叫做 【块级作用域】
        console.log(c);
    }

    // console.log(b); // b 在函数中声明的 所以不能在函数外访问
    fn1();

    /*
    JavaScript 变量生命周期
    JavaScript 变量生命周期在它声明时初始化。
    局部变量在函数执行完毕后销毁。
    全局变量在页面关闭后销毁。
     */
</script>

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

</body>
</html>

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

function f1() {
    var x= 1;
    function f() {
        var x = 'A';
        console.log('inner'+x); //innerA
    }
    f();

    console.log('outer'+x);//inner1

}
f1();

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

提升变量的作用域

// 将一个局部变量提升为全局变量
function fn() {
    //var x = 100; // 局部变量

    x = 100; // 变量提升,在当前方法执行后提升  不推荐使用 了解即可
}

// fn();
console.log(x);


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

结果:x-undefined

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

function f1() {
    var y;

    var x = "x-" + y;
    console.log(x);
    y = 'y';
}
f1();

这个是在JavaScript建立之初就存在的特性。养成规范:所有的变量定义都放在函数的头部,

不要乱放,便于代码维护

function f() {
    var x=1,
        y='a',
        z,i,b; //undefine

    //之后随意用
}

全局对象window

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

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

var x = "xxx";

window.alert(x);
var old_alert = window.alert;

//old_alert(x);

window.alert = function () {

}

//发现alert() 失效了
window.alert(123);

window.alert = old_alert;

//恢复
window.alert(456);

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

规范

由于我们所有的全局变量都会绑定到我们的window上。如果不同的js文件,使用了相同的全局变
量,冲突->如果能够减少冲突?

//定义唯一的全局变量
var quanJu = {};

//定义全局变量
quanJu.name = "jack";
quanJu.add = function (a,b) {
    return a+b;
}

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

let&const

ES6新特性

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>let&const</title>
</head>
<body>
<!--
const: 常量
let: 将作用域设定为块级作用域
建议使用let 定义局部作用域的变量
-->

<script>
    const NUMBER = 100; //只读变量
    // console.log(NUMBER)

    function fn() {
        if (true) {
            var x = 100;
            let y = 200;
        }
       // 在 if 代码块中声明但是也在函数中,var可以访问,let不行
        console.log(x);
       // console.log(y); ReferenceError: c is not defined
    }


    fn();
</script>

</body>
</html>

方法

定义方法

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

var person = {
    firstName: "John",
    lastName: "Doe",
    id: 5566,
    fullName: function () {
        // this = person
        return this.firstName + " " + this.lastName;
    }
};
//属性
console.log(person.id);
//方法,一定要带()
console.log(person.fullName());
    function getFullName () {
        // this = person
        return this.firstName + " " + this.lastName;
    }

    var person1 = {
        firstName: "John",
        lastName: "Doe",
        id: 5566,
        fullName: getFullName
    };
console.log(person1.fullName()) //ok
 //通过this调,表示当前对象 this = window; 所以方法中的this = window,变量变成undefine,
 // console.log(this.getFullName());

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

apply

在JS中可以控制this的指向

 function getFullName () {
     // this = person
     return this.firstName + " " + this.lastName;
 }

 var person1 = {
     firstName: "John",
     lastName: "Doe",
     id: 5566,
     fullName: getFullName
 };
 console.log(person1.fullName());
 //参数, 指向的对象,方法的参数
 console.log(getFullName().apply(person1,[]));

内部对象

标准对象

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

Date

基本使用

var date = new Date();
console.log(date);//中国标准时间
date.getFullYear(); //年
date.getDate(); //日
date.getDay(); //星期

let long = date.getTime(); //时间戳
console.log(long);
console.log(new Date(long));

console.log(date.toLocaleDateString()); //年月日,2020/12/17
console.log(date.toLocaleString()); //年月日,时分秒 2020/12/17 上午11:17:13
date.toGMTString;

Math

//Math
let x = Math.PI;
console.log(x);
let y = -100;
console.log(Math.abs(y));//绝对值

JSON

json是什么?

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

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

格式:

  • 对象都用{};
  • 数组都用[];
  • 所有的键值对 都用 key:value;
var user = {
    name : "jack",
    age : 20,
    sex : "男"
}

//对象转换为json字符串 {"name":"jack","age":20,"sex":"男"}
let jsonUser = JSON.stringify(user);
console.log(jsonUser);

//json字符串转换为对象,参数为json字符串
let parse = JSON.parse('{"name":"jack","age":20,"sex":"男"}');
console.log(parse)

JSON和JS对象的区别

var obj = {a:'hello',b:'world'};
var json = '{'a':'hello','b':'world'}'

面向对象编程

原型对象

javascript有些区别

  • 类:模板
  • 对象:具体的实列

在javaScript这个需要大家换下思维

var Student = {
    name: 'jack',
    age : 3,
    run : function(){
        console.log(this.name+" run......");
    }
}

var tom = {
    name:'tom'
}

//tom的原型是 Student
tom.__proto__ = Student;

var Bird = {
    fly:function(){
        console.log(this.name+" fly.......")
    }
}

//原型对象
tom.__proto__ = Bird;
//ES6之前
function Student(name) {
    this.name = name;
}

Student.prototype.hello=function () {
    alert('hello');
}

class 继承

class关键字,是在ES6引入的

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

//定义一个学生类
class Student{

    constructor(name) {
        this.name = name;
    }

    hello(){
        alert('hello')
    }
}
//创建对象
var student = new Student('jack');
var student1 = new Student('tom');
student.hello();
console.log(student1.name);

2.继承

class Student{

    constructor(name) {
        this.name = name;
    }

    hello(){
        alert('hello->'+this.name)
    }
}
//继承
class xiaoStudent extends Student{
    constructor(name,grade) {
        super(name);
        this.grade = grade
    }

    myGrade(){
        alert("我是一个小学生->"+this.name+this.grade)
    }
}

var student = new Student('jack');
var student1 = new xiaoStudent('tom',80);
student.hello();

student1.myGrade();
student1.hello();

本质查看对象原型

在这里插入图片描述

原型链

__proto__

在这里插入图片描述

操作BOM对象(重点)

浏览器介绍

BOM(Browser Object Model) 是指浏览器对象模型

​ BOM由多个对象组成,其中代表浏览器窗口的Window对象是BOM的顶层对象,其他对象 都是该对象的子对象。

JavaScript 和 浏览器关系?

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

BOM :浏览器对象模型

  • IE 6-11
  • Chrome
  • Safari
  • FireFox
  • Opera

window

window代表 浏览器窗口

window.alert(1)
undefined
window.innerHeight
202
window.innerWidth
1536
window.outerHeight
824
window.outerWidth
1536
// 可以调整浏览器窗口试试

Navigator(不建议使用)

Navigator,封装了浏览器的信息

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

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

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

screen

代表屏幕属性

screen.width
1536
screen.height
864

location(重要)

location 代表当前页面的URL信息

host: "www.baidu.com" //主机
href: "https://www.baidu.com/" //当前指向的位置
protocol: "https:"
replace: ƒ replace() //刷新网页
// 设置新的地址,在控制台中
location.assign('https://www.bilibili.com/video/BV1JJ41177di')

document

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

document.title //网页获取标题信息
"百度一下,你就知道"
document.title='haha'
"haha"

获取具体的文档树节点

<dl id="app">
    <dt>java</dt>
    <dd>javaSE</dd>
    <dd>javaEE</dd>
</dl>

<script>
    var dl = document.getElementById('app');
    console.log(dl);
</script>

获取cookie

通过
document.cookie
获取保存在浏览器的cookie

劫持cookie原理

在其他网页中植入一段js代码,获取cookie的值

<script src="aa.js"></script>
<!--恶意人员,获取你的cookie上传到他的服务器-->

服务器端可以设置cookie:httpOnly(只读)

history (不建议使用)

history代表浏览器的历史记录

history.back() //浏览器后退
history.forward() //前进

操作DOM对象(重点)

DOM:文档对象模型

核心

浏览器网页就是一个DOM属性结构

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

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

获取DOM节点

<body>
<div id="father">
    <h1>标题一</h1>
    <p id="p1">p1</p>
    <p class="p2">p2</p>
</div>

    <script>
        //对应CSS选择器
    var h1 =  document.getElementsByTagName("h1");
    var p1 =  document.getElementById("p1");
    var p2 =  document.getElementsByClassName("p2");
    var father = document.getElementById("father");

    //获取父节点下的所有子类的元素
    var childers =  father.children
    father.firstChild; //第一个节点
    father.lastChild; //

    p1.nextElementSibling; //获取下一个节点元素

    </script>
</body>

这是原生代码,之后使用JQuery

更新节点

<body>
    <div id="box">123</div>
    <div id="box1">123</div>

    <script>
        var div1 = document.getElementById("box");
        var div2 = document.getElementById("box1");

        //操作文本
        div1.innerText='123456'; //修改文本内容
        div2.innerHTML='<h1>123456</h1>'; //可以解析HTML文本标签

        //操作CSS
        //修改CSS样式,属性使用字符串
        div1.style.color = 'red'; 
        div1.style.fontSize = '20px';
        div1.style.padding = '2em';
    </script>
</body>

删除节点

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

<body>
    <div id="father">
        <h1>标题一</h1>
        <p id="p1">p1</p>
        <p class="p2">p2</p>
    </div>

    <script>
        var p1 =  document.getElementById("p1");
        var father =  p1.parentElement //获取父类元素
        father.removeChild(p1); //删除指定字节
        
        //删除是一个动态的过程
        father.removeChild(father.children[0]);
        father.removeChild(father.children[1]);
        father.removeChild(father.children[2]); //会出现找不到节点
    </script>
</body>

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

插入节点

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

追加

<body>
    <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追加到list中
</script>
</body>

效果:

在这里插入图片描述

创建一个新的标签,实现插入

//通过JS 创建一个新的节点
var newP = document.createElement('p'); //创建一个p标签
newP.id = 'newId'; //设置p标签id  
// newP.setAttribute('id','newId'); 

newP.innerText = "Hello World";
list.appendChild(newP);
//设置属性
var myScript = document.createElement('script');
myScript.setAttribute('type','text/javascript');

通过js设置样式

//第0个才是body
var mybody = document.getElementsByTagName('body')[0];
//设置样式
mybody.style.backgroundColor = 'red';
mybody.setAttribute('style','font-size:30px')

//通过创建style 设置样式
var myStyle = document.createElement('style');
myStyle.setAttribute('type','text/css');
myStyle.innerHTML = 'body{background-color : red;}';
document.getElementsByTagName('head')[0].appendChild(myStyle);

在这里插入图片描述

insertBefore

var list = document. getElementById('list');
var js = document. getElementById('js');
var ee = document. getElementById('ee');

// 包含目标节点的节点.insertBefore(newNode,targetNode);
//把新节点插入目标节点前面
list.insertBefore(js,ee);

操作表单

表单是什么 form DOM树

  • 文本框 text
  • 小拉框
  • 单选框 radio
  • 多选框 checkbox
  • 隐藏域 hidden
  • 密码框 password

表单的目的:提交信息

获得要提交的信息

<body>
    <form action="post">
       <p>
        <span>用户名:</span><input type="text" id="username">
       </p>

        <p>
            <!--程序读取的是 value 的值-->
        <span>性别:</span>
        <input type="radio" name=sex value="man" id='boy'><input type="radio" name=sex value="woman" id='girl'></p>
    </form>

    <script>
        var input_text = document.getElementById('username');
        var boy_radio = document.getElementById('boy');
        var girl_radio = document.getElementById('girl');

        input_text.value; //获取输入框的值

        //修改文本框的值
        input_text.value = '1234';

        //对于单选框,多选框,boy_radio.value只能取到当前的值

        //查看返回的结果是否为true,如果为true,则被选中
        boy_radio.checked;
        girl_radio.checked = true //赋值
    </script>
</body>

提交表单,MD5加密

<body>

<!--表单绑定提交事件
onsubmit = 绑定一个提交检测的函数 ,true  false
将这个结果返回给表单,使用onsubmit 接收
οnsubmit="return login()"
-->
<form action="https://www.baidu.com/" method="POST" onsubmit="return login()">
    <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">
    
    <!-- <input type="submit"> -->
    <!-- 绑定事件 onclick 被点击 -->
    <button type="submit" onclick="login()">提交</button>
</form>

<script>
    function login(){
        var username = document.getElementById('username');
        var password = document.getElementById('input-password');
        var md5pwd = document.getElementById('md5-password');

        //MD5算法,加密
        md5pwd.value = md5(password.value);
        //可以校验表单内容 true 通过提交,false 阻止提交
        return true;
     
    }
</script>     
</body>

jQuery

jQuery参考文档: https://jquery.cuishifeng.cn/index.html

JavaScript

jQuery库,里面存在大量的javascrip函数

引入jQuery

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <script src="./lib/jquery-3.4.1.js"></script>
</head>
<body>
    <a href="" id="text-jquery">点击</a>
    
<!-- 公式:$(selector).action() 
 $(选择器).事件(function(){})
-->
    
    <script>
        document.getElementById('id');

        //选择器就是CSS的选择器
        $('#text-jquery').click(function(){
            alert('helllo jquery');
        })

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

选择器

参考文档


$('#id').click();//id选择器
$('div').click();//元素选择器
$('.class').click();//类选择器

事件

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

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="./lib/jquery-3.4.1.js"></script>
    <style>
        #divMove {
            width: 500px;
            height: 500px;
            border: 1px solid red;
        }
    </style>
</head>
<body>
    <!-- 要求:获取鼠标当前的坐标 -->
mouse : <span id="mouseMove"></span>
<div id="divMove">
    在这里移动鼠标试试
</div>
    <script>
        //当网页元素加载完毕之后,响应事件
        // $(document).ready(function(){
        // })

        //简化
        $(function(){
            $('#divMove').mousemove(function (e) {
                $("#mouseMove").text('x:'+e.pageX + ',y:'+e.pageY)
            })
        });

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

操作DOM

节点文本操作

<ul id="text-ul">
    <li class="js">JavaScript</li>
<li name="python">Python</li>
</ul>

<script>
    // document.getElementById();

    $('#text-ul li[name=python]').text(); //获取值
//   $('#text-ul li[name=python]').text('12345'); //设置值

$('#text-ul').html();
//   $('#text-ul').html('<strong>123<strong>');
</script>

CSS操作

  $("#text-ul li[name=python]").css({ "color": "#ff0011", "background": "blue" });

元素的显示和隐藏:本质:display:none

$('.js').show();//显示
$('.js').hide();//隐藏

window

$(window).width() //宽度
$(window).height() //长度
 $('.js').toggle();

小技巧

1.巩固JS (看jQuery源码,看游戏源码)

2.巩固HTML,CSS (扒网站,全部down下来,然后对应修改看效果)

Layer 弹窗组件

Element-ui

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值