前端基础_JavaScript

1. What

JavaScript(简称“JS”) 是一种具有函数优先的轻量级、解释型或即时编译型的编程语言。虽然它是作为开发Web页面的脚本语言而出名,但是它也被用到了很多非浏览器环境中,JavaScript 是基于原型编程、多范式的动态脚本语言,并且支持面向对象、命令式、声明式、函数式编程范式。JavaScript的标准是ECMAScript 。

1.1 概述

JavaScript是一门世界上最流行的脚本语言,一个合格的后端程序员,必须精通javaScript

1.2 历史 (知乎链接)

ECMAScript可以理解为是javaScript的一个标准,目前已经到es6版本;但是大部分浏览器还只停留在支持es5代码上,这就导致开发环境与线上环境版本不一致~

2. 快速入门

2.1 引入JavaScript

  1. 内部标签

    <!--script标签内写JavaScript代码;标签放在head标签内或body标签内皆可-->
    <script>
        alert("hello world");
    </script>
    
    <!--不用显式定义type,默认即为javascript-->
    <script type="text/javascript">
        alert("hello world");
    </script>
    
  2. 外部引入
    test.js

    alert("hello,world!");
    

    test.html

    <!--注意:script标签必须成对出现!-->
    <script src="js/test.js"></script>
    

2.2 基础语法入门

<!--JavaScript严格区分大小写-->
<script>
	//1.定义变量  变量类型 变量名 = 变量值;
	var score = 71;
	
	//2.条件控制
	if(score > 60 && score < 70){
	    alert("60-70");
	}else if(score > 70 && score < 80){
	    alert("70-80");
	}else{
	    alert("other");
	}
	//console.log(score) 在浏览器控制台打印变量! System.out.print();
</script>

2.3 数据类型

数值、文本、图形、音频、视频
变量

var temp = 'test'; 

number(JS不区分小数和整数)

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

字符串

'abc'
"abc"

布尔值

true
false

逻辑运算

&&  	// 两个都为真,结果为真
||  	// 一个为真,结果为真
!		// 取反

比较运算符(重要)

=		// 赋值符号
== 		// 等于(类型不一样,值一样,也会判断为true;不推荐使用)
=== 	// 绝对等于(类型一样,值一样,结果为true)

须知:NaN === NaN
Nan与所有的数值(包括自己)都不相等,只能通过isNaN(NaN)来判断这个数是否是NaN

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

 console.log((1/3)===(1-2/3));
 Math.abs(1/3-(1-2/3))<0.000000001;

null和undefined

  • null 空
  • undefined 未定义

数组
Java数组中的数值必须是相同类型的对象,JavaScript中则不需要

// 保证代码的可读性,尽量使用[]中括号
var arr = [1,3,5,7,"ab",null,true];
new Array(1,2,3,'hello');

取数组下标越界则会返回undefined

对象
对象是大括号{ },数组是中括号[ ];每个属性之间使用逗号隔开,最后一个不需要添加

//Person person=new Peson();
var person = {
    name: "wang",
    age: 3,
    tags: ['js','java','web','...']
}

取对象的值

> person.name
> person.age

2.4 严格检查模式

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

</body>
</html>

3. 数据类型

3.1 字符串

  1. 正常字符串我们使用单引号’ ’ 或者双引号" "包裹;
  2. 个别字符需要使用转义字符输出
    \'				字符串
    \n				换行
    \t				制表符
    \u4e2d			Unicode字符	\u####
    \x41			Ascll字符
    
  3. 多行字符串编写
    // tab上面 esc下面的 `键
    var msg = `
    	a
    	b
    	c
    `;
    
  4. 模板字符串
    //tab上面 esc键下面 `键
    let name = "wang";
    let age = 3;
    let msg = `你好啊,${name}`;
    
  5. 字符串长度
    var str = 'wang';
    console.log(str.length);
    
  6. 字符串的可变性——不可变
  7. 大小写转换
    // 注意,此处的toUpperCase()以及toLowtoLowerCase()是方法而非属性
    var str = 'wang';
    console.log(str.toUpperCase());
    console.log(str.toLowerCase());
    
  8. 获取下标索引
    var str = 'wang'
    str.indexOf('t');
    
  9. 截取字符串
    // [)包含左边数字 不包含右边数字
    var str = 'wang'
    str.substring(1,3);  // [1,3) 从第1个字符截取到第3个字符,不包含第3个
    

3.2 数组

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

