【21.9.12】Javascript快速入门
1.快捷键
-
ctrl+?:快速生成网页注释<!---->
-
<em>是 </em><input id="three" type="radio" name="two" style="width:20px; height:20px; margin-right:5px;"/>
<em>否 </em><input id="fourth" type="radio" name="two" style="width:20px; height:20px; margin-right:5px;"/>
</span> </p>
2.javascript代码的书写
2.1、在html文件中的<head></head>或<body></body>用<script></script>标签写js代码(内部标签)
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<!--ctrl+?:快速生成注释-->
<!--要养成习惯,js代码和java代码一样以分号结尾-->
<script>
alert('hello world!'); //生成弹窗
</script>
</head>
<body>
</body>
</html>
2.2、另用一个文件夹存放js代码,然后在html里面引入js文件(外部引入)
----js-01.js文件
alert('hello world!');
----html文件
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<!--外部引入:注意标签要成对出现,不能使用自闭合标签<script src="..." />-->
<script src="js/js-01.js"></script>
</head>
<body>
</body>
</html>
注意:外部引入时不能使用自闭合标签,必须成对出现!!
2.3、不用在<script>标签显示定义type,也默认就是javascript类型
<script type="text/javascript"></script>
type="text/javascript",这个不用显示定义
3. 基础语法和数据类型概述
前提注意:
(1).如果在idea中写js代码的话,建议去file-->setting-->搜索“es6”,这样的话js代码会更加严谨一点!!
ES6:全称 ECMAScript 6.0 ,是 JavaScript 的下一个版本标准!

(2).javascript是严格区分大小写的!!
3.1、定义变量:js的所有变量都是用“var”来定义的,不用做类型的转换(let用来定义局部变量,const用来定义常量)。
var num=1;
var name="zhangyuzhou";
3.2、条件控制和循环结构等都和java的语法基本一样
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script>
//1.定义变量(可以在结尾处不写分号它不会报错,但这是不规范的,它在打包的时候会把所有没写分号的都浓缩成一行,这时候就会出错了!)
var score=65;
//2.条件控制
if(score>60 && score<70){
alert(score);
}else if(score>70){
alert(score);
}else{
alert("other!");
}
</script>
</head>
<body>
</body>
</html>
3.3、Number类型
js不区分小数和整数,他们都是Number类型
var s=123;
var s1=123.0;
var s2=1.123e3; //科学计数法
var s3=-99;
NaN //not a number--在控制台输出这个意味着这个变量不是数值类型
Infinity //在控制台输出这个意味着这个数是一个极大的数
3.4、字符串类型:“123”和‘123’这两种定义是等效的!
3.5、布尔值类型:true、false
3.6、逻辑运算:&&(与)、||(或)、!(非)
3.7、比较运算符(重点)
(1).使用判断等于时,用“===”来比较!!
(2).NaN这个与所有的数值都不相等,包括它自身也不相等,如:NaN===NaN;其结果为false,但它有个方法是用来判断这个数是否是NaN,如:isNaN(NaN);其结果为true;
= //赋值运算符
== //等于(类型不一样,值一样,比较时也会判断为true)
var s1=123;
var s2='123';
s1==s2; //其结果是true
=== //绝对等于(类型一样,值一样,比较时判断结果才会为true)

