JavaScript基础

根据以下学习视频,个人整理的笔记

https://www.bilibili.com/video/BV1JJ41177di?spm_id_from=333.999.0.0&vd_source=7a8946d22777450e46486d5fd60d8d4d

什么是JavaScript

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

Java、JavaScript

JavaScript 一个大牛花了10天就写出来了

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

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

基本使用及HelloWorld

  • 引入JavaScript

JS和CSS都可以单独写在外面,也可以写在HTML页面里面,但JS可以放在head和body里面

例子

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		
		<!-- script 标签内,写JS代码 
			alert  弹窗
		-->
		<!-- <script type="text/javascript">
			alert("hello,world");
		</script> -->
		
		
		<!-- 引入外部JS代码 
			注意:script标签  必须成对出现
			type="text/javascript"   不用显示定义type,也默认是JavaScript
		-->
		<script type="text/javascript" src="JS/qj.js"></script>
		
	</head>
	<body>
		
		<!-- 这里也可以放JS代码 -->
		
	</body>
</html>

alert("hello,world!!!");

基本语法入门

  • 可以在浏览器源代码进行断点控制

  • 可以在浏览器控制台写代码,进行调试

在这里插入图片描述

例子

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		
		<!-- 
			JS严格区分大小写
		 -->
		<script type="text/javascript">
			//定义变量     Java:变量类型   变量名   =   变量值;
			//JS里面所有的变量类型都写成   var
			var num = 1;
			var name = "qinjiang";
			
			'helloworld' //在JS中这一行也是一个完整的语句
			
			alert(num);
			alert(name);
			
			var score = 71;
			
			
			//条件控制
			if(score>60 && score<70){
				alert("60~70");
			}else if(score>70 && score<80){
				alert("70~80");
			}else{
				alert("other");
			}
			
			// console.log(score)   在浏览器的控制台去写,打印一个变量
			
			//多行注释
			/*
			
			*/

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

数据类型

数值,文本,图形,音频,视频。。。

变量

  • JS中所有变量类型一般都使用 var
  • 变量名不能以数字开头

JS不区分小数和整数,统一用Number

  • Number

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

    • ‘abc’
    • “abc”
  • 布尔值

    • true
    • false
  • 逻辑运算

    • && 与
    • || 或
    • ! 非
  • 比较运算符

    • = 赋值
    • == 等于(类型不一样,值一样,也会判断为true)
    • === 绝对等于(必须类型一样,值一样,才会判断为true)
  • NaN===NaN 结果为false,NaN与所有的数值都不相等,包括NaN自己

  • isNaN(NaN) 结果为true,只能通过这样去判断这个数是否为NaN

  • JS浮点数问题

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		
		<script type="text/javascript">
			console.log((1/3) === (1-2/3))
			// 控制台显示为false
            //尽量避免使用浮点数进行运算,存在精度问题
            
            console.log(Math.abs(1/3-(1-2/3))<0.00000000001);
			//true,判断是否几乎相等
            
		</script>

	</head>
	<body>
	</body>
</html>
  • null和undefined

    • null 空
    • undefined 未定义
  • 数组

    • Java的数组必须是一系列相同类型的对象,JS中不需要这样

    • <script type="text/javascript">
          var arr = [1,2,3,4,5,'hello',null,true]
          console.log(arr)
      </script>
      
    • <script type="text/javascript">
      
          // 保证代码的可读性,尽量使用中括号
          var arr = [1,2,3,4,5,'hello',null,true]
          console.log(arr)
      
          //也可以这样
          new Array(1,12,3,4,4,6,'hello')
      
      </script>
      
    • 如果数组下标越界了,就会报 undefined

  • 对象

    • 对象用大括号 {} ,数组用中括号 []

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

    • <script type="text/javascript">
      
          // Java:Person person = new Person(1,2,3,4,5);
          var person = {
              name: "qinjiang",
              age: 3,
              tags: ['js','java','web','....']
              
          //控制台取值:
          //   		person.age
      	//			3
      	//			person.name
      	//			'qinjiang'
      	//			person.tags
      	//			(4)['js', 'java', 'web', '....']
          }
      
      </script>
      

严格检查模式