var arr = [1,2,3,4,5,6];	
arr[0];   // 下标取值
arr[0] = 1;   // 下标赋值
  1. 长度

    console.log(arr.length);
    

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

  2. 通过元素获得下标索引(indexOf方法)

    // 参数中字符串的“1”和数字1是不同的
    console.log(arr.indexOf(2));   // 输出1
    
  3. slice()截取Array的一部分,返回一个新数组,类似于String中的substring方法

    arr.slice(3);   // 输出[4,5,6]
    arr.slice(1,3);   // 输出[2,3]
    
  4. push() & pop() (对尾部的操作)

    • push:压入到尾部
    • pop:弹出尾部的一个元素
  5. unshift() & shift() (对头部的操作)

    • unshift:压入到头部
    • shift:弹出头部的一个元素
  6. 元素排序 sort()

    arr.sort();
    
  7. 元素反转 reverse()

    arr.reverse();
    
  8. 拼接方法 concat() (拼接到尾部)

    //concat()并没有修改数组,只是会返回一个新的数组
    arr.concat([1,2,3])
    
  9. 连接符 join

    // 打印拼接数组,使用特定的字符串拼接
    arr.join('-');   // "1-2-3-4-5-6"
    
  10. 多维数组

    arr=[[1,2,3],[4,5,6],["7","8"]];
    arr[1][1];   // 输出为5
    

3.3 对象

若干个键值对

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

javascript中的 {…}表示一个对象,键值对描述属性xxxx: xxxx,多个属性之间使用逗号隔开,最后一个属性不加逗号!其中的所有的键都是字符串,值是任意对象!

  1. 对象赋值
    person.name = "wang";
    
  2. 使用一个不存在的对象属性,不会报错!
    person.sex   // 无sex属性,返回undefined
    
  3. 动态删减属性,通过delete删除对象的属性
    delete person.name;
    true   // 此时对象person中已删除掉name属性
    
  4. 动态添加属性,直接给新的属性添加值即可
    person.sex = "man";
    "man"   // 此时对象person中已添加上sex属性
    
  5. 判断属性值是否在这个对象中
    'sex' 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){}
else if(age < 5){}
else{}

while循环

while(age < 100){
    age = age + 1;
    console.log(age);
}

do{}while()

for循环

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

forEach循环

var age = [11, 22, 33, 44, 55, 66, 77, 88, 99];
// 函数
age.forEach(function(value){
	console.log(value);
})

for…in得到的是下标 | for…of得到的是元素值

// for(var index in object){}
for(var num in age){
	if(age.hasOwnProperty(num)){
		console.log("存在");
		console.log(age[num]);
	}
}

3.5 Map & Set(ES6的新特性)

Map

//es6
var map = new Map([['tom',100],['jack',90]]);
var name = map.get('tom');   // 通过key获得value
map.set('admin',100);
map.delete('tom');

Set:无序不重复集合

var set = new Set([1, 2, 3, 3, 2, 1]);   // set可以去重
set.add(7);
set.delete(1);
console.log(set.has(3));   // true

3.6 iterator

iterator用来遍历迭代Map和Set

// 通过for of遍历得到的是元素;for in得到的是下标
var arr = [3,4,5];
for(let x of arr){
    console.log(x);
}

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

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

4. 函数

4.1 定义函数

绝对值函数(两种定义方式等价)

// 定义方式一
function abs(x){
    if(x >= 0){
        return x;
    }else{
        return -x;
    }
}

// 定义方式二
var abs = function(x){
    if(x >= 0){
        return x;
    }else{
        return -x;
    }
}
  • 执行至return代表函数结束并返回结果,若没有执行至return,函数执行完也会返回undefined;
  • function(x){…} 这是一个匿名函数,执行结束后会将结果赋值给abs,通过abs就可以调用函数!

调用函数

abs(10);
abs(-10);

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

参数进来是否存在问题?假设不存在参数,如何规避? 通过typeof关键字来解决

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

  arguments是一个JavaScript免费赠送的关键字,代表传递进来的所有参数(以数组方式存在);而arguments包含了所有的参数,当需要用其中部分未定义的参数来进行附加操作就需要排查已定义参数。
  因此引入rest作为ES6的新特性之一,用于获取未定义的参数。

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

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