3.8、浮点数问题
console.log((1/3)===(1-2/3); //其结果为false
//尽量避免使用浮点数来进行运算,存在精度问题
//可以使用一个方法来判断
console.log(Math.abs(1/3-(1-2/3))<0.0000001); //其结果为true,因为去绝对值后无限接近于这个数,所以就会true
3.9、null类型
3.10、undefined类型
3.11、数组类型
java中的数组必须是相同类型的对象,而js中不需要这样,因为它的变量类型全用var来声明
var arr=[1,2,3,4,"hello",null,true]
new arr(1,2,3,4,"hello",null,true); //也可以这样定义,只不过代码可读性差,建议用上面那种
//数组读值的方法(在html中或浏览器控制台):
console.log(arr[0]); //其结果值为1
console.log(arr[7]); //数组下标越界,这时会在浏览器控制台会报一个undefined
3.12、对象类型
对象使用大括号声明{ },而数组用的是中括号[ ]。每个属性之间使用逗号隔开,最后一个不需要添加!
var Person={
name:"zhangyuzhou",
age:3,
tags:['js','java','web','...']
}
//对象读值的方法(在html中或浏览器控制台):
console.log(Person.name); //结果为zhangyuzhou
console.log(Person.tags[0]); //结果为js
4、浏览器控台使用(常用的)
4.1、Elements:扒网站、复制网站用,这里可以查看你的网页代码以及相关的css样式

4.2、Console:
(1).可以在里面写js代码

(2).可以输入“console.log(score);”,这条语句也可以写在“js代码”里面,其作用是在浏览器控制台打印输出。

4.3、Sources:当前网页的源码,可以打断点测试

4.4、Network:网络请求(里面装载着我们页面访问网络的一些重要信息)

4.5、Application:查看在浏览器保存的web的数据

5、严格检查模式strict
-
前提:idea中需要设置支持ES6语法,因为这个检查是基于ES6语法的。
-
‘use strict’; 严格检查模式,作用是预防javascript的随意性所导致产生的一些问题,它必须写在javascript代码的第一行
-
用了检查模式之后,建议都用llet来定义一些局部变量
<script>
'use strict'; //写在第一行,不然这个检查模式不生效!
let i=1;
</script>
6、数据类型详解
6.1、正常字符串我们使用单引号或双引号包裹
console.log('a') //输出 a
console.log("b") //输出 b
6.2、如果在字符串里面要用到单引号或双引号,这时我们需要用到转义字符 \ ,必须包含在字符串内!
\' //在字符串中输出 '
\n //换行
\t //tab制表符,空四格
\u4e2d //\u####,unicode字符表现形式,输出“中”字
\x41 //\x##,Acsll字符。输出“A”
6.3、多行字符串编写(es6新特性)
用tab键上面、esc键下面的引号,将多行字符串包含起来
var msg=`
你好啊
中国
我来了!`
console.log(msg);
//浏览器控制台输出样式:
你好啊
中国
我来了!
6.4、模板字符串(es6新特性)
用于拼接字符串,这里再也不用像java那样用+来拼接了!!
注意:字符串写法要用上面的多行字符串的写法来书写,并且用${ }引入字符串模板!!
let name="zhangyuzhou";
let age=3;
let msg=`你好啊,${name},我今年${age}岁了!`;
console.log(msg);
//浏览器控制台输出样式:
你好啊,zhangyuzhou,我今年3岁了!
6.5、字符串长度
var s="student";
console.log(s.length); //输出7
6.6、字符串的不可变性
注意:js中字符串可用下标来获取字符,但通过下标来改变字符串里的字符是行不通的,这就是字符串的不可变性!!
var s="student";
console.log(s[0]); //输出 s
6.7、大小写转换
var s="student";
console.log(s.toUpperCase()); //输出 STUDENT
console.log(s.toLowerCase());
//注意这些转换都不会影响原字符串的样子
6.8、获取字符串中某个字符的下标位置
var s="student";
console.log(s.indexOf(t)); //输出 1
6.9、字符串截取(用的很多!!)
它截取字符串的一部分,返回一个新数组,并不会影响原数组!
var s="student";
console.log(s.substring(1)); //输出 tudent
console.log(s.substring(1,3)); //左闭右开(含头不含尾)
7、数组类型详解
7.1、Array元素可以包含任意的数据类型
var arr=[1,2,3,"women",true]; //通过下标来取值和赋值
7.2、数组长度
注意:假如给arr.length赋值,数组大小就会发生变化,多余的空间被定义为undefined;如果赋值过小的话,元素就会丢失!!
var arr=[1,2,3,"women",true];
console.log(arr.length(10)); //输出:[1, 2, 3, 'women', true, empty × 5]
console.log(arr.length(2)); //输出:[1, 2]
7.3、通过元素获得下标索引
注意:字符串的1和数字1是不一样的!!
var arr=[1,2,3,"1","2","3"];
console.log(arr.indexOf(2)); //输出 1
console.log(arr.indexOf("1")); //输出 3
7.4、数组的截取
它截取Array的一部分,返回一个新数组,类似于String中的substring
var arr=[1,2,3,"women",true];
console.log(arr.slice(2)); //输出 [3, 'women', true]
console.log(arr.slice(1,4)); //输出 [2, 3, 'women'] 含头不含尾
7.5、push()和pop()
push() : 把元素依次压入到数组尾部
pop() : 把元素依次从数组尾部取出
var arr=[1,2,3,"women",true];
console.log(arr.push(4,5,"hello")); //输出 [1, 2, 3, 'women', true, 4, 5, 'hello']
console.log(arr.pop()); //输出 hello 从尾部依次弹出元素
7.6、unshift()和shift()
unshift() : 把元素压入到数组头部
shift() : 把元素依次从数组头部弹出
var arr=[1,2,3];
console.log(arr.unshift(-1,-2,"world"));
//输出 [-1, -2, 'world', 1, 2, 3]
console.log(arr.shift()); //输出 -1 从头部依次弹出元素
7.7、排序
var s=["B","c","A"];
console.log(s.sort()); //输出 ['A', 'B', 'c']
7.8、元素反转
var s=["C","B","A"];
console.log(s.reverse()); //输出 ['A', 'B', 'c']
7.9、数组拼接
注意:concat()并没有修改数组,只是返回了个新数组!!
var s=["B","c","A"];
console.log(s.concat([1,2,3]); //输出 ['B', 'c', 'A', 1, 2, 3]
7.10、连接符join
打印拼接数组,使用特定的字符串来连接数组元素
var s=["B","c","A"];
console.log(s.join("-")); //输出 B-c-A 不会改变原来的数组
7.10、多维数组
var str=[[1,2],[3,4],["5","6"]];
console.log(str[0][1]); //输出 2
console.log(str[2][0]); //输出 ‘5’
8、对象类型
js中的对象,{……}表示一个对象,用键值对来描述属性,多个属性之间用“,”隔开,最后一个属性不加逗号!!
var person={
name:"zhangyuzhou",
grade:2,
age:18,
school:"lingnan"
}
注意:js中的所有键都是字符串,值可以是任意类型!!
8.1、给对象赋值
person.name="test";
console.log(person.name); //输出 test,这时原来对象的名字就会被修改了
8.2、使用一个不存在的对象属性,它不会报错,只会提示undefined
person.hahah; //输出 undefined
8.3、能动态的删减属性,通过delete删除对象属性
delete.person.name; //输出 true,此时person对象中已没有name这个属性
8.4、动态增加属性,直接给新的属性添加值即可!
person.haha="hahahha"; //输出 hahahha,此时person里就有了haha这个属性
8.5、判断属性值是否在这个对象中,用XXXX in XXXX
"age" in person; //注意对象中的键都是字符串,输出 true
"toString" in person; //true ,in会检测person所继承的所有属性,toString属性就在这里面
8.6、判断这个属性是否是这个对象自身拥有的,使用hasOwnProperty()
person.hasOwnProperty("age"); //输出 true
9、流程控制
9.1、if判断
9.2、while循环和do while循环
9.3、for循环
for(let i=0;i<100;i++){
console.log(i);
}
注意:以上都和java的一样所以不做过多的解释!!
9.4、forEach循环(5.1特性)
涉及到函数
var age=[12.3,44,56,33,23,45];
age.forEach(function(value){
console.log(value); //value就是每次从数组中取出来的值
})
9.5、forin循环
var age=[12.3,44,56,33,23,45];
for(var num in age){
console.log(num); //输出每个元素的下标 0 1 2 3 4 5
console.log(age[num]); //输出数组中的每个元素 12.3 44 56 33 23 45
}
9.6、forof循环(相当于iterator迭代器来遍历迭代!!)
//相当于Java中增强for循环
var age=[12.3,44,56,33,23,45];
for(var num of age){
console.log(num);
//输出数组中的每个元素 12.3 44 56 33 23 45
}
10、Map和Set(Es6新特性)
10.1、Map
//按键值对的形式往Map里面存储
var map=new Map([['Tom',100],['jack',90],['haha',80]]);
var name=map.get('Tom'); //通过key来获取相应的值
map.set('admin',1345); //向map集合里面加值
map.set("Tom",[100,200,300,400]) //一个key能对应着一个数组
//利用iterator来遍历Map
for(let x of map){
console.log(x);
}
/*输出
['Tom', 100]
['jack', 90]
['haha', 80]
*/
map.delete("Tom"); //通过key进行删除
console.log(name); //输出 100
10.2、Set(无序不重复的集合,即有重复的元素会去重!)
var set =new Set([3,1,1,1,1]); //输出 {3, 1}
set.add(2); //向set加入一个2 输出 {3, 1, 2}
//利用iterator来遍历Set
for(let x of set){
console.log(x);
}
//输出 3 1 2
set.delete(2); //删除2这个元素 输出 true
console.log(set.has(3)); //判断set中是否有3这个元素 输出 true
11、函数
11.1、定义函数
注意:一旦执行return,代表函数的结束,返回结果;如果没有执行return,函数执行完时也会返回结果,结果为NAN !!
//方式一:有名字的函数(后端人员常用)
function abs(x){
if(x>=0){
return x;
/*return
x; 不能换行写return,因为它在执行时会给return后面自动加上一个分号,相当于返回一个null*/
}else{
return -x;
}
}
//方式二:匿名函数(前端人员常用),可以把结果赋值给abs,且通过abs来调用函数!!
var abs=function(x){
if(x>=0){
return x;
}else{
return -x;
}
}
11.2、参数问题
注意:Javascript可以传递任意个参数,也可以不传递参数,若函数是有参时,不传递参数就会返回 NaN!!
//问题一:假设传进来的参数不是我想要的数据类型,这样要如何规避?解决方法:手动判断抛出异常!!
var abs=function(x){
if(typeof x!=='number'){ //如果x的类型不是number数字类型
throw "NOt a Number!" //手动抛出异常
}
if(x>=0){
return x;
}else{
return -x;
}
}
//调用函数
abs(d); //输出 Uncaught NOt a Number!
//问题二:如何解决多个参数问题? 解决方法:利用arguments关键字(包含着所有的传递参数)和rest数组(存储除了函数要用到的参数外的所有传递参数)
var abs=function(x){
console.log("x->"+x); //先输出这个函数想要的参数
for(var i=0;i<arguments.length;i++){
console.log(arguments[i]);
}
//arguments代表传递进来的所有参数,是一个数组
if(x>=0){
return x;
}else{
return -x;
}
}
//测试调用函数
abs(1,2,3,4,5,6); //输出 x->1 1 2 3 4 5 6
//利用rest数组存储多余的参数,rest只能写在最后面,前面必须用...来标识!!
function aaa(x,
11.3、变量的作用域
注意:以下的解释都是在没有严格检查模式下进行的
(1).假设在函数体中声明变量,则在函数体外不能使用
function aa(){
var x=1;
x=x+1;
}
x=x+2; //执行时报错:Uncaught ReferenceError: x is not defined
(2).如果两个函数使用了相同的变量名,只要还在函数内部就不冲突
function aa(){
var x=1;
x=x+1;
}
function bb(){
var x=2;
x=x+1;
}
//这两个x的使用不会有冲突!
(3).内部函数可以调用外部函数的变量,反之则不行!
function aa(){
var x=1;
function bb(){
var y=x+1;
console.log(y); //输出 2
}
bb();
var z=y+1; //报错 Uncaught ReferenceError: y is not defined
}
(4).内部函数变量和外部函数变量重名时,函数查找变量会先从自身开始由内向外查找,如果在外部有存在相同的变量,则内部函数会自动屏蔽掉外部函数的变量!!
function aa(){
var x=1;
function bb(){
var x=2;
var y=x+1; //这里的x只会等于2,不会等于1
console.log(y); //输出 3
}
bb();
console.log("此时的x为"+x); //输出 1
}
(5).提升变量的作用域
js在执行引擎时,自动提升y的声明,但是不会提升y的赋值。要养成规范,所有变量的定义都放在函数的头部,不要乱放,便于代码的维护
function aa(){
// var y; 2.经引擎提升之后,y的作用范围已经扩大到这了
var x="1";
x=x+y; //1.虽然y在这里才出现,但js引擎已经提升了它的声明,将其放到了函数的头部
console.log("此时x的值为"+x); //输出 此时x的值为1undefined
}
(6).全局变量
-
定义在函数外面!
var x="您好!"
function aa(){
console.log(x); //输出 您好!
}
var bb=function(){
console.log("由匿名函数进行打印:"+x); //输出 由匿名函数进行打印:您好!
}
-
默认所有的全局变量都会自动被绑定在window对象下!
js实际上只有一个全局作用域就是window,任何变量(函数也可以视为变量),假设没有在函数的作用范围内找到,就会向外查找,如果在全局作用域内都没有找到,就会报错 Uncaught ReferenceError: a is not defined
var s="您好!";
alert(s);
window.alert(s);
//会跳出两次提示框,这说明了alert()函数本身也是一个window变量(函数) -
规范:由于我们定义的所有全局变量都会被绑定到全局作用域window下,如果在不同的js文件使用了相同的全局变量就会引起冲突!!怎样才能减少冲突呢?--->我们自己定义一个全局作用域来存放全局变量就行了!
var zhangyuzhou={}; //定义一个空对象,和window对象一样作用,存放我们定义的全局变量,从而实现降低全局命名冲突的问题!
//定义全局变量或函数,这些就会存储到我们定义的全局对象里去
zhangyuzhou.name="yuzhou";
var name="shansan"; //这个存到window对象下
zhangyuzhou.add=function(a,b){
return a+b;
}
console.log(name); //输出 shansan
console.log(zhangyuzhou.name); //输出 yuzhou
(7).局部变量
建议都用let来定义局部作用域的变量
```js
for(let i=0;i<10;i++){
console.log(i); //i只在这个for循环里有效!
}
console.log(i); //报错 Uncaught ReferenceError: i is not defined
```
(8).常量(es6新特性)
在es6引入了常量关键字const
const PI=3.14;
console.log(PI); //输出 3.14
PI="123"; //报错 Uncaught TypeError: Assignment to constant variable.(常量不能再做修改了!!)
12、方法
方法就是把函数放在对象里面。因为对象只有两个东西:属性和方法
//定义方法的方式一:
var zhangyuzhou={
name:"小明",
birth:2020,
//方法
age:function(){
var now =new Date().getFullYear(); //2021年
return now-this.birth;
}
}
//测试方法的调用,一定要带括号!!
zhangyuzhou.age(); //输出 1
//定义方法的方式二:
function getAge(){
var now =new Date().getFullYear(); //2021年
return now-this.birth; //这个this.birth要结合zhangyuzhou这个对象才会生效,因为此时此刻getAge函数属于window对象了。你如果直接getAge()的话会报错的,因为没有this.birth这个值!!
}
var zhangyuzhou={
name:"小明",
birth:2020,
//方法
age:getAge //把函数分离出去
}
//测试方法的调用--结合zhangyuhzou这个对象来调,里面的this.birth才会有值
zhangyuzhou.age(); //输出 1
//getAge(); 输出 NaN
//定义方法的方式三 (运用每个函数都拥有的apply()方法):
function getAge(){
var now =new Date().getFullYear(); //2021年
return now-this.birth;
}
var zhangyuzhou={
name:"小明",
birth:2020,
//方法
age:getAge //把函数分离出去
}
//测试方法的调用
getAge.apply(zhangyuzhou,[]); //this指向了zhangyuzhou对象,参数为[]空参!! 输出 1
13、内部对象
13.1、标准对象
typeof 123
'number'
typeof "123"
'string'
typeof true
'boolean'
typeof NaN
'number'
typeof []
'object'
typeof {}
'object'
typeof Math.abs
'function'
typeof undefined
'undefined'
13.2、Date对象的基本方法
var now=new Date(); //Wed Sep 15 2021 20:33:22 GMT+0800 (中国标准时间)
now.getFullYear(); //年
now.getMonth(); //月 0-->11
now.getDate(); //日
now.getDay(); //星期几
now.getHours(); //时
now.getMinutes(); //分
now.getSeconds(); //秒
now.getTime(); //时间戳 全世界唯一,从1970年1.1 00:00开始计算毫秒数
//将时间戳转成时间,这个才是大家都一样的时间
console.log(new Date(1631709384011));
13.3、时间转换
var now2=new Date(); //获取当前时间
now2.toLocaleString(); //转成本地时间 '2021/9/15 下午8:47:06'
13.4、JSON
(1).
(2). 简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。
(3). 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。
在js中一切皆为对象,任何js支持的数据类型都可以用JSON来表示:
格式:
对象都用{ }
数组都用[ ]
所有键值对都是用key:value
(4).JSON字符串和js对象的转换
JSON的两个方法:对象-->json: stringify()
json---->对象:parse() 解释
var user={
name:"zhangyuzhou",
age:3,
sex:"男"
}
//对象转化为json字符串
var json = JSON.stringify(user);
//json字符串:'{"name":"zhangyuzhou","age":3,"sex":"男"}'
var obj=JSON.parse('{"name":"zhangyuzhou","age":3,"sex":"男"}');
注意:JSON的key都要用“ ”括起来,并且返回的是一个字符串,而对象的key不用用“ ”括起来,并且在浏览器控制台能展开!!
14、面向对象
14.1、面向对象语言
javascript、java、c#……这些都是面向对象语言,其特点为
类:模板
对象:具体的实例
在javascript中有原型:
原型:相当于继承一个父类,就是一个模板
对象
14.2、原型
var student={
name:"zhangyuzhou",
age:3,
run:function(){
console.log(this.name+"running……");
}
}
var xiaoming={
name:"xiaoming"
}
xiaoming.__proto__=student; //这时xiaoming就继承了student的所有东西,并且它重写了name属性
//测试
console.log(xiaoming.run); //输出 xiaomingrunning……
14.3、class继承
class关键字是在es6才引入的!!
//原生方法(这种方法在es6就不用了,用class来代替了,但原理还是这个!!)
function student(name){
this.name=name;
}
//给student新增一个方法
student.prototype.hello=function(){
//向student的原型增加一个hello()方法
alert("hello!");
}
class继承
//定义一个学生的类,这就是一个规范的模板!
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"); //调用student的构造器传“xiaoming”过去!!
var xiaohong=new xiaostudent("xiaohong");
//测试
console.log("xiaoming.name"); //输出 xiaoming
xiaoming.hello(); //弹出框,弹出“hello!”
14.4、原型链

无终止循环,在浏览器控制台一直点是点不完的,进入object之后就一直在那循环了!!
15、操作BOM对象(重点)
15.1、浏览器介绍
-
javascript和浏览器关系:javascript的诞生就是为了能够让它在浏览器中运行!!
-
BOM:(Browser Object Model)浏览器对象模型
-
流行浏览器(内核)原生:
-
IE6-11
-
Chrome
-
Safari
-
FireFox
-
-
第三方浏览器(这些浏览器是以上面的浏览器为内核,可以随时更改)
-
QQ浏览器
-
360浏览器
-
15.2、window对象
window代表浏览器窗口(全局作用域)
window.alert("您好!");
undefined
window.innerHeight //就是内置窗口的高度,可以调整
//输出 722
window.innerWidth //可以调整
//输出 982
//上面这两个内置高度,我们可以获取来做一下判断!!
window.outerHeight //从网页地址栏到你电脑的任务栏的高度
//输出 824
window.outerWidth
//输出 1536
15.3、Navigator类(不建议使用)
Navigator类,它的navigator对象封装了浏览器的信息
navigator.appName //当前浏览器的应用名
//输出 'Netscape'
navigator.appVersion //当前浏览器的版本号-->这个浏览器属于 电脑上的,用了谷歌浏览器的内核等等信息
//输出 '5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36'
navigator.userAgent //用户当前的系统,浏览器使用的内核等等
//输出 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36'
navigator.platform //获得系统的版本
//输出 'Win32'
作用:可以检测你玩网页游戏时是使用电脑还是手机,之后再跳到适应的页面
大多时候,我们不会使用navigator对象,因为会被人为地修改,不安全性极高!!
15.3、screen对象
screen对象代表屏幕尺寸!
screen.height
//输出 864
screen.width
//输出 1536
15.4、lacation对象(重要)
location代表当前页面的URL信息
host: "www.baidu.com" //主机
href: "https://www.baidu.com/?tn=40020637_7_oem_dg" //网页链接
protocol: "https:" //协议
location.reload(); //重新加载网页
location.assign("https://www.bilibili.com/video/BV1JJ41177di?p=19"); //设置新的定位,当你进去你的网页时,会被重定向到上面的网页地址
15.5、document对象
document代表当前的页面,HTML DOM文档树
//1.网页地址栏的名字会被改变
document.title="zhanguzhou";
//2.获取具体的文档树节点(可以动态的修改网页)
<dl id="app">
<dt>java</dt>
<dd>javase</dd>
<dd>javaEE</dd>
</dl>
<script>
var d1=document.getElementById("app"); //会在浏览器控制台输出id为app的结点里的所有信息
</script>
//3.获取coolie
document.cookie
//输出 'BIDUPSID=075D96B84D787E6D8E4817849DF17510; PSTM=16
在服务器端可以设置cookie:httpOnly,这样就可以保证你的cookie的安全性,不被别人随便获取,即劫持你的cookie!!
15.6、history对象(不建议使用)
history代表浏览器历史记录
history.back(); //网页后退一页
history.forward(); //网页前进一页
16、操作DOM对象(重点)
16.1、核心概念
-
DOM:文档对象模型
-
浏览器网页就是一个Dom树形结构!(可以获得树的节点从而对树节点进行操作!!)
![image-20210916093301262]()
上面这个就是Dom树,就是我们在网页所使用到的各类标签!!
-
相关操作
-
更新:更新Dom节点
-
遍历Dom节点:得到Dom节点
-
删除:删除一个Dom节点
-
添加:添加一个新的节点
-
要操作一个Dom节点,就必须要先获取这个Dom节点!!
16.2、获得Dom节点
document代表的就是Dom树,包含树的所有结点信息!!
<div id="father">
<h1>标题1</h1>
<p id="p1">p1</p>
<p class="p2">p2</p>
</div>
<script>
//对应css选择器
var h1=document.getElementsByTagName("h1");//根据标签名获取节点
var p1=document.getElementById("p1"); //根据id
var p2=document.getElementsByClassName("p2"); //根据class
var father=document.getElementById("father");
var child=father.children; //获取父节点下的所有子节点
</script>
这是原生的代码,之后我们尽量都是用jQuery()来进行操作!!
16.3、更新节点
//先设置一个节点供下面测试使用
<div id="id1">
</div>
<script>
var id1=document.getElementById('id1');
</script>
-
操作文本
id1.innerText="456"; //修改文本的值 之前的div标签中是没有值的,现在这个标签在网页显示时会出现“456”.
id1.innerHTML="<strong>123</strong>"; //插入超文本(标签)并且赋值 -
操作css
id1.style.color="yellow"; //设置标签里文字的颜色为黄色
id1.style.fontSize="200px"; //设置文字大小
//注意:在css时字体大小是font-size有横线的,但通过操作Dom节点时所有横向都会变成驼峰命名法:fontSize
id1.style.padding="2em"; //设置空两格注意:其他的css操作也是如此,这里就不列举那么多了!!
16.4、删除节点
删除节点的步骤:先获取父节点,然后再通过父节点来移除自己!!
<div id="father">
<h1>标题1</h1>
<p id="p1">p1</p>
<p class="p2">p2</p>
</div>
<script>
//方式一
var self=document.getElementsById("p1");
//获取父节点
var father=p1.parentElement; //获取p1的父节点
father.removeChild(self); //在网页上就删除了这个节点
//方式二、
var child=father.children; //获取父节点下的所有子节点,这里可以通过数组下标的形式来获取相应的子节点
father.removeChild(child[0]); //删除了<h1>节点里的内容
</script>
注意:用方式二删除时,child数组的下标是在动态变化的。删除节点的时候要注意!!(比如:你有3个节点,删了一个,那么剩下两个节点下标就会从0重新开始排序)
16.5、增加节点
-
我们获得了某个Dom节点,如果这个节点是空的,我们可以通过innerText或innerHTML来增加元素,但如果这个节点已经有元素了,我们就不用这个了,因为它会覆盖掉原来的所有元素!!
-
追加节点(已存在的节点)
<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>
-
创建一个新节点
-
appendChild()
-
setAttribute()
<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 list=document.getElementById("list"); //在这个节点进行插入
var newP=document.createElement("p"); //创建一个p标签
newP.id="new1"; //设置标签的名字
newP.innerText="hello zhagnyuzhou"; //向标签内插入文字
list.appendChild(newP); //向list节点插入新建节点newP
//方式二
var myscript=document.createElement("script"); //创建一个script标签
myscript.setAttribute("type","text/javascript"); //设置属性,相当于type=“text/javascript”
myscript.setAttribute("id","script"); //等价id=“myscript”
list.appendChild(myscript); //将节点加进去
</script> -
-
插入在节点前面
//插在节点前面
var ee=document.getElementById("ee");
var js=document.getElementById("js");
var list=document.getElementById("list");
//在ee节点的前面插入js节点
list.insertBefore(js,ee);
17、操作表单(涉及到验证问题)
17.1、表单<form>
-
文本框 text
-
下拉框 <select>
-
单选框 radion
-
多选框 checkbox
-
隐藏域 hidden
-
密码框 password
-
…………
表单的目的就是提交数据!!
17.2、获取和修改输入框的值
<form action="post">
<span>用户名:</span><input type="text" id="username">
</form>
<script>
//获取输入框的值
var input_text=document.getElementById("username");
//在浏览器控制台通过输入input_text.value;获取值
//在浏览器控制台修改输入框的值---直接赋值
input_text="123456";
17.3、单选框
-
获取单选框默认的值(可以通过操作节点来获取)
<form action="post">
<span>性别:</span>
<input type="radio" name="sex" value="男" id="boy">男
<input type="radio" name="sex" value="女" id="gril">女
</p>
</form>
<script>
var boy_radio=document.getElementById("boy");
var gril_radio=document.getElementById("gril")
//在浏览器控制条通过输入下列语句获得:
boy_radio.value; //输出 男
gril_radio.value; //输出 女
</script>
-
查看单选框是否被选中(可以拿来做判断条件!!)
boy_radio.checked; //true代表选中,false代表没选中,
//也可以手动赋值选中
boy_radio.checked=true;
17.4、提交表单以及用md5加密
-
input提交
<form action="#" method="post">
<p>
<span>用户名:</span><input type="text" id="username" name="username">
</p>
<!--加了name属性,抓包时才能抓住数据!-->
<p>
<span>密码:</span><input type="password" id="password" name="password">
</p>
<input type="submit">
</form> -
按钮绑定事件提交(不能过滤)
action代表提交后跳转的页面地址,method代表提交的方式
<form action="#" method="post">
<p>
<span>用户名:</span><input type="text" id="username" name="username">
</p>
<!--加了name属性,抓包时才能抓住数据!-->
<p>
<span>密码:</span><input type="password" id="password" name="password">
</p>
<!--提交方式二:给button绑定事件onclick,校验密码格式等-->
<button type="button" onclick="aaa()">提交</button>
</form>
<script>
function aaa(){
alert("您已成功提交!");
}
</script> -
表单绑定事件提交(有过滤功能)
onsubmit="return aaa():如果返回的是false,那么提交就会失败。注意要加上return !!
onsubmit:提交检测的函数
<form action="#" method="post" onsubmit="return aaa()>
<!--onsubmit="return aaa():如果返回的是false,那么提交就会失败。注意要加上return-->
<p>
<span>用户名:</span><input type="text" id="username" name="username">
</p>
<!--加了name属性,抓包时才能抓住数据!-->
<p>
<span>密码:</span><input type="password" id="password" name="password">
</p>
<!--<input type="submit">提交方式一-->
<button type="button">提交</button>
</form>
<script>
function aaa(){
alert("您已成功提交!");
return false; //false返回到表单就不能提交了
}
</script> -
md5加密的两种形式:
-
//先导入加密包:(在线的)你也可以去下载离线的
<script src="https://cdn.bootcss.com/blueimp-md5/2.10.0/js/md5.min.js"></script> -
方式一:点提交后,密码框里密码长度瞬间变长,抓包时密码已经被加密看不懂了
-
方式二:优化:点提交后,密码框里的密码长度保持不变,抓包时密码已经被加密看不懂了
因为第一种一看就知道密码用了md5来进行加密了!!
-
<form action="#" method="post">
<p>
<span>用户名:</span><input type="text" id="username" name="username">
</p>
<!--加了name属性,抓包时才能抓住数据!-->
<!--加密方式一-->
<!-- <p>
<span>密码:</span><input type="password" id="password" name="password">
</p>
-->
//<!--加密方式二:隐藏了密码再提交-->
<p>
<span>密码:</span><input type="password" id="password">
</p>
<input type="hidden" id="md5_pwd" name="password">
<!----------------------------------------------------------------------------->
<button type="button" onclick="aaa()">提交</button>
</form>
<script>
function aaa(){
alert("您已成功提交!");
var uname=document.getElementById("username");
var pwd=document.getElementById("password");
console.log(uname.value);
//md5算法加密方式一
//pwd.value=md5(pwd.value); //直接加密之后,点提交的一瞬间,密码框里的密码被加长,而且抓包时,密码已被加密看不懂了!
//加密第二种方式
var md5pwd=document.getElementById("md5_pwd");
md5pwd.value=md5(pwd.value);
console.log(pwd.value);
}
</script>
18、jQuery
18.1、jQuery库
-
jQuery库里面存着大量的javascript函数!!
-
在线引入:直接上网搜cdn jQuery会有很多在线链接的
<head>
<meta charset="UTF-8">
<title>Title</title>
<!--在线引入jQuery-->
<script src="http://apps.bdimg.com/libs/jquery/1.9.1/jquery.min.js"></script>
</head> -
离线引入:搜“jQuery”去到它的官网,点“Download jQuery”进去,按自己的需求去进行下载相应的版本就行了,没什么区别的,就是占的存储空间不同而已,但也相差不大!!

-
公式:${ selector }.action( )
selector代表的是选择器,选中了某个选择器,action代表所需要用到的事件函数,即在这个选择器上进行怎样的操作!!
id选择器就用#
-
$('p').click(); //标签选择器
-
$('#id1').click(); //id选择器
-
$('.class1').click(); //class选择器
-
<script>
//js写法
// var aa=document.getElementById("id");
// aa.click();
//jquery写法
$('#test-jquery').click(function(){
alert('hello!');
})
</script>
18.2、事件
鼠标事件、键盘事件、其他事件
-
鼠标事件
![image-20210916223223615]()
<head>
<script src="https://code.jquery.com/jquery-3.6.0.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){
//e接收了鼠标的坐标返回值 $('#mouseMove').text('x:'+e.pageX+'y:'+e.pageY);
})
})
</script>
</body>
18.3、操作Dom
<ul id="test-u1">
<li class="js">javascript</li>
<li name="python">python</li>
</ul>
<script>
//原js写法
//document.getElementById(' ')
//jquery写法
//因为在“test-u1”还有li,所以要利用属性精确定位
$('#test-u1 li[name=python]').text(); //获取值
$('#test-u1 li[name=python]').text('123456'); //修改值
$('#test-u1').html(); //获取标签
$('#test-u1').html('<strong>123</strong>') //加入标签
</script>
18.4、操作css
$('#test-u1 li[name=python]').css({"color":"red"}); //可以用花括号加多个键值对来设置多个css样式
18.5、元素的显示与隐藏
$('#test-u1 li[name=python]').show(); //显示元素
$('#test-u1 li[name=python]').hide(); //隐藏元素 等价于display:none;
19、前端训练
-
源码之家---->看jQuery源码,看游戏源码
-
扒网站---->巩固HTML、CSS
-
提升自己页面审美---->ant、element、layer
-



浙公网安备 33010602011771号