例子

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		
		<script type="text/javascript">
		
			// 严格检查模式,可以预防JS的随意性导致产生的一些问题
			//'use strict';    必须写在JS的第一行
			'use strict';//此时控制台会显示 i 没有被定义
			
			
			i = 1; //默认为全局变量,全局变量很容易导致报错,我们拒绝使用全局变量,
			
			var k = 2;//局部变量
			
			let j = 3;//局部变量,局部变量都建议使用 let 去定义

		</script>

	</head>
	<body>
	</body>
</html>

字符串类型详解

  • 正常字符串我们使用 单引号,或者双引号
  • 转义字符 \
    • 换行 \n
    • 对齐 \t
    • Unicode字符 \u####
    • Ascll字符 \x41对应 A
  • 多行字符串编写
  • 模板字符串
  • 字符串长度
  • 字符串的可变性:不可变
  • 大小写转换
  • 获取指定的下标
  • 截取字符串

例子

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		
		<script type="text/javascript">
			'use strict';
			
			console.log('\'a\'\nb');
			console.log("\u4e2d");//显示为    中
			
			
			//多行字符串编写
			// ``  在tab键上面的那个符号
			var msg =	
				`
				hello
				world
				你好啊
				`
				
				
			//模板字符串
			let name = "qinjiang";
			let age = 3;
			
			let msg1 = `你好啊,${name},第${age}次碰见你`
			
			//字符串长度
			var student = "student";
			console.log(student.length)
			
			
			// 大小写转换
			console.log(student.toUpperCase())//注意这里是方法不是属性了
			console.log(student.toLocaleLowerCase())
			
			//获取指定的下标
			console.log(student.indexOf('u'))
			
			//截取字符串 
			console.log(student.substring(1,3))
			
		</script>
		
	</head>
	<body>
	</body>
</html>

数组类型详解

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

  • 假如给数组长度赋值,数组大小就会发生变化;如果赋值过小,元素就会丢失

  • 数组可以通过下标取值和赋值

  • indexOf() 通过元素获得对应的数组下标(字符串的“1”和数字 1 是不同的)

  • slice() 截取数组Array的一部分,返回一个新数组,原来的数组不变

  • push() (往数组尾部压入元素)

  • pop() (弹出数组尾部元素)

  • unshift() (头部压入)

  • shift() (头部弹出)

  • sort() 排序

  • reverse() 元素反转

  • concat() 为数组拼接添加数组元素,返回一个新数组,原来的数组不变

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

  • var arr = [[1,2],[3,4],[‘a’,‘g’]] 多维数组

例子

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>		
		<script type="text/javascript">
			
			var arr = [1,2,3,4,5,6]
			
			console.log(arr)
			
			//长度
			arr.length = 10
			console.log(arr)
			
			//indexOf()      通过元素获得对应的数组下标
			console.log(arr.indexOf(2))
			
			//截取数组
			arr.slice(3)
		</script>
	</head>
	<body>
		
	</body>
</html>

对象类型讲解

若干个键值对

var 对象名 = {
    属性名:属性值,
    属性名:属性值,
    属性名:属性值
    (键)  (值)
}

//定义了一个person对象,它有四个属性
var person = {
    name: "kuangshen",
    age: 3,
    email: "qwewqeqe@163.com",
    score: 0
}		

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

  • 对象赋值

  • 使用一个不存在的对象属性,不会报错

  • 可以动态地删减和添加属性

    • delete

      delete person.name
      
    • 直接给新的属性添加值即可

      person.haha = "wdwdwd"
      
  • 判断属性值是否在这个对象中

'age' in person


'toString' in person//结果是true
//toString 是继承来的

  • 判断一个属性是否是这个对象自身拥有的 hasOwnProperty()
person.hasOwnProperty('toString')
//这里结果是false

流程控制

  • if判断
<script type="text/javascript">
    'use strict'

    let age = 3;
    if(age>10){
        alert("haha");
    }else if(age>5){
        alert("kuwa~");
    }else {
        alert("kuwa~");
    }