4.2 变量的作用域

  • 在JavaScript中,var定义的变量实际是有作用域的;假设在函数体中声明,则在函数体外不可以使用 (非要想实现的话,可以使用闭包);
  • 如果两个函数使用了相同的变量名,只要在不同函数内部就不冲突;
  • 内部函数可以访问外部函数的成员,反之则不行;
  • 内部函数变量和外部函数变量重名时,函数查找变量会从自身函数开始由内向外查找,倘若内外部同时存在这个同名函数变量,则内部函数会屏蔽外部函数的变量~
function fun(){
	var x = 1;
	x = x + 1;
}

x = x + 2;   // Uncaught ReferenceError: x is not defined

function fun1(){   // 无事发生,不会冲突报错
	var x = 'W';
	x = x + 1;
}

function fun2(){  
	var x = 1;
	function fun3(){
		var y = x + 1;   // 输出2
	}
	var z = y + 1;   // Uncaught ReferenceError: y is not defined
}

提升变量的作用域

/**
* JavaScript执行引擎会自动提前y的声明,但是不会提前变量y的赋值;
* 这个是在JavaScript建立之初就存在的特性;
* 因此以后要养成规范:所有的变量定义都放在函数的头部以便于后期维护
*/
function fun(){   // 运行函数会返回xundefined
    var x = "x" + y;
    console.log(x);
    var y = 'y';
}


// 等同于
function fun2(){
    var y;
    var x = "x" + y;
    console.log(x);
    y = 'y';
}

全局变量

/**
* 默认所有的全局变量都会自动绑定在window对象下;
* alert()这个函数本身也是一个window变量;
*/
var x = 'wang';
alert(x);
alert(window.x);  
window.alert(x);
window.alert(window.x);

测试:上面最后四行语句等价且输出结果相同。

/**
* JavaScript实际上只有一个全局作用域,
* 任何变量(函数也可以视为变量)假设没有在函数作用范围内找到就会向外查找
* 如果在全局作用域里都没有找到,报错RefrenceError 
*/ 
var x = 'xxx';
window.alert(x);
var old_alert = window.alert;
old_alert(x);

// 用全局函数覆盖
window.alert = function(){};
// 发现alert()失效了
window.alert(123);
// 发现alert()恢复了
window.alert = old_alert;
window.alert(456);

规范
由于所有全局变量都会绑定到window上,如果不同的JavaScript文件使用了相同的全局变量,就会产生冲突 ===> 如何能减少冲突?

<script>
	/**
	* 把自己的代码全部放入自己定义的唯一空间名字中,降低全局命名冲突的问题~ 
	* 因此出现了JQuery 
	*/

	// 唯一全局变量
	var WangApp = {};

	// 定义全局变量
	WangApp.name = 'Wang';
	WangApp.add = function(a, b){
		return a + b;
	}
 </script>

局部作用域 let(建议局部作用域变量都用let定义)

function fun(){
   for (let i = 0; i <100; i++) {
        console.log(i);
    }
    console.log(i+1);   // Uncaught ReferenceError: i is not defined 
}

常量 const(ES6引入的新特性)

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

4.3 方法

定义方法:方法就是把函数放在对象里面(对象由两个东西组成:属性和方法)

let wang = {
    name: 'Wang',
    birth: 1999,
    age: function(){
        // 当前年份 - 出生年份
       let now = new Date().getFullYear();
       return now - this.birth;   // this是无法指向的,只能默认指向调用他的对象
    }
}

//属性
wang.name
//方法,一定要带()
wang.age()
function getAge(){
	let now = new Date().getFullYear();
	return now - this.birth;   
}
let wang = {
    name: 'Wang',
    birth: 1999,
    age: getAge
}

/**
* wang.age()   返回结果正常
* getAge()   返回NaN   this此时指向window
*/ 

apply(在JavaScript中可以控制this的指向)

function getAge(){
	// 当前年份 - 出生年份
	let now = new Date().getFullYear();
	return now - this.birth;
}
let wang = {
	name: 'Wang',
	birth: 1999,
	age:getAge
}

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

5. 内部对象

标准对象

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

5.1 Date

基本使用

var now = new Date();
now.getFullYear();   // 年
now.getMonth();   // 月 0~11
now.getDate();   // 日
now.getDay();   // 星期几
now.getHours();   // 时
now.getMinutes();   // 分
now.getSeconds();   // 秒

now.getTime();   // 时间戳 全世界统一  1970 1.1 0:00:00 毫秒
console.log(new Date(now.getTime()));   // 将时间戳转为时间
now.toLocaleString();   // 当前时间

转换时区

now = new Date(now.getTime());
now.toLocaleString();   // 注意调用的是一个方式,不是一个属性
now.toGMTString();

5.2 JSON

早期数据传输使用的是XML文件,后来出现了JSON文件

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

在JavaScript中一切皆为对象,任何JavaScript支持的类型都可以用JSON表示;格式如下:

  • 对象都用{ };
  • 数组都用[ ];
  • 所有键值对都用kay: value

JSON字符串和JavaScript对象的转换

var user = {
	name: "wang",
	age: 23,
	sex: '男'
}
	// 对象转换为JSON字符串  {"name":"wang", "age":23, "sex":"男"}
	var jsonUser = JSON.stringify(user);
	
	// JSON字符转换为对象,参数为JSON字符串
	var object = JSON.parse('{"name":"wang", "age":23, "sex":"男"}');

JavaScript对象和JSON字符串的区别

// JavaScript对象和JSON字符串的区别
var object = {a:'hello', b:'world'};
var json = '{"a":"hello", "b":"world"}';

5.3 Ajax

  • 原生的js写法——xhr异步请求
  • jQuery封装好的方法 $(“#name”).ajax(" ")
  • axios 请求

6. 面向对象编程

6.1 原型对象

面向对象的编程语言:Java、JavaScript、C#…但其中JavaScript略有不同

  • 类:模板 原型对象
  • 对象:具体的实例
<script>
	let student = {
		name: "wang",
		age: 23,
		run: function(){	
			console.log(this.name + "run...");
		}
	};
	
   let chen = {
		name: "chen"
   };
   
	// 原型对象 __proto__
	chen.__proto__ = student;
	chen.run();
	
	let bird = {
		fly: function(){
			console.log(this.name + " fly.....");
		 }
	}
	
	chen.__proto__ = bird;
	chen.fly();
</script>

6.2 class继承(ES6引入class关键字)

  1. 定义一个类(属性,方法)
    <script>
           // 定义一个学生类
           class student{
               constructor(name){   // 构造器
                   this.name = name;
               }
               hello(){   // 方法
                   alert('hello');
               }
           }
    
    	var wang = new student("王");
    	wang.hello();
    </script>
    
  2. 继承
    <script>
    //定义一个学生的类
    class student{
    	constructor(name){
    		this.name = name;
    	}
    	hello(){
    		alert('hello');
    	}
    }
    
    class xiaoStudent extends student{
    	constructor(name, grade){
    		super(name);
    		this.grade = grade;
    	}
    	myGrade(){
    		alert("我是一名满分小学生");
    	}
    }
    
    let wang = new xiaoStudent("wang", 1);
    </script>
    

本质:查看对象原型

6.3 原型链

_proto_:
原型链原理图

7. 操作BOM对象(重点)

BOM(Browser Object Model) 是指浏览器对象模型,是用于描述对象与对象之间层次关系的模型。浏览器对象模型提供了独立于内容的、可以与浏览器窗口进行互动的对象结构。其本身由多个对象组成,其中代表浏览器窗口的window对象是BOM的顶层对象,其他对象都是该对象的子对象。

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

window(重要)

window代表浏览器窗口

window.alert()
window.innerHeight
window.innerWidth
window.outerHeight
window.outerWidth

navigator(不建议使用)

navigator封装了浏览器的信息;大多数时候,我们不会使用navigator对象,因为会被人为修改!

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

navigator.appName
navigator.appVersion
navigator.userAgent
navigator.platform

screen

screen代表屏幕尺寸

screen.width
screen.height

location(重要)

location代表当前页面的URL信息

host: "www.baidu.com"
href: "https://www.baidu.com/"
protocol:"https:"   // 协议
reload: ƒ reload()   // 方法 刷新页面
// 设置新的地址
location.assign("https//localhost:8080")

document

document代表当前页面,HTML通过DOM文档树展示

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

获取具体的文档树节点

<dl id="app">
    <dt>Java</dt>
    <dd>JavaSE</dd>
    <dd>JavaEE</dd>
</dl>

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

获取cookie

document.cookie   // 可以直接拿到cookie

劫持cookie原理

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

防止cookie被劫持,服务器端可以设置cookie: httpOnly

history(不建议使用)

history代表浏览器的历史记录

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

8. 操作DOM对象(重要 | 核心)

文档对象模型(Document Object Model,简称DOM),是W3C组织推荐的处理可扩展置标语言的标准编程接口。它是一种与平台和语言无关的应用程序接口(API),它可以动态地访问程序和脚本,更新其内容、结构和www文档的风格(HTML和XML文档是通过说明部分定义的)。文档可以进一步被处理,处理的结果可以加入到当前的页面。DOM是一种基于树的API文档,它要求在处理过程中整个文档都表示在存储器中。另外一种简单的API是基于事件的SAX,它可以用于处理很大的XML文档,由于大,所以不适合全部放在存储器中处理。

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

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

8.1 获得Dom节点

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

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
	<div id="father">
	    <h1>标题一</h1>
	    <p id="p1">p1</p>
	    <p class="p2">p2</p>
	</div>
	
	<script>
	// 获得Dom节点 / 对应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>

8.2 更新Dom节点

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
	<div id = "id1"></div>
	
	<script>
	    var id1 = document.getElementById("id1");
	</script>
</body>
</html>
// 操作文本
id1.innerText = '456';   // 修改文本的值
id1.innerHTML = '<strong>123</strong>';   // 可以解析HTML文本标签

// 操作JS
id1.style.color = 'yellow';   // 属性使用 字符串 包裹
id1.style.fontSize = '20px';   // 驼峰命名
id1.style.padding = '2em';   // 首行缩进

8.3 删除Dom节点

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

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
	<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);
		
		// 删除是一个动态的过程;
		father.removeChild(father.children[0]);
		father.removeChild(father.children[1]);
	</script>
	</body>