</script>
  • 循环

    • while循环(避免程序死循环)
    <script type="text/javascript">
        'use strict'
    
        let age = 3;
    
        while(age<100){
            age = age + 1;
            console.log(age)
        }
        
        do{
            age = age + 1;
            console.log(age)
        }while(age<120)
    </script>		
    
    • for循环
    <script type="text/javascript">
        'use strict'
    
        let age = 3;
    
        for(let i=0; i<100; i++){
            console.log(i)
        }
    </script>
    
    • forEach循环
    <script type="text/javascript">
        'use strict'
    	
        let age = [123,32,42,55,67,88,95]
    	
        //函数
        age.forEach(function (value) {
            console.log(value)
        })
    </script>
    
    • for…in循环
    <script type="text/javascript">
        'use strict'
    
        let age = [123,32,42,55,67,88,95]
    
        for(let num in age){
            console.log(age[num])
        }
    
    </script>
    
    • for…of 打印具体的值
    //通过for...of 直接打印里面的值
    var arr1 = [3,4,5,6]
    for(var x of arr1){
        console.log(x)
    }
    

Map和Set集合

  • Map
var map = new Map([['tom',77],['jack',98],['hatea',89]]);
					//键  值
var score = map.get('tom'); //通过key获得value

map.set('admin',123456); //新增或修改

console.log(score);
map.delete("tom");//删除
console.log(map);
  • Set:无序不重复的集合
<script type="text/javascript">
    'use strict'
    var set = new Set([3,1,1,1,1]);

    set.add(2);
    set.delete(1);

    //判断是否包含
    console.log(set.has(3));

    console.log(set);
</script>

iterator

  • for…of 打印具体的值

遍历数组

//通过for...of 直接打印里面的值
var arr1 = [3,4,5,6]
for(var x of arr1){
    console.log(x)
}

遍历map

var map = new Map([['tom',88],['jack',90],['hatea',66]]);
//console.log(map);

for(var x of map){
    console.log(x);
}

遍历set

let set = new Set([5,6,7]);
for (let x of set){
    console.log(x);
}

函数

方法: 对象(属性,方法)

函数:可以理解为如果把函数放到对象里面就叫做方法,单独放外面叫函数

定义方式一

  • 定义函数
    • 绝对值函数
function abs(x){
    if(x>=0){
        return x;
    }else{
        return -x;
    }
}

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

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

定义方式二

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


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

调用函数

abs(10)
abs(-10)

JS可以传任意个参数,也可以不传参数

如何避免不存在参数的情况