</html>

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

8.4 插入Dom节点

  当获得的Dom节点是空的时,通过innerHTML可以增加一个元素;但是如果这个Dom节点已经存在元素,那么增加的元素就会产生覆盖!

  • 追加
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>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>
    	   	var js = document.getElementById('js');   // 已经存在的节点
    	    var list = document.getElementById('list');
    		
    		list.appendChild(js);
    	</script>
    </body>
    </html>
    
  • 创建并插入新标签
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>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>
    	   	// 通过JS创建一个新的节点
    	   	var newP = document.createElement('p');   // 创建一个p标签
    	   	newP.id = 'newP';
    	   	newP.innerText = 'Hello,world!';
    	   	list.appendChild(newP);
    
    		// 创建一个标签节点(通过这个属性,可以设置任意的值)
    		var myScript = document.createElement('script');
    		myScript.setAttribute("type","text/javascript");
    		list.appendChild(myScript);
    		
    		// 创建一个style标签并追加在head里
    		var myStyle = document.createElement('style');   // 创建一个空的style标签
    		myStyle.setAttribute('type', 'text/css');
    		myStyle.innerHTML = 'body{background-color: chartreuse;}';   // 设置标签内容
    		document.getElementsByTagName('head')[0].appendChild(myStyle);
    		
    		// 设置标签内容
    		var body = document.getElementsByTagName('body');
    		body[0].style.background = 'red';
    	</script>
    </body>
    </html>
    
  • 插入选定标签前面 insertBefore
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>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>
    	 	var js = document.getElementById('js');
    	 	var list = document.getElementById('list');
    	 	var ee = document.getElementById('ee');
    	 	// 要包含的节点.insertBefoer(newNode, targetNode)
    		list.insertBefore(js,ee);
    	</script>
    </body>
    </html>
    

9. 操作表单(验证)

表单在网页中主要负责数据采集功能。一个表单有三个基本组成部分: 表单标签,这里面包含了处理表单数据所用CGI程序的URL以及数据提交到服务器的方法; 表单域,包含了文本框、密码框、隐藏域、多行文本框、复选框、单选框、下拉选择框和文件上传框等;表单按钮,包括提交按钮、复位按钮和一般按钮,用于将数据传送到服务器上的CGI脚本或者取消输入,还可以用表单按钮来控制其他定义了处理脚本的处理工作。

常见表单:

  • 文本框 text
  • 下拉框 <select>
  • 单选框 radio
  • 多选框 checkbox
  • 隐藏框 hidden
  • 密码框 password

9.1 表单目的

提交信息

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

9.2 提交表单

md5加密密码,表单优化

<!DOCTYPE html>
<html lang = "en">
    <head>
        <meta charset = "UTF-8">
        <title>Title</title>
        <!--MD5加密工具类-->
        <script src = "https://cdn.bootcss.com/blueimp-md5/2.10.0/js/md5.min.js"></script>
    </head>
    <body>
	<!--表单绑定提交事件
	οnsubmit= 绑定一个提交时进行检测并返回true或false的函数
	将这个结果返回给表单,使用onsubmit接收
	-->
	<form action = "https://www.baidu.com" method = "post" onsubmit = "return f()">
		<p>
			<span>用户名:</span><input type="text" id = "username" name = "username"/>
		</p>
		<p>
			<span>密码:</span><input type="password" id = "password" />
		</p>
		<input type = "hidden" id = "md5-password" name = "password"> 
	
		<!--绑定事件 onclick 被点击-->
		<button type = "submit">提交</button>
	</form>
        
	<script>
		function f(){
			alert('执行f()函数...');
			var username = document.getElementById("username");
			var pwd = document.getElementById("password");
			var md5pwd = document.getElementById("md5-password");
			// pwd.value = md5(pwd,value);   // 提交时密码会变长一瞬间
			md5pwd.value = mad5(pwd.value);   // 使用隐藏表单就不会有变长的瞬间
			// 可以校验判断表单内容,true通过提交,false阻止提交
			return false;     
		}
	</script> 
</body>
</html>

10. jQuery

jQuery是一个快速、简洁的JavaScript框架,是继Prototype之后又一个优秀的JavaScript代码库(框架)。jQuery设计的宗旨是“write Less,Do More”,即倡导写更少的代码,做更多的事情。它封装了JavaScript常用的功能代码,提供一种简便的JavaScript设计模式,优化HTML文档操作、事件处理、动画设计和Ajax交互。

核心特性:

  • 具有独特的链式语法和短小清晰的多功能接口;
  • 具有高效灵活的CSS选择器;
  • 可对CSS选择器进行扩展;
  • 拥有便捷的插件扩展机制和丰富的插件。

10.1 jQuery公式

公式:$(selector).action()

<!DOCTYPE html>
<html lang = "en">
    <head>
        <meta charset = "UTF-8">
        <title>Title</title>
        <!--
        在线引入: 
        <script src="https://cdn.bootcss.com/jquery/3.4.1/core.js"></script>
        -->
        <script src="lib/jquery-3.4.1.js"></script>
    </head>
    <body>
		<a href="" id = "test-jquery">点我</a>
        
		<script>	
			// 选择器就是css选择器
            $('#test-jquery').click(function(){
                alert('hello,jQuery!');
            });
        </script>
    </body>
</html>

10.2 jQuery选择器

文档工具站

/*原生js,选择器少,麻烦不好记*/
// 标签
document.getElementByTagName();
// id
document.getElementById();
// class
document.getElementByClassName();

// jQuery css中的选择器它全部都能用!
$('p').click();   // 标签选择器
$('#id1').click();   // id选择器
$('.class1').click();   // class选择器

10.3 jQuery事件

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

$('.class').mousedown()   // 按下
$('.class').mouseenter()
$('.class').mouseleave()
$('.class').mousemove()   // 移动
$('.class').mouseout()
$('.class').mouseover()
$('.class').mouseup()
<!DOCTYPE html>
<html lang = "en">
    <head>
        <meta charset = "UTF-8">
        <title>Title</title>
        <!--本地引入jQuery-->
        <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>

10.4 jQuery操作DOM

  • 节点文本操作
    <!DOCTYPE html>
    <html lang = "en">
    	<head>
    		<meta charset = "UTF-8">
    		<title>Title</title>
    		<!--本地引入jQuery-->
    		<script 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>
    			// document.getElementById('test-ul');   // 原生代码
    			
    			$('#test-ul li[name=python]').text();   // 获得值
    			$('#test-ul li[name=python]').text('设置值');   // 设置值
    			$('#test-ul').html();   // 获得值
    			$('#test-ul').html('<strong>123</strong>');   // 设置值
    		</script>
    	</body>
    </html>
    
  • CSS操作
    $('#test-ul li[name=python]').css({"color", "red"});
    
  • 元素的显示和隐藏(本质display:none)
    $('#test-ul li[name=python]').show();   // 显示
    $('#test-ul li[name=python]').hide();   // 隐藏 
    
  • 测试
    $(window).width();
    $(window).height();
    $('#test-ul li[name=python]').toggle();   // 切换元素的显示与隐藏
    
  • 未来ajax()
    $('#form').ajax()
    
    $.ajax({url:"test.html",context:document.body,success:function(){
    	$(this).addClass("done");
    }})
    

11. 总结

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值