<script type="text/javascript">
    var abs = function(x){

        //手动抛出异常来判断
        if(typeof x!=="number"){
            throw "Not a number";
        }

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

argume

<script type="text/javascript">
    var abs = function(x){

        //arguments  是JS免费赠送的关键词
		//利用arguments可以获得传入的所有参数
        for(var i=0; i<arguments.length; i++){
            console.log(arguments[i]);
        }

        //手动抛出异常来判断
        if(typeof x!=="number"){
            throw "Not a number";
        }

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

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

rest

rest 获取除了已经定义的参数之外的所有参数!

<script type="text/javascript">

    function aaa(a,b,...rest){

        console.log('a=>' + a);
        console.log('a=>' + b);

        console.log(rest);

    }
</script>

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

变量的作用域

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

假设在函数体中声明,则在函数体外不可以使用**(想实现函数体外使用,可以研究 闭包)**

<script type="text/javascript">

    // "use strict"	

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

    x = x + 2;//x未定义,报错

</script>

如果两个函数使用了相同的变量名,不会冲突

<script type="text/javascript">

    // "use strict"	

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

    function qj1(){
        var x = "a";
        x = x + 1;
    }

</script>

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

<script type="text/javascript">

    // "use strict"	

    function qj(){
        var x = 1;

        //内部函数可以访问外部函数的成员,反之则不行
        function qj1(){
            var y = x + 1;//报错
        }

        var z = y + 1;//报错
    }
</script>

内、外部函数的变量重名

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

<script type="text/javascript">

    // "use strict"	

    function qj(){
        var x = 1;

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

        console.log('outer' + x);

        qj1();
    }

    qj();

</script>

提升变量的作用域

<script type="text/javascript">

    function qj(){
        var x = "x" + y;
        console.log(x);
        var y = 'y';//这里相当于 var y; 提升了y的声明,但是没有提升y的赋值
    }
    qj();//控制台结果:xundefined

</script>

说明:JS执行引擎,自动提升了y的声明,但是没有提升y的赋值,这是JS的特性。**所以建议养成规范,在JS里面,把所有的变量提到最前面进行定义。**便于代码维护

function qj2(){
    var x = 1,
        y = x + 1;
    z,i;

    //之后随意用	

}

全局变量

var x = 1;
function f(){
    console.log(x);
}
f();
console.log(x);

全局对象 window

<script type="text/javascript">

    "use strict"

    var x = 'xxx';

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

</script>

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

<script type="text/javascript">

    "use strict"

    var x = 'xxx';

    window.alert(x);

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

    window.alert =function(){

    };

    window.alert(123);//发现alert失效,因为我们手动定义了一个全局变量把alert覆盖了

    //恢复
    window.alert = old_alert;
    window.alert(789);


</script>

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

规范

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

那么如何减少冲突?

把自己的代码全部放入自己定义的唯一空间名字中,降低全局命名冲突的问题。(那么谁在这么做呢,由此引出 jQuery )

jQuery.

由于 jQuery 不好写,所以有一个简化符号 $

例子

<script type="text/javascript">

    "use strict"

    //自定义唯一全局变量
    var KuangApp = {};

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

</script>

局部作用域 let

var 关键字发现问题

function aaa(){
    for(var i=0; i<100; i++){
        console.log(i);
    }
    console.log(i+1);//发现问题:i出了作用域还能使用
}

aaa()

let 关键字,解决局部作用域冲突问题**(所以建议使用let)**

function aaa(){
    for(let i=0; i<100; i++){
        console.log(i);
    }
    console.log(i+1);//i 出了作用域就不行了
}

aaa()

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

常量 const

const PI = "3.14";//只读变量
console.log(PI);

PI = 123;//常量不能改变,这里会报错

方法(把函数放到对象里面叫方法)

定义方法

例子

let kuangshen = {
    name: '秦疆',
    birth: 2000,

    //方法
    age: function(){
        let now = new Date().getFullYear();
        return now-this.birth;
    }
}	
//调属性
kuangshen.name

//调方法,带括号
kuangshen.age()

this. 代表什么

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

let kuangshen = {
    name: '秦疆',
    birth: 2000,

    //方法
    age: getAge   //这里不用加括号
}	

// console.log(kuangshen.age())    可以

// console.log(getAge())   不可以,会报错。this是指向使用者,此时 Window 没有birth这个对象

Java中:this 是默认指向调用它的对象

apply

在 JS 中可以控制 this 指向

<script type="text/javascript">
    "use strict"

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

    let kuangshen = {
        name: '秦疆',
        birth: 2000,

        //方法
        age: getAge   //这里不用加括号
    }	

    //任何函数都有一个属性 apply
    getAge.apply(kuangshen,[]);//代表this指向kuangshen这个对象,参数为空	

</script>

Date日期对象

标准对象

typeof 判断是什么对象

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

基本使用

例子

let now = new Date();//当前时间

now.getFullYear();//年
now.getMonth();//月  老外是0~11月
now.getDate();//日
now.getDay();//表示星期几
now.getHours();
now.getMinutes();
now.getSeconds();

now.getTime();//时间戳  全球统一时间从 1970 1.1 00:00:00  开始到现在的毫秒数

console.log(new Date(1637477294244)); //时间戳转为时间

//now.toLocaleString();   转换为当地时间

JSON

JSON是什么?

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

  • JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式

  • 简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言

  • 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率

在JS中,一切皆为对象,任何JS支持的类型都可以用JSON来表示

格式

  • 对象都用大括号 {}
  • 数组都用中括号 []
  • 所有的键值对都使用 key:value

JSON字符串 和 JS 对象的转换

例子

let user = {
    name : "qinjiang",
    age : 3,
    sex : "man"
}

//对象转换为JSON字符串
var jsonUser = JSON.stringify(user);
//{"name":"qinjiang","age":3,"sex":"man"}

//JSON字符串转换为对象    JSON.parse 参数为json字符串
var obj = JSON.parse('{"name":"qinjiang","age":3,"sex":"man"}');//里面双引号,外面单引号。反之则相反
//{name: 'qinjiang', age: 3, sex: 'man'}

JSON字符串 和 JS 对象的区别

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

面向对象编程

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

JS的面向对象有些不一样

在JS中这个需要换一下思维方式

  • 原型:
let user = {
    name : "qinjiang",
    age : 3,
    run : function(){
        console.log(this.name + "run...");
    }
}

let xiaoming = {
    name : 'xiaoming'
}

//这里表示xiaoming的原型是user,很随意
//原型可以简单理解为父类
xiaoming.__proto__ = user;

class 继承

定义一个类,类里面有属性和方法

<script type="text/javascript">

    // function Student(name){
    // 	this.name = name;
    // }

    // 给Student新增一个方法
    // Student.prototype.hello = function(){
    // 	alert("Hello");
    // }

    //ES6 之后的做法
    //定义一个学生的类
    class Student{
        constructor(name) {   //理解为构造器
            this.name = name;
        }

        hello(){
            alert("hello");
        }
    }
    
    var xiaoming = new Student("xiaoming");
    var xiaohong = new Student("xiaohong");

</script>
  • 继承
<script type="text/javascript">
    //ES6 之后的做法
    //定义一个学生的类
    class Student{
        constructor(name) {
            this.name = name;
        }

        hello(){
            alert("hello");
        }
    }

    class XiaoStudent extends Student{
        constructor(name,grade) {
            super(name);
            this.grade = grade;
        }

        myGrade(){
            alert("我是一名小学生");
        }

    }

    var xiaoming = new Student("xiaoming");
    var xiaohong = new XiaoStudent("xiaohong",1);

</script>

原型链(只作了解)

prototype:原型对象

Object的原型对象是它自己,Object的原型对象的构造函数还是Object

操作BOM对象(重点)

BOM:浏览器对象模型

JS和浏览器的关系

  • JS的诞生就是为了能够让它在浏览器中运行

浏览器内核介绍

  • IE
  • Chrome
  • Safari
  • FireFox

window

window 代表浏览器窗口

window.alert(1)
undefined
window.innerHeight
167
window.innerWidth
613
window.outerWidth
566
window.outerHeight
466

Navigator

Navigator 封装了浏览器的信息

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

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

不建议使用这些属性来判断和编写代码,因为会被人为修改

screen

screen 代表全屏幕属性

screen.height
864
screen.width
1536

location (重要)

location 代表当前页面的URL信息

重要的信息有:
host: "www.baidu.com"
href: "https://www.baidu.com/"
protocol: "https:"
reload: ƒ reload()     刷新页面

设置新的地址
location.assign("https://mail.163.com/")   

document

document 代表当前的页面

document.title
'百度一下,你就知道'
document.title='哈哈'
'哈哈'

通过document获取具体的文档树节点

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>
		
		<dl id="app">
			<dt>Java</dt>
			<dd>JavaSE</dd>
			<dd>JavaEE</dd>
			
		</dl>

		<script type="text/javascript">
			
			var dl = document.getElementById('app');
			
			console.log(dl);
		</script>
		
	</body>
</html>

document.cookie 可以获取网页的cookie(cookie:客户端的本地信息发送给服务器)

劫持 cookie 原理

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

服务器端可以设置cookie:httpOnly 保证我们的cookie安全

history

history 代表浏览器的历史记录

history.back()     网页后退
history.forward()  网页前进

获得DOM节点(重点)

DOM:文档对象模型

核心

  • 整个浏览器网页就是一个DOM树形结构
    • 更新DOM节点
    • 遍历DOM节点:得到DOM节点
    • 删除DOM节点
    • 添加DOM节点
  • 要操作一个DOM节点,就必须要先获得这个DOM节点

例子

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		
	</head>
	<body>
		
		<div id="father">
			<h1>标题1</h1>
			<p id="p1">p1</p>
			<p class="p2">p2</p>
		</div>

		<script type="text/javascript">
			
			//对应 css 的选择器
			var h1 = document.getElementsByTagName("h1");
			var p1 = document.getElementById("p1");
			var p2 = document.getElementsByClassName("p2");
			var father = document.getElementById("father");
			
			//获取父节点下的所有子节点
			var childrens = father.children;
			// father.firstChild;
			// father.lastChild;
			
		</script>
		
		
	</body>
</html>

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

更新DOM节点

例子

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>
		
		
		<div id="id1">
			
		</div>
		
		<script type="text/javascript">
			var id1 = document.getElementById("id1");
			
		</script>
		
	</body>
</html>

  • id1.innerText=‘456’ 修改文本的值
  • id1.innerHTML=‘123’ 可以解析html文本标签

例子

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>
		
		<div id="id1">
			
		</div>
		
		<script type="text/javascript">
			var id1 = document.getElementById("id1");
			id1.innerText='abc';
		</script>
		
	</body>
</html>

  • id1.style.color = “red” 修改字体颜色

  • id1.style.fontSize = “200px”; 改变字体大小

  • id1.style.padding = “2em” 改变内边距

删除DOM节点

删除节点的步骤

  • 先获取父节点
  • 再通过父节点删除自己

例子

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		
	</head>
	<body>
		
		<div id="father">
			<h1>标题1</h1>
			<p id="p1">p1</p>
			<p class="p2">p2</p>
		</div>

		<script type="text/javascript">
			
			var self = document.getElementById("p1");
	
			var father = p1.parentElement;
				
		</script>
		
	</body>
</html>
  • father.removeChild(self); 通过父节点删除自己

  • father.removeChild(father.children[0]) 删除多个节点的时候,一定要注意children是在时刻变化的

插入DOM节点

我们获得了某个DOM节点,假设这个DOM节点是空的,我们通过 innerHTML 就可以增加一个元素了,但是如果这个DOM节点已经存在元素了,我们就不能这么做了,因为会覆盖原来的内容

一般通过追加操作

例子

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<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 type="text/javascript">
			var js = document.getElementById("js");
			var list = document.getElementById('list');
			
			list.appendChild(js);  //把已存在的节点追加到后面
			
            
            
		</script>

	</body>
</html>

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

例子

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<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 type="text/javascript">
			var js = document.getElementById("js");
			var list = document.getElementById('list');
			
			list.appendChild(js);  //追加到后面
			
			//通过JS创建一个新的节点
			var newP = document.createElement('p');  //创建一个p标签
            // newP.setAttribute('id','newP');  和下面一行等价
			newP.id = 'newP';  //创建一个 id = "newP"
			newP.innerText = 'Hello,Kuangshen';
			
			list.appendChild(newP);
			
           	//创建一个标签节点   (通过这个属性可以设置任意的值)
			var myScript = document.createElement('script');
			myScript.setAttribute('type','text/javascript');
			
			list.appendChild(myScript);
            
            //可以创建一个style标签
			var myStyle = document.createElement('style');
			myStyle.setAttribute('type','text/css');
			myStyle.innerHTML = 'body{background-color: red;}';
			
			//把style标签添加到head标签下
			document.getElementsByTagName('head')[0].appendChild(myStyle);//第0个才是head标签
			
		</script>
		
	</body>
</html>

我们完全可以直接用JS代码编写网页的内容,由于代码繁琐,所以 jQuery 诞生

插入到前面

例子

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>

	</head>
	<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 type="text/javascript">
				
			var myee = document.getElementById('ee');
			var myjs = document.getElementById('js');
			var mylist = document.getElementById('list');
			
			// 要包含的节点.insertBefore(新节点,目标节点);
			mylist.insertBefore(myjs,myee);

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

操作表单(验证)

表单form本身也是DOM里面的一个节点

  • 文本框
  • 下拉框
  • 单选框
  • 多选框
  • 隐藏域
  • 密码框

表单的目的:提交信息

我们获得要提交的信息

例子

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>
		
		<form method="post">
			
			<p>
				<span>用户名:</span><input type="text" name="" id="username" value="" />
			</p>
			
			<!-- 多选框的值就是定义好的value值 -->
			<p>
				<span>性别:</span>
				<input type="radio" name="sex" id="boy" value="boy" /><input type="radio" name="sex" id="girl" value="girl" /></p>
			
		</form>
		
		
		<script type="text/javascript">
			var input_text = document.getElementById('username');
			var boy_radio = document.getElementById('boy');
			var girl_radio = document.getElementById('girl');
			
			//对于单选框、多选框等等固定的值  boy_radio.value   只能取到当前的值
			//boy_radio.checked   可以查看返回的结果是否为true,若为true则被选中,或赋值为true让它选中
			
			//input_text.value   得到输入框的值
			//input_text.value = 'hhh'   修改输入框的值
		</script>
		
	</body>
</html>

表单提交验证及前端密码MD5加密

例子

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<!-- MD5的工具类 -->
		<script type="text/javascript" src="https://cdn.bootcss.com/blueimp-md5/2.10.0/js/md5.min.js">
			
		</script>
	</head>
	<body>
		<form action="#" method="post" >
			
			<p>
				<span>用户名:</span><input type="text" name="un" id="username"/>
			</p>
			<p>
				<span>密码:</span><input type="password" name="pwd" id="password"/>
			</p>

			<!-- 绑定事件 onclick 被点击-->
			<p>
				<button type="submit" onclick="aaa()">提交按钮</button>
			</p>
		</form>
		
		
		<script type="text/javascript">
			
			function aaa(){
				var  uname = document.getElementById('username');
				var pwd = document.getElementById('password');
				
				console.log(uname.value);
				console.log(pwd.value);
				
				//MD5 算法
				pwd.value = md5(pwd.value);
				console.log(pwd.value);
				
				
			}
			
			
		</script>
		
	</body>
</html>

jQuery

jQuery 就是一个封装了大量大量 JS 方法的一个工具类,可以叫一个库。

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

获取jQuery

可以搜索 cdn jQuery

jQuery公式: $(选择器).事件() 选择器就是css的选择器

例子

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		
		<!-- 导入jQuery -->
		<script type="text/javascript" src="lib/jquery-3.4.1.js">
			
		</script>
	</head>
	<body>
		
		<!-- 公式:  $(选择器).事件()	    选择器就是css的选择器 -->
		
		<a href=""  id="test-jquery">点我</a>
		
		<script type="text/javascript">
			
			$('#test-jquery').click(function(){
				alert('hello,jQuery');
			})
			
		</script>
		
	</body>
</html>

js 和 jQuery 的对比

例子

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>
		
		<script type="text/javascript">
			//原生的js,选择器少,而且麻烦
			//标签   id   类
			// document.getElementsByTagName();
			// document.getElementById();
			// document.getElementsByClassName();
			
			//jQuery   css中的选择器全部都能用
			$('p').click();      //标签选择器
			$('#id1').click();   //id选择器
			$('.class1').click();//类选择器
			
		</script>
	</body>
</html>

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

jQuery事件

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

获取鼠标坐标

例子

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		
		<script type="text/javascript" src="lib/jquery-3.4.1.js">
			
		</script>
		
		<style type="text/css">
			#divMove{
				width: 500px;
				height: 500px;
				border: 1px black solid;
			}
		</style>
	</head>
	<body>
		<!-- 获取鼠标当前的一个坐标 -->
		
		mouse : <span id="mouseMove"></span>
		<div id="divMove">
			在这里移动鼠标试试
		</div>
		
		<script type="text/javascript">
			// 当网页元素加载完毕之后,响应事件
			// $(document).ready(function(){})   可简化成   $()
			
			$(function(){
				$('#divMove').mousemove(function(e){
					$('#mouseMove').text('x:' + e.pageX + 'y:' + e.pageY)
				})
			});
			
		</script>
		
		
	</body>
</html>

  • jQuery操作DOM元素

例子

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		
		<script type="text/javascript" src="lib/jquery-3.4.1.js">
			
		</script>
		
	</head>
	<body>
		
		<ul id="test-ul">
			<li class="js">JavaScript</li>
			<li name='python'>Python</li>
		</ul>
		
		<script type="text/javascript">
			
			$('#test-ul li[name=python]').text();//获取值
			//$('#test-ul li[name=python]').text('123123123');    设置值
			$('#test-ul').html();
			//$('#test-ul').html('<strong>哈哈哈</strong>');    设置值
		</script>
		
	</body> 
</html>

css操作

例子

$('#test-ul li[name=python]').css('color','red');

隐藏元素

例子

$('#test-ul li[name=python]').hide() //相当于 display:none

未来要学的ajax();

$('#id1').ajax()

爬取网页代码技巧

逐行删除不影响网页的代码,然后可以copy自己改

